Apache-2.2
apache使用者和root訪問
我想在 php 中開發一些腳本來呼叫以下命令;使用 exec() 函式
service network restart crontab -u root /xyz/abc/fjs/crontab
等等。
問題是 Apache 以 apache 使用者身份執行腳本(我在 CentOS 5 上),無論將 apache 添加到 wheel 中還是做得好,壞和醜陋的 組分配都不會執行命令(如上所述)。
以下是我的配置;
我的 /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 呼叫重新啟動網路服務時,使用類似 apache 的使用者,該命令成功執行。它都是關於通過 HTTP 協議訪問此類命令的。我確信 cPanel/Plesk 之類的軟體確實使用了 sudoer 之類的東西,而我想要做的基本上是可能的。但我需要你的幫助來了解我缺少哪一塊?
非常感謝!
如果您採用 troyengel 在根 cron 表中拋出一個條目的解決方案,然後稍微修改它,您可能會有一個可行的解決方案。
如果您絕對肯定需要使用 apache 來表示介面重新啟動,為什麼不讓 PHP 創建一個充當標誌的文件,然後讓您的根 cronjob 每分鐘(或其他任何時間)執行一次檢查該標誌的存在。如果存在,請重新啟動介面。如果沒有,那就死吧。(記住在成功重新啟動界面後讓 cronjob 刪除標誌)。
這實現了目標(重新啟動界面,從 apache/php 觸發)並規避與授予 Web/腳本服務根級別訪問權限相關的所有可能問題。