質問: phpで編集したファイルをcrontabに設定する phpで編集したファイルを、crontabに設定しようと、プログラムを製造しています。 しかし、rootユーザーのジョブキューにphpで編集したファイルの内容が反映できません。 下記url(niftyホームページ)記載の通り、sudoを使用し、実行時にrootユーザーを指定し、rootユーザーのジョブキューにtext.txtの内容を設定しようとしていますが、反映できません。ちなみに、test、apacheユーザーに対しても試してみましたが反映できませんでした。以下に作業内容を記載しますので、どこがおかしいのか教えていただければありがたいです。 【作業内容】 (1)sudoを設定する。 1)sudoをインストールする。 2)/etc/sudoersを編集する(コマンドvisudoで実施)。 a)ユーザーと、それぞれの実行権限の追加。 root all=(all) all test test=(root) all apache test=(root) all b)wheel を全てのホストで、全てのユーザーのすべての権限を実行できるように設定 %wheel all=(all) all c)wheelはパスワードを入力せず、コマンドを実行できるように設定。 %wheel all=(all) nopasswd: all (2)sudoコマンドが正常に実行できるか確認する。teratermの画面からroot権限でcrontabを実行する。以下は、phpで編集した、test.txtファイルの内容を、crontabへroot権限で設定しようとしています。 1)ログインユーザーrootで実行する sudo -u root crontab /var/document/test.txt 2)ログインユーザーtestで実行する sudo -u root crontab /var/document/test.txt 3)ログインユーザーapacheで実行する ※ユーザーapahceでログインすることは不可能です(以降省略)。 以上のコマンドそれぞれ実行し、rootユーザーのジョブキューにtest.txtの内容が入ることを確認。 (3)sudoコマンドが正常に実行できるか確認する。teratermの画面からtest権限でcrontabを実行する。以下は、phpで編集した、test.txtファイルの内容を、crontabへtest権限で設定しようとしています。 1)ログインユーザーrootで実行する sudo -u test crontab /var/document/test.txt 2)ログインユーザーtestで実行する sudo -u test crontab /var/document/test.txt 以上のコマンドそれぞれ実行し、testユーザーのジョブキューにtest.txtの内容が入ることを確認。 (4)sudoコマンドが正常に実行できるか確認する。teratermの画面からapache権限でcrontabを実行する。以下は、phpで編集した、test.txtファイルの内容を、crontabへapache権限で設定しようとしています。 1)ログインユーザーrootで実行する sudo -u apahce crontab /var/document/test.txt 2)ログインユーザーtestで実行する sudo -u apache crontab /var/document/test.txt 以上のコマンドそれぞれ実行し、apacheユーザーのジョブキューにtest.txtの内容が入ることを確認。 (5)(2)で試したコマンドを、phpプログラムに埋め込み実行する。system()、sell_exec()、exec()でそれぞれ実行しました。 1)system("sudo -u root crontab /var/document/test.txt"); 2)sell_exec("sudo -u root crontab /var/document/test.txt"); 3)exec("sudo -u root crontab /var/document/test.txt"); 以上の内容をプログラムに記述し、実行しましたが、test.txtの内容をrootのジョブキューに、設定できませんでした。 《確認コマンド》 sudo -u root crontab -l なお、test、apacheユーザーも同様に試してみました。 ※testユーザー権限で実行 1)system("sudo -u test crontab /var/document/test.txt"); 2)sell_exec("sudo -u test crontab /var/document/test.txt"); 3)exec("sudo -u test crontab /var/document/test.txt"); ※apahceユーザー権限で実行 1)system("sudo -u apache crontab /var/document/test.txt"); 2)sell_exec("sudo -u apahce crontab /var/document/test.txt"); 3)exec("sudo -u apache crontab /var/document/test.txt"); 以上のプログラムを実行後、それぞれのジョブキューを確認しましたが、text.txtの内容をcrontabへ設定できませんでした。 《確認コマンド》 sudo -u test crontab -l sudo -u apache crontab -l system()、shell_exec()、exec()、それぞれの関数を使用し、管理者権限以外のコマンド(mkdir、cp、mv、rm等)を実行した場合、問題ないので、本問題は実行権限と考えていますが、以上の情報で何がどうおかしいの分かりますでしょうか?お手数をかけますが、ご回答お願いします。 【niftyでの回答】 niftyのサイトに以下のような質問・回答がございますが、本投稿の内容とほぼ同じと認識しています。 但し、niftyの回答をそのまま実行してみましたが、実行できませんでした。環境の違いのせいでしょうか? http://oshiete1.nifty.com/qa7939488.html ※上記設定(/etc/sudoers)は、セキュリティレベルが低いのは十分承知しています。以上の処理が正常に動作確認後、徐々にセキュリティレベルを上げていく予定です。
回答: > phpプログラムに埋め込み実行する というのは、phpをコマンドラインで実行されているのでしょうか? それとも、webアプリとしてwebサーバ上での実行でしょうか? 後者の場合、実行プロセスのオーナーは、通常apacheですから system("sudo -u root crontab /var/document/test.txt"); ができるようにするためのsudoersの設定としては、 "apacheというユーザーが" "パスワードなしに" "rootの権限になって" "crontabを実行" できるように設定する必要があります。