2011-11-20 67 views
5

我需要執行一些命令在我的web服務器上用php配置了apache。爲什麼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'運行它,它將以'www-data'用戶身份運行。缺省情況下,www-data用戶無權重新啓動Web服務器。 – joar

+6

你試圖做的通常是一個壞主意。 – PeeHaa

回答

6

你需要運行:

visudo 

的支票,你有一個像

Host_Alias LOCAL=192.168.0.1 

一個符合該文件的頂部您自己的本地IP,然後添加一行

www-data  LOCAL=NOPASSWD:/usr/bin/service 

最後在您的PHP文件中:

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

(您正嘗試通過網絡重新啓動Apache,也許您不知道webmin界面?我認爲比這種sudo方式有更好的解決方案。授權www數據停止並啓動(...)所有服務並不是一件好事。更好地解釋爲什麼你想重新啓動Apache;))

+0

感謝您的工作方法!這就是我需要的!我只是做這個測試,而不是真正的項目。 – EBAG

+0

不客氣。 –

+0

這是否可以與其他服務一樣使用?你能解釋一下這些線條究竟做了什麼嗎? –

1

你看過Apache錯誤日誌嗎?那裏有什麼?

幾乎可以確定您的PHP腳本運行時沒有足夠的權限來重新啓動Apache。這可能是最好的。如果你真的需要這個工作,考慮製作一個setuid根腳本來從PHP調用(注意,這不應該用於生產,並可能會產生安全漏洞)。

您也可以編寫一個以root身份運行的小服務,並接受從PHP腳本重新啓動Apache的命令。這將是一個更「適當」的做法,儘管手頭的任務看起來不合適,所以我不確定你應該繼續走下去。

2

只能由root用戶(UID 0)操作(啓動,停止,重新啓動)服務(在系統服務中,如Apache httpd)。

您可以在root的上下文中運行PHP腳本(不好的想法),或者您使用類似sudo的東西以超級用戶身份運行命令。這就是說,在運行具有超級用戶權限的程序時,存在非常嚴重的安全隱患,特別是如果您沒有正確清理輸入信息!

相關問題