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

问题描述:

我需要执行一些命令在我的web服务器上用php配置了apache。为什么php命令`exec(“service apache2 restart”);`在ubuntu上不工作?

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的权限! 你有什么建议?

+4

如果你通过网络像'http:// localhost/restartserver.php'运行它,它将以'www-data'用户身份运行。缺省情况下,www-data用户无权重新启动Web服务器。 – joar

+6

你试图做的通常是一个坏主意。 – PeeHaa

你需要运行:

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数据停止并启动(...)所有服务并不是一件好事。更好地解释为什么你想重新启动Apache;))

+0

感谢您的工作方法!这就是我需要的!我只是做这个测试,而不是真正的项目。 – EBAG

+0

不客气。 –

+0

这是否可以与其他服务一样使用?你能解释一下这些线条究竟做了什么吗? –

你看过Apache错误日志吗?那里有什么?

几乎可以确定您的PHP脚本运行时没有足够的权限来重新启动Apache。这可能是最好的。如果你真的需要这个工作,考虑制作一个setuid根脚本来从PHP调用(注意,这不应该用于生产,并可能会产生安全漏洞)。

您也可以编写一个以root身份运行的小服务,并接受从PHP脚本重新启动Apache的命令。这将是一个更“适当”的做法,尽管手头的任务看起来不合适,所以我不确定你应该继续走下去。

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

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