我看到了几种方法。您当然可以将 www-data 添加到 sudoers 列表中,然后将 www-data 的密码硬编码到您的脚本中(不太好)或从文件中读取它(稍微好一点)以使 sudo 工作。如果你走这条路,你可能需要手动覆盖 www-data 的密码,因为它实际上没有可用的密码。应该劝阻这些方法中的任何一种,因为 www-data 被故意剥夺了大多数特权作为安全措施。授予它一个大的(如 sudo)并将其密码放在文件或脚本中会产生重大的安全漏洞。
您可能能够授予 www-data 非常有限的 sudo 权限,以启用您需要的功能,而不会打开太多安全漏洞。阅读 sudo 和 sudoers 文件以获取更多信息。
更好的方法可能是编写一个脚本,该脚本采用启动/停止/重启参数并调用适当的 upstart 命令。诀窍是将此脚本设置为 root ( chown root:root script.sh; chmod +s script.sh
),以便它以 root 而不是 www-data 的身份运行。授予此脚本 755 权限,以便只有 root 可以更改它。这限制了安全风险,仍然为您提供所需的权力,但仅此而已。
setuid 方法可能不会直接在您的系统上工作(先尝试一下),因为现在大多数 Unix 系统故意禁用 setuid 以按照 shell 脚本上的广告工作,因为安全风险太高。这是一篇文章,它解释了使用 C 程序(setuid 仍然有效)来调用您的脚本的解决方法。这有点令人费解,但它应该可以工作。
可能最好的方法是利用 upstart 的事件机制,让 upstart 捕获并转发到您的 .conf 文件的 Web 代码触发事件。我自己只是在学习暴发户,所以我不能给你更多的细节,但我明白它应该以这种方式使用。