当我使用以下代码加载页面时,我想重新启动apache2:
exec('/etc/init.d/apache2 reload', $output, $return);
if(!$return) {
$result = "<script>console.log('can not restart apache2');</script>";
echo $result;
echo $output;
} else {
$result = "<script>console.log('restart apache2 successfuly');</script>";
echo $result;
}
在文件etc/sudoers
中我添加以下行:
Cmnd_Alias RESTART_APACHE = /etc/service apache2 restart
www-data ALL=NOPASSWD: RESTART_APACHE
但结果返回can not restart apache2
。
我做错了吗?
答案 0 :(得分:0)
Apache服务可能没有自行重启的权利
答案 1 :(得分:0)
@tuanptit
<?php echo shell_exec('service httpd restart &'); ?>
虽然这样的脚本尝试执行此操作可能会遇到权限问题。听起来你处于一个完整的开发环境中,所以你提升它的权限对你来说无关紧要。
但最好的方法是,处理这个问题的最佳方法是恕我直言,即为用户提供Apache运行的权限,以便通过sudo command重新启动Apache。
您需要编辑/ etc / sudoers文件并添加类似于以下内容的行:
Cmnd_Alias RESTART_APACHE = /sbin/service apache2 restart
www-data ALL=NOPASSWD: RESTART_APACHE
您可能需要nobody
而不是www-data
,这取决于Apache运行的用户。在Debian上,Apache通常在用户www-data
下运行,而在Red Hat下,Apache通常在用户nobody下运行。此外,/sbin/service apache2 restart
可能需要/sbin/service apache restart
或/sbin/service httpd restart
。一切都取决于您的系统配置。
完成后,在PHP中您可以使用代码:
exec('/sbin/service apache2 restart');
(如果重启Apache的命令在您的服务器上有所不同,显然会改变它。)
请注意:这很可能被视为安全风险!如果这样做,您完全信任sudo
二进制文件,service
二进制文件和您的系统遵守规则,而不是让Apache / PHP进程获得root shell。我强烈建议http://serverfault.com询问你在这里所做的事情。
答案 2 :(得分:0)
此处已讨论过解决方案。
How do you restart Apache with a (web) button click?
在sudoers文件中你有&#34;重启&#34;,在php文件中你有&#34;重新加载&#34;
检查是否需要使用/ sbin / service而不是/ etc / service
确保命令在PHP和sudoer文件中匹配