我正在使用redhat 6我有以下shell命令,我需要从Web服务器(Apache – >通过PHP),基本上移动和覆盖文件,杀死一个进程,并开始另一个。 显然,由于某些原因,所有的操作都被拒绝,所以我想知道是否有任何方法来执行它们(例如,什么权限和我应该如何给予Apache)
echo shell_exec('mv -f /etc/resolv.test /etc/resolv.conf'); echo shell_exec('killall horas'); echo shell_exec('/xg/eng/sbin/startme &> /dev/null &');
错误日志是mv:无法将/etc/resolv.test' to移动/etc/resolv.test' to /etc/resolv.conf中:Permission denied horas(2105):Operation not permitted horas:no process killed
以及我知道,Apache运行在Apache下,但我认为问题是如何给更多的权限的Apache,所以它可以执行所有这些命令
这样做的典型方法是使用NOPASSWD授予Apache sudo访问权限。 你会想过于谨慎,因为如果configuration错误,这可能是非常危险的。 就像是
apache ALL=(ALL) NOPASSWD: killall horas
可能会工作。 你可能也想把整个东西写成一个“包装”脚本,然后只允许Apache的sudo访问这个脚本。 ( 另一个回复build议这个。)
请记住,您正在授予apache执行和特权升级。 这可能是一个根级的远程利用。 testing您的脚本部署之前,并确保您调查安全访问页面与基本身份validation和/或IP允许。 你也可以更好地调查替代解决scheme。 Apache确实需要pipe理你的resolv.conf? cronjob可以执行killall吗?
Apache进程作为一个特殊的用户正常运行(通常在Redhat中“apache”)。 先找出来。 然后,您需要检查是否允许该用户执行该操作(文件/目录权限)。
让运行Web服务器的用户拥有很大的权限来执行只有root用户才能执行的敏感脚本是非常危险的。 我不知道你的情况,但从片段判断,我会去更多的谨慎,因为有一个频繁运行(每分钟一次)的cron脚本(对于root用户也许),只是检查一些文件的存在,这是由php脚本生成的 – 如果该文件存在,它将执行任务并删除该文件。
我通常会做以下其中一项:
sudo -u correctuser_here /path/to/script并运行sudo -u correctuser_here /path/to/script ,当然还要为/ etc / sudoers添加权限: www-data ALL=correctuser /path/to/script 在你的用例选项2听起来像是正确的事情。