web-dev-qa-db-ja.com

PHPからシェルスクリプトを呼び出し、rootとして実行します

Ubuntu 11.10。を実行しています。 phpからシェルスクリプトを呼び出して、そのスクリプトをルートとして実行できるようにしたいです。私のphpがシェルスクリプトをルートとして呼び出そうとすると、次のようになります。

$output = Shell_exec('Sudo /var/www/my_script.sh')

Apacheログにこのエラーが表示されます。

Sudo: no tty present and no askpass program specified

Phpスクリプトの所有者をroot:rootに変更しました。私はこの行をsudoersに追加しました:

www-data ALL = NOPASSWD:/var/www/my_script.php

私はsudoersでこの行をコメントアウトすることになっていることに気付きます:

Defaults    requiretty

ただし、私のsudoersファイルにはそのような行はありません。このエラーを回避するにはどうすればよいですか?

3
Sparky1

Sudoers行は、Shell_execが「my_script.sh」を呼び出している間に「my_script.php」を実行するアクセスを許可しています。パスワードが不要な場合、requirettyオプションは無関係です。

3
João Pinto

Ubuntu 10.04サーバーで「suexec」を使用:

Sudo apt-get install Apache2-suexec-common

Suexecを有効にします。

Sudo a2enmod suexec

構成ファイルを編集してサイトに一致させます。

Sudo -e /etc/Apache2/suexec/www-data

次に、Apache.orgの suEXECの使用 を参照して、Apache構成ファイルを構成します。

別のアプローチ...

Www-dataユーザーの実行を許可しますprogram1およびprogram2withパスワードなし:

Sudo visudo

Sudoersファイルの内容に追加します。

User_Alias WWW_USER = www-data
Cmnd_Alias WWW_COMMANDS = /sbin/program1, /sbin/program2
WWW_USER ALL = (ALL) NOPASSWD: WWW_COMMANDS

セーブ。

さらに別の方法は suPHP

2
user8290

最近、PHPが実際のBashシェルを取得し、それとやり取りできるようにするプロジェクトを公開しました(必要に応じて、Apache/www-dataまたはroot)。ここで入手: https://github.com/merlinthemagic/MTS

ダウンロード後、次のコードを使用するだけです。

//Setting the second argument in getShell():
//true will return a Shell with root
//false will return a Shell with the php execution user
$Shell    = \MTS\Factories::getDevices()->getLocalHost()->getShell('bash', true);
$return1  = $Shell->exeCmd('/var/www/my_script.sh');
0
Merlin