"bash -c"で実行されるコマンドに引数を与える方法

"bash -c"で実行されるコマンドに引数を与える方法

私の投稿の一つ(忘れた)に対する誰かの返事で私は覚えていました。

bash -c "somecommand \$1" bash $somevariable

変える

bash -c "somecommand $somevariable"

findutilsのマニュアルでこの例をもう一度参照してください。

find -exec sh -c 'something "$@"' sh {} \;

変える

find -exec sh -c "something {}" \;

どちらの例も、他のソリューションよりも最初のソリューションを使用するのと同じ理由がありますか?それでは何ですか?

促すこの例では、コマンドインジェクションが機能しないのはなぜですか? そしてこれはbashでのコマンド注入の唯一の形式ですか?

答え1

はい。どちらの例も引数をbash -corsh -cに渡す必要があります。議論(引用可能)コードに文字列として挿入する代わりに。

インラインシェルスクリプトに文字列としてコードを挿入すると、挿入された文字列が制御構造を超えてランダムなコマンドを実行したり、シェルがテキストとして扱われる必要がある拡張を実行できます。

例:

bash -c "echo $arg"

$arg文字列に設定します; ls -la

例では、findファイル名またはパス名が挿入されたシェルスクリプトの構文を破ったり、制御フローを変更して潜在的に望ましくない結果をもたらす場合に問題が発生します。

追加参考資料:

関連情報