2011-11-20 16 views
5

Apacheで設定されたphpを使用してWebサーバー上でコマンドを実行する必要があります。なぜphpコマンド `exec(" service apache2 restart ");` ubuntuで動作しないのですか?

exec("service apache2 restart", $output); 
print_r($output); 

出力:

Array (
    [0] => * Restarting web server apache2 
    [1] => Action 'start' failed. 
    [2] => The Apache error log may have more information. 
    [3] => ...fail! 
) 

私の推測では、それが原因で私のUbuntuでのPHPのパーミッションのだです! あなたは何をお勧めしますか?

+4

'http:// localhost/restartserver.php'のようにWeb経由で実行すると、' www-data'ユーザとして実行されます。デフォルトでは、wwwデータユーザーにはWebサーバーを再起動する権限がありません。 – joar

+6

あなたがしようとしていることは、一般的には悪い考えです。 – PeeHaa

答えて

6

あなたが実行する必要があります:あなたはファイルの先頭に、独自のローカルIPと

Host_Alias LOCAL=192.168.0.1 

のようなラインを持っている

visudo 

チェックし、ライン

www-data  LOCAL=NOPASSWD:/usr/bin/service 
を追加

あなたのPHPファイルの最後に:

exec("/usr/bin/sudo /usr/bin/service apache2 restart"); 

(ウェブでApacheを再起動しようとしていますか?webminインターフェイスがわからないことがありますか?私はこのsudoの方法よりも良い解決策があると思います。すべてのサービスを停止、開始(...)するためにwww-dataを承認することは良いことではありません。なぜApacheを再起動したいのかを説明してください))

+0

あなたの働く方法をありがとう!それは私が必要なものです!私は実際のプロジェクトではなく、テストのためにこれをやっています。 – EBAG

+0

あなたは大歓迎です。 –

+0

名前のような他のサービスでも動作しますか?これらの行が正確に何をしているのか説明できますか? –

1

Apacheのエラーログを見ていますか?そこには何がありますか?

ほとんどの場合、Apacheを再起動するための十分な権限がないとPHPスクリプトが実行されています。これはおそらく最高のものです。これが実際に本当に必要な場合は、PHPから呼び出すsetuidルートスクリプトを作成することを検討してください(これは本番環境では使用しないでください)。

rootとして実行される小さなサービスを作成し、PHPスクリプトからApacheを再起動するコマンドを受け入れることもできます。これはもっと適切なやり方ですが、手元の作業自体が不適切だと思われるので、この道を続けるべきかどうかはわかりません。

2

サービス(Apache httpdなどのシステムサービスという意味)は、ルートユーザー(UID 0)によってのみ操作(起動、停止、再起動)できます。

rootのコンテキスト(badアイデア)でPHPスクリプトを実行するか、sudoのようなものを使用してスーパーユーザーとしてコマンドを実行します。これは、スーパーユーザ権限でプログラムを実行すると、特にあなたの入力を適切にサニタイズしないと、セキュリティに深刻な影響があることになります。

関連する問題