2011-09-25 94 views
2

我目前正在爲我最近的項目編寫管理員門戶。我一直在和我的電腦鬥爭,以獲得新的工作,現在,我希望能夠在網上從事新貴。我需要在我的PHP腳本在php腳本中重新啓動一個工作(upstart)

sudo restart job 
sudo start job 
sudo stop job 

,你可以看到sudo的是這些命令的主題,以執行以下,所以我需要以某種方式從這個PHP腳本執行sudo。我該如何解決這個問題,或者是否有解決方法。

的情況下,它的問題:

# which start 
/sbin/start 
# which stop 
/sbin/stop 
# which restart 
/sbin/restart 
+1

Web服務器(或PHP FastCGI)正在運行什麼用戶?您可能需要修改sudoers文件。 –

+0

debain的Appache的默認Web用戶。我認爲這是www-data –

+0

如果沒有交互式終端,Sudo將無法工作,但您可以用例如python腳本來僞造。不容易:S – Evert

回答

0

我看到幾個方法。您當然可以將www-data添加到sudoers列表中,然後將www-data的密碼硬編碼到您的腳本中(不太好)或者從文件中讀取(稍微好一點)以使sudo正常工作。如果你走這條路線,你可能需要手動覆蓋www-data的密碼,因爲它沒有真正的密碼。任何一種方法都應該被阻止,因爲www數據被故意剝奪了大部分特權作爲安全措施。授予它一個很大的(如sudo)並將其密碼放入文件或腳本中會造成嚴重的安全漏洞。

您可能會授予www-data非常有限的sudo權限,從而啓用所需的功能而不會打開太多安全漏洞。閱讀sudo和sudoers文件以獲取更多信息。

一個更好的方法可能是編寫一個採用start/stop/restart參數的腳本並調用相應的upstart命令。訣竅是使這個腳本setuid root(chown root:root script.sh; chmod +s script.sh),以便它以root身份而不是www-data運行。給這個腳本755權限,這樣只有root可以改變它。這限制了安全風險,並且仍然爲您提供了所需的功能,但不再提供。

setuid方法可能不會直接在您的系統上運行(首先嚐試),因爲大多數Unix系統故意禁用setuid以在shell腳本上廣告,因爲安全風險太高。這是一個article,它解釋了一個使用C程序(setuid仍然有效)的方法來調用腳本。這有點複雜,但它應該工作。

可能最好的方法是利用upstart的事件機制,讓您的web代碼觸發事件,upstart會捕獲並轉發到您的.conf文件。我只是自己學習了一些新東西,所以我不能給你更具體的細節,但我明白它意味着要用這種方式。

+0

只是爲了清除這一點,你絕對不需要在任何地方都有密碼。 sudo具有適用於非交互式操作的NOPASSWD參數。 即使考慮到這一點仍然是一個可怕的想法,所以不要這樣做。 – deoxxa