2011-07-13 63 views
8

我想創建一個php腳本來執行shell命令並返回其輸出。服務器需要私鑰。當我第一次決定測試這個時,我創建了這個:如何從php腳本執行shell命令

<?php 
$command = "ls"; 
$output = shell_exec($command); 
echo "<pre>$output</pre>"; 
?> 

工作得很好。但是,當我改變$command到命令我真的想跑:

$command = "/etc/init.d/mycontrollerd status /etc/mycontrollerconfig"; 

它給了我這樣的輸出:

You need root privileges to run this script 

我的猜測是,我需要使用sudo。當然,這需要將pem文件放在服務器上的某個地方。假設我這樣做,$command究竟應該是什麼?我應該使用shell_exec()exec()system()還是別的?

回答

4

不要緊,你用啓動腳本PHP函數 - 什麼缺乏的是您的用戶帳戶的授權。

要麼使用sudo(預配置web服務器用戶通過visudo運行無密碼的確切命令,並在命令前加上sudo),或者設置一個setuid腳本來執行本身的命令。

+0

雖然它*還*重要的是用戶帳戶必須被授權,這並不意味着沒有一個PHP函數使用的最佳選擇。哪個最好? –

+0

@Kenneth Vogt'exec',因爲它不會不必要地涉及到shell並返回結果,或者'passthru',它直接輸出結果,但是需要對原始代碼進行一些修改。 – phihag

3

您真正需要做的是將您的Web服務器設置爲以特定用戶身份運行(例如,除「nobody」外),或者爲該用戶授予您要執行的內容的權限。

參見:PHP shell_exec() and sudo: must be setuid root

+0

這引出了一個問題:你如何「設置你的web服務器以'nobody'以外的特定用戶身份運行? –

+0

@Kenneth Vogt,我應該怎麼知道,你沒有指定你使用的服務器。如果您使用的是Apache,請檢查'User'和'Group'配置指令。 (http://httpd.apache.org/docs/1.3/mod/core.html#user)如果你無法做到這一點,請問適合的地方是ServerFault.com。 – Brad