シェルスクリプトにコマンドライン引数を渡す間にI / Oエラーが発生しました。

シェルスクリプトにコマンドライン引数を渡す間にI / Oエラーが発生しました。

bright.shディスプレイの明るさを手動で調整するために、1行のbashスクリプト()を作成しました。

sudo sh -c 'echo "$1" > /sys/class/backlight/intel_backlight/brightness'

ここでは、端末から輝度値を取得し、echoコマンドにパラメータとして渡します。ただし、スクリプトを実行すると、次の I/O エラーが発生します。

sh: echo: I/O error

端末でパラメータを正常に渡し、明るさを手動で制御するにはどうすればよいですか?使用例は次のとおりです。

./bright.sh 230

答え1

$1スクリプト内のsh -c最初のコマンドライン引数に展開されます。それスクリプトを最初のコマンドライン引数として呼び出すのではなく、スクリプトを使用します(sh -cスクリプトが一重引用符で囲まれているため)。

$1正しい解決策は、呼び出しスクリプトの値をsudoスクリプトに注入するのではなく(これはあらゆる種類の興味深いコード注入の脆弱性を可能にします)、$1それを外部スクリプトから内部スクリプトに渡すことです。

sudo sh -c 'printf "%s\n" "$1" > /sys/class/backlight/intel_backlight/brightness' sh "$1"

またはsudo teerootとしてファイルに書き込みます。

printf '%s\n' "$1" | sudo tee /sys/class/backlight/intel_backlight/brightness >/dev/null

ファイルに印刷されたデータが常に整数の場合は%d代わりに。printf%s

答え2

外部に一重引用符を入れてこの問題を解決できます$1。これが最善のアプローチであるかどうかはわかりません。

作業スクリプトは次のようになります。

sudo sh -c 'echo '$1' > /sys/class/backlight/intel_backlight/brightness'

答え3

はい、質問を見ました(回答https://unix.stackexchange.com/a/481424/4778)、しかしまだ引用しなければなりません$1(もしそうであれば)。そしてインタプリタ(#!…)を指定することを忘れないでください。

«ソリューションが正しく参照されておらず、セキュリティバグがあったため削除されました。 @Kusalanandaの回答を参照してください。 »

文字列を一緒にタッチして接続できます。二重引用符は $expression を拡張しますが、一重引用符は拡張しません。この場合、残りのテキストには$sがないため差がなく、すべて二重引用符で囲むことができます。

関連情報