我目前正在为最近的项目编写管理门户。我一直在和我的电脑打架,以便让新手工作,现在就是这样,我希望能够从网络上运行新手。我需要在我的php脚本中执行以下内容
sudo restart job
sudo start job
sudo stop job
你可以看到sudo是这些命令的主题,所以我需要以某种方式从这个php脚本运行sudo。我该如何解决这个问题,或者是否有解决方法。
如果重要:
# which start
/sbin/start
# which stop
/sbin/stop
# which restart
/sbin/restart
答案 0 :(得分: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文件的事件。我自己也只是学习新贵,所以我不能给你更多的细节,但我觉得它意味着用这种方式。