为什么php命令`exec(“service apache2 restart”);`不能在ubuntu上工作?

时间:2011-11-20 16:23:37

标签: php linux apache ubuntu

我需要在配置了apache的php的web服务器上执行一些命令。

exec("service apache2 restart", $output);
print_r($output);

输出:

Array (
    [0] =>  * Restarting web server apache2
    [1] => Action 'start' failed.
    [2] => The Apache error log may have more information.
    [3] =>    ...fail! 
)

我的猜测是因为我的ubuntu上的php权限! 你有什么建议?

3 个答案:

答案 0 :(得分:6)

您需要运行:

visudo

检查您是否有像

这样的行
Host_Alias LOCAL=192.168.0.1 

在文件顶部使用您自己的本地IP,然后添加一行

www-data       LOCAL=NOPASSWD:/usr/bin/service

最后在PHP文件中:

exec("/usr/bin/sudo /usr/bin/service apache2 restart");

(你试图通过网络重启apache,也许你不知道webmin界面?我认为解决方案比这个sudo方式更好。授权www-data停止,启动并不是一件好事(...)所有服务。更好地解释你为什么要重启apache;))

答案 1 :(得分:2)

服务(在系统服务方面,如Apache httpd)只能由root用户(UID 0)操纵(启动,停止,重启)。

您可以在root的上下文中运行PHP脚本(错误的想法),或者使用类似sudo的内容以超级用户身份运行命令。这就是说,运行具有超级用户权限的程序时会产生非常严重的安全隐患,特别是如果您没有正确清理输入!

答案 2 :(得分:1)

您是否看过Apache错误日志?那里有什么?

几乎可以肯定,您的PHP脚本在没有足够权限重新启动Apache的情况下运行。这可能是最好的。如果你真的需要这个工作,可以考虑从PHP调用setuid root脚本(请注意,这不应该在生产中使用,并且可能会产生安全漏洞)。

您还可以编写一个以root身份运行的小服务,并接受从PHP脚本重启Apache的命令。这将是一个更好的"适当的"这样做的方式,虽然手头的任务本身不合适,所以我不确定你应该继续这条道路。