7

/etc/sudoers にこれがあります:

%wheel myhostname =NOPASSWD: /bin/bash -c "echo foo && echo bar", \
                             /bin/bash -c echo foo

sudo /bin/bash -c echo fooパスワードの入力を求められずに実行できます。

ただし、sudo /bin/bash -c "echo foo && echo bar"引き続きパスワードを要求します。

これに多くのバリエーションを試しましたが、何も受け入れられていません。

エラーはどこにありますか?/ -c の後に複数のコマンドを許可するにはどうすればよいですか?

4

2 に答える 2

5

問題は、シェルが引数を解釈する方法にあります。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(または任意のプログラムが)どのコマンドが入力されたかを正確に知る方法はなく、実行目的でシェルによって変換されるものだけです。

于 2014-09-13T07:41:55.513 に答える
3

少なくとも私のsudo(OS X 10.9、sudo 1.7.10p7)では、引用符は/etc/sudoers文字どおりに一致します。つまり、指定

/bin/bash -c "echo foo && echo bar"

ユーザーが文字通り実行する必要があることを意味します

sudo /bin/bash -c '"echo foo && echo bar"'

つまり、引用符をプログラムに渡す必要があります。

したがって、/etc/sudoers で引用符を削除するだけです。

%wheel myhostname =NOPASSWD: /bin/bash -c echo foo && echo bar

これは奇妙に見えますが、私のマシンでは完全に機能します。ユーザーは/bin/bash -c "echo foo && echo bar"パスワードなしで実行できます。man sudoersによると、エスケープする必要がある唯一の文字は であるため、これは機能します',', ':', '=' and '\'

これは、sudoが基本的にすべてのコマンドライン引数をスペースのみで連結して一致を判断していることを意味することに注意してください。ユーザーは も実行でき/bin/bash -c "echo foo" "&&" "echo bar"ます。したがって、どの引数も個別にセキュリティ リスクにならないように注意する必要があります (たとえばfoo&&barは、コンピュータを悪用するために使用できるものではありません)。

于 2014-09-13T15:31:14.210 に答える