問題は、シェルが引数を解釈する方法にあります。bash を使用している場合 (他のほとんどのシェルは同じように動作します)、次のコマンドを入力します。
sudo /bin/bash -c "echo foo && echo bar"
sudo
その後のすべてを引数として呼び出されます。ただし、シェルは各引数を に渡す前に処理しsudo
ます。それが行うことの 1 つは、引用符で囲まれた引数を囲む引用符を削除することです。したがって、値sudo
として取得される引数argv
は、次のような配列になります (1 行に 1 つの引数)。
/bin/bash
-c
echo foo && echo bar
sudo
これらをスペースと組み合わせて、それを sudoers ファイル内のコマンドと比較します (ワイルドカードの置換などを行うため、実際にはこれよりも少し複雑です)。したがって、権限を確認する目的で実際に実行されているコマンドは次のとおりです。
/bin/bash -c echo foo && echo bar
そのコマンドを sudoers ファイルに入れると、入力時にパスワードの入力を求められません
sudo /bin/bash -c "echo foo && echo bar"
ただし、これらのコマンドまたはその他のコマンドを入力しても、パスワードの入力を求められません。
sudo /bin/bash "-c echo foo && echo bar"
sudo /bin/bash "-c echo" foo "&& echo" bar
sudo /bin/bash -c echo "foo && echo" bar
一般に、私の知る限り、sudo
(または任意のプログラムが)どのコマンドが入力されたかを正確に知る方法はなく、実行目的でシェルによって変換されるものだけです。