我想在PHP中开发几个脚本,将调用以下命令; 使用exec()函数
service network restart crontab -u root /xyz/abc/fjs/crontab
等等
问题在于,Apache以脚本的身份执行脚本(我在CentOS 5上),无论是将apache添加到wheel还是做好,坏的和丑陋的组分配都不运行命令(如上所述)。
以下是我的configuration;
我的/ etc / sudoers
root ALL=(ALL) ALL apache ALL=(ALL) NOPASSWD: ALL %wheel ALL=(ALL) ALL %wheel ALL=(ALL) NOPASSWD: ALL
正如我已经尝试与sudoer&httpd.conf的几个组合,最近的httpd.conf看起来如下;
我的httpd.conf
User apache Group wheel
我的PHP脚本
exec("service network start", $a); print_r($a); exec("sudo -u root service network start", $a); print_r($a);
产量
Array ( [0] => Bringing up loopback interface: [FAILED] [1] => Bringing up interface eth0: [FAILED] [2] => Bringing up interface eth0_1: [FAILED] [3] => Bringing up interface eth1: [FAILED] ) Array ( [0] => Bringing up loopback interface: [FAILED] [1] => Bringing up interface eth0: [FAILED] [2] => Bringing up interface eth0_1: [FAILED] [3] => Bringing up interface eth1: [FAILED] )
毫不奇怪,当我通过ssh调用重启networking服务时,使用类似apache的用户,命令成功执行。 它的所有关于通过HTTP协议访问这样的命令。 我确信cPanel / Plesk类软件使用sudoer或类似的东西,而我正在尝试做的事情基本上是可能的。 但是我需要你的帮助来了解我失踪的哪一部分?
非常感谢!
如果你把troyengel的解决scheme扔到root cron表中,然后修改一下,你可能会有一个可行的解决scheme。
如果你确实需要使用apache来重新启动接口,为什么不用PHP创build一个充当标志的文件,然后让你的root cronjob每分钟运行一次(或者其他什么)来检查是否存在这个标志。 如果存在,请重新启动接口。 如果没有,就死吧。 (记得在成功重启接口之后,cronjob会删除该标志)。
这就完成了目标(重新启动接口,由apache / php触发),并绕过了授予Web /脚本服务根级访问所涉及的所有可能的问题。
你必须把它们写成PHP命令行驱动的工具(确保php-cli是通过yum安装的),然后直接在根crontab中运行它们,而不是像普通用户那样运行它们。 你可能也想把它写在基本的bash(shell)脚本中,如果你只是通过exec()来运行命令,那么使用php将会过度。
您应该使用sudo调用需要以不同用户身份运行的sudo ,然后适当地设置sudoersconfiguration文件,以便运行PHP脚本的用户可以像其他用户那样运行脚本。 看到sudoers (5)和大约十几个关于使用sudo的问题。
这是否回答你的问题?
你可以使用粘性位来使一个shell脚本以root身份运行。 然而,这样做是多一点涉及。
但是,你不能只是设置一个shell脚本。 你需要用C / C ++来定义一个可执行文件,这个函数不像shell脚本那样调用一个解释器,而是执行shell脚本。