为什么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的权限! 你有什么建议?
答
你需要运行:
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;))
答
你看过Apache错误日志吗?那里有什么?
几乎可以确定您的PHP脚本运行时没有足够的权限来重新启动Apache。这可能是最好的。如果你真的需要这个工作,考虑制作一个setuid根脚本来从PHP调用(注意,这不应该用于生产,并可能会产生安全漏洞)。
您也可以编写一个以root身份运行的小服务,并接受从PHP脚本重新启动Apache的命令。这将是一个更“适当”的做法,尽管手头的任务看起来不合适,所以我不确定你应该继续走下去。
答
只能由root用户(UID 0)操作(启动,停止,重新启动)服务(在系统服务中,如Apache httpd)。
您可以在root的上下文中运行PHP脚本(不好的想法),或者您使用类似sudo的东西以超级用户身份运行命令。这就是说,在运行具有超级用户权限的程序时,存在非常严重的安全隐患,特别是如果您没有正确清理输入信息!
如果你通过网络像'http:// localhost/restartserver.php'运行它,它将以'www-data'用户身份运行。缺省情况下,www-data用户无权重新启动Web服务器。 – joar
你试图做的通常是一个坏主意。 – PeeHaa