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ファイルにはそのような行はありません。このエラーを回避するにはどうすればよいですか?
Sudoers行は、Shell_execが「my_script.sh」を呼び出している間に「my_script.php」を実行するアクセスを許可しています。パスワードが不要な場合、requirettyオプションは無関係です。
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
最近、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');