我看到幾個方法。您當然可以將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文件。我只是自己學習了一些新東西,所以我不能給你更具體的細節,但我明白它意味着要用這種方式。
Web服務器(或PHP FastCGI)正在運行什麼用戶?您可能需要修改sudoers文件。 –
debain的Appache的默認Web用戶。我認爲這是www-data –
如果沒有交互式終端,Sudo將無法工作,但您可以用例如python腳本來僞造。不容易:S – Evert