2012-06-15 204 views
41

我有一個bash腳本,我通過命令行運行是這樣的:運行bash命令從PHP

./script.sh var1 var2 

我試圖執行上面的命令,我叫了一定PHP文件之後。

我有現在的問題是:

$output = shell_exec("./script.sh var1 var2"); 
echo "<pre>$output</pre>"; 

但doesn't工作。我也嘗試過使用execsystem,但腳本從未執行過。

但是,當我嘗試運行shell_exec("ls");它確實有效,並且$output是所有文件的列表。

我不確定這是因爲我使用的VPS的限制還是問題在其他地方?

+1

你在什麼路徑上運行它?pwd返回什麼? – alex

+1

你的腳本是由'apache'還是'www-data'用戶執行? – core1024

+2

這個bash腳本和你的PHP腳本在同一個目錄下嗎? php腳本的工作目錄是否在同一目錄下? –

回答

58

在調用腳本之前,您可能需要將chdir更改爲正確的目錄。這樣,您可以確保腳本的目錄「在」之前調用shell命令。

$old_path = getcwd(); 
chdir('/my/path/'); 
$output = shell_exec('./script.sh var1 var2'); 
chdir($old_path); 
+0

我認爲這個伎倆!至少我用一個簡單的測試腳本來處理它。爲了最終驗證它,我必須等待服務器主機讓我知道腳本的確切路徑。儘管如此,我現在要標記答案。謝謝! – Andrej

+0

@Andrej:或者使用腳本的絕對路徑而不是相對路徑。 –

+0

@Andrej如果您運行的是PHP 5.3,您可以使用'chdir(__ DIR __)'將目錄更改爲包含該腳本的目錄。或者對於PHP 5.2或更低版本,'dirname(__ FILE __)'將會起作用。 –

5

您的shell_exec由www-data用戶從其目錄執行。 您可以嘗試

putenv("PATH=/home/user/bin/:" .$_ENV["PATH"].""); 

如果你的腳本位於/家庭/用戶/箱 以後你可以

$output = "<pre>".shell_exec("scriptname v1 v2")."</pre>"; 
echo $output; 

要顯示命令的輸出。 (或者,如果沒有導出路徑,請嘗試給腳本的整個路徑,而不是僅僅./script.sh

+0

這是沒有必要改變'PATH'環境變量。當前的工作目錄應該改變(參見[我的答案](http://stackoverflow.com/a/11052453/24950))。 –

+1

是的。謝謝。我在我的代碼中使用了路徑設置,因爲我在多個位置有不同的自定義可執行文件,我希望輸入框作爲控制檯工作,所以我可以從這些文件中調用任何命令。如果僅用於單個文件執行,我們可以使用shell_exec('/ entire/path/to/file /'); – Hrishikesh

0

檢查沒有設置在php.ini或域的.htaccess一個open_basedir的你用什麼。這將監獄您在您的域名和PHP的目錄將只得到在這個目錄下執行access。