0

重複の可能性:
SUDO を必要とする php からシェル スクリプトを呼び出す方法は?

(Ubuntuサーバーで)実行するためにSU権限が必要なPythonファイルがあります。
方法がわかりません。

次のように PHP から実行します。

$command = "python /path/to/my/file.py params";
$temp = exec($command, $output);
var_dump($output);

動作していません。(非 root では Xvfb の起動に失敗します)

試した:

$command = "echo 'root_pwd' | sudo -S python /program.py params"
...

うまくいきませんでした。

試した: /etc/sudoers を編集:

Cmnd_Alias BUNDLE = /path/to/myprog.py
nobody  ALL=(ALL) NOPASSWD:BUNDLE

その後:

$command = "sudo -u nobody python myprog.py params";
...

うまくいきませんでした。
「うまくいかなかった」と言うとき - つまり、var_dump($output) が空の配列を返し、サーバー上で成功した結果が得られない (myprog.py はサーバー上でファイルを生成する必要があります)、またはページが数分間読み込まれるまで単純に読み込まれることを意味します。タイムアウトします。

基本的な .py ファイル (特別な権限を必要としない) は機能します。

助けてください。

PS: .Py ファイルは URL のスクリーンショットを作成しているため、webkitgtk、Xvfb などを使用しています。

4

1 に答える 1

0

あなたのコマンドはウォンです:

$command = "sudo -u nobody python myprog.py params";

ここでは、Pythonインタープリターを直接呼び出していますが、sudoresファイルでは許可されているのは/path/to/myprog.py

この方法で実行する場合は、Pythonプログラムにシバンを追加して実行可能にし、コマンドを次のように変更します。

$command = "sudo -u nobody /path/to/myprog.py params";

ただし、これが機能するには、sudoersファイルで指定するユーザーがコマンドを実行するユーザーである必要があります。これはおそらくnobodyWebサーバープロセス(www-data?)ではありません。

Cmnd_Alias BUNDLE = /path/to/myprog.py
www-data  ALL=(ALL) NOPASSWD:BUNDLE

あなたが試した他の方法

$command = "echo 'root_pwd' | sudo -S python /program.py"

おそらく2つの理由で失敗しました:

  • 現在のユーザー(おそらくWebサーバープロセス)はsudoを許可されていません
  • sudoルートパスワードを取得しませんが、現在のユーザーのパスワードを取得します

そして、とにかくこのようなパスワードを渡したくないのです...

于 2012-10-28T13:38:24.383 に答える