Apache-2.2

apache使用者和root訪問

  • August 20, 2010

我想在 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/腳本服務根級別訪問權限相關的所有可能問題。

引用自:https://serverfault.com/questions/103644