アプリ版:「スタンプのみでお礼する」機能のリリースについて

PHPでUNIXコマンドを発行してファイルへ追記できない

現在,/etc/aliasesファイルへ,PHPから文字列を追加したいのですが,うまくいかず,皆様のお知恵を頂ければと思います.

現在,sudoersにapacheユーザを追加しており,パスワードを渡せば全権限を持たせています.
それで,PHP上で

$command = "echo '".___APACHEPASS___."' | sudo -S cp /etc/aliases /etc/alias_bak/aliases.bak.".date("YmdHis");
exec($command, $output);

とすれば,aliasesファイルのバックアップファイルが生成されます.

ところが,文字列を追記するため,コマンド

$command = "echo '".___APACHEPASS___."' | sudo -S echo '{$_POST['user_name']}: | /var/www/html/test.php' >> /etc/aliases";

を発行しても追記されません.
バックアップファイルコマンドが実行されれば,/var/log/secureにログが残りますが,追記コマンドでは失敗のログすら記録されていません.

なお,コマンド自体を表示させると,
echo 'apache-password' | sudo -S echo 'user-name: | /var/www/html/test.php' >> /etc/aliases
となっており,rootのコマンドラインで
echo 'user-name: | /var/www/html/test.php' >> /etc/aliases
を実行すれば,正常に追記されます.

乱文となってしまいましたが,追記されない原因の見当がついたかた,ご教授頂けると幸いです.
よろしくお願い致します.

A 回答 (1件)

> echo 'apache-password' | sudo -S echo 'user-name: | /var/www/html/test.php' >> /etc/aliases


このコマンド実行だと、sudo の引数は「echo 'user-name: | /var/www/html/test.php'」までで、「>> /etc/aliases」 は、sudo コマンドではなく、それを呼び出しているシェルが解釈して処理することになります。
そのため、ファイル追記そのものはapache権限で実行しようとして、それで失敗します。



最初のecho自体が意味ありませので、実行すべきコマンドは、
> sudo -S /bin/sh -c "echo 'user-name: | /var/www/html/test.php' | >> /etc/aliases"

といった感じになるかと。試してませんが、元のPHPコードなら、

> $command = "sudo -S sh -c \"echo '{$_POST['user_name']}: | /var/www/html/test.php' >> /etc/aliases\"";

といったところでしょうか。
    • good
    • 0
この回答へのお礼

ありがとうございました!
無事,aliasesファイルへ追記できました.

ただ,少し補足なのですが,apacheユーザでsudoコマンドを実行するためにはセキュリティ上,パスワードを毎回入力する必要があるように設定しています.
ですので,はじめのechoでsudoコマンドにapacheユーザのパスワードを渡しているのです.
はじめのechoを削ると,パスワードが違うというエラーが返ります.

ですので,今回回答者様に頂いたコマンドに,前のechoを足しまして,
$command = "echo '".___APACHEPASS___."' | sudo -S sh -c \"echo '{$_POST['user-name']}: | /var/www/html/test.php' >> /etc/aliases\"";
で無事追加できました.

本当に,ありがとうございました!

お礼日時:2010/06/01 11:47

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!