シェルスクリプトにコマンドライン引数を渡す間に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

おすすめ記事