我看到几个方法。您当然可以将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