2011-09-25 102 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