2012-07-16 19 views
4

我試圖在PHP腳本中執行shell命令,但exec返回126代碼,這意味着「調用的命令無法執行」(權限問題或命令不是可執行文件)。但最有趣的是,如果我在cli下運行相同的php腳本,它效果很好。它出什麼問題了?exec -PHP return_val是126

也許有一些環境問題?因爲當我在Apache下運行它時,如果我不使用絕對路徑來執行可執行文件(在cli下它工作良好並返回0,即使我僅使用文件名),它將返回127代碼。該文件存儲在/ usr/local/bin文件夾。

UPDATE:

至於問意見,我告訴例如我的代碼,但是有沒有什麼特別的。

這件工作在CLI罰款,但在Apache不工作($retval將等於127):

$output = array(); 
$retval = 0; 
exec("myexecutablefile /full/path/to/someotherfile.js", $output, $retval); 
echo implode(PHP_EOL, $output); 

這段代碼將返回$retval = 126

$output = array(); 
$retval = 0; 
exec("/usr/local/bin/myexecutablefile /full/path/to/someotherfile.js", $output, $retval); 
echo implode(PHP_EOL, $output); 
+1

代碼示例?你在做什麼? – Neal 2012-07-16 20:07:50

+0

exec和你的用戶在命令行上的用戶並不相同,因此不同的權限。 – 2012-07-16 20:09:10

+0

在Apache下運行它與您在命令行中使用的環境完全不同。不同的用戶ID,不同的環境變量(例如路徑) – 2012-07-16 20:11:18

回答

5

你需要指定可執行文件的完整路徑,以及確保您的Apache用戶有權執行它。

Apache不會使用bash運行,並且不關心您自己的個人路徑設置。

+0

我有用於Apache的同一用戶的chown-ed可執行文件(和所有相關文件)。沒有改變,仍然是相同的返回碼。 – 2012-07-16 20:44:10

+0

而......完整的路徑? – Brad 2012-07-16 23:29:25

+0

是的,當然,我使用可執行文件的完整路徑。正如您在代碼示例中看到的,我嘗試了所有變體。 – 2012-07-17 05:33:53

2

嘗試把chmod爲0777的可執行文件:

chmod($file,0777); 
1

顯然,PHP exec()函數調用的Linux的exec()系統調用。如果你的可執行文件是一個bash腳本,你必須與/斌/慶典明確啓動它:

exec("/bin/bash /usr/local/bin/myexecutablefile /full/path/to/someotherfile.js", $output, $retval); 

,因爲你不能使用在Linux上執行exec()系統調用來運行一個shell腳本;只有像bash這樣的shell可以解釋那裏的命令。/bin/bash是一個可執行文件,可以在Linux上使用exec()完全啓動,而後者運行腳本。