2011-05-25 83 views
-1

我花了幾個小時試圖做這項工作,但沒有成功。我在這個網站上搜索了關於如何在我的文章中很好地顯示代碼的常見問題,但沒有找到任何東西,請提供任何提示?php exec,參數仍然不起作用

我有以下命令,可以在Linux服務器上的命令行上正常工作,但是當我將它傳遞給php exec函數並通過Apache服務器運行它時,它會向我顯示由腳本被調用,而不是該腳本的輸出。

myTool -arg1 "Arg1 value" -arg2 value2 -arg3 value3 

我曾嘗試: 發送的是整個命令字符串給exec

通過escapeshellcmd發送的是整個命令給exec

通過escapeshellarg發送參數一起作爲一個字符串(-arg1 "Arg1 value" -arg2 value2 -arg3 value3)給exec

通過escapeshellarg單獨發送參數(例如:-arg1 "Arg1 value")至exec

分別發送的參數(例如:-arg1 "Arg1 value")經由escapeshellcmd給exec

結果要麼沒有輸出或所調用的腳本的使用信息,這表明參數不正確地傳遞。

下面是代碼:

$data = array(); 
$commandexec = "/tools/myTool "; 
$arg1 = "-arg1 \"Arg1 value\""; 
$arg2 = "-arg2 value2"; 
$arg3 = "-arg3 value3"; 
$arguments_escaped = escapeshellarg($arg1). " ". escapeshellarg($arg2). " ".escapeshellarg($arg3); 
$command_escaped_arguments = $commandexec . $arguments_escaped; 
print "<br>command_escaped_arguments: ". $command_escaped_arguments ."<br>"; 
$result = exec($command_escaped_arguments, &$data); 
print_r($data); 

這是PHP腳本的Apache服務器上的輸出:

command_escaped_arguments: /tools/myTool '-arg1 "Arg1 value"' '-arg2 value2' '-arg3 value3' 

Array ([0] => 
[1] => myTool version 1.0 
[2] => Usage: myTool -arg1 "Some value" 
[3] => -arg3 option1|option2 
[4] => [-arg2 value] 
[5] =>) 

人有一個想法,我缺少的是什麼?

+1

請問您可以發佈正確的代碼嗎? (例如,您的示例未用引號引起來) – konsolenfreddy 2011-05-25 09:14:01

+1

查看'error.log'以發現執行錯誤(路徑/權限)。 – mario 2011-05-25 09:16:27

回答

2

這裏的問題是,你正在逃避交換機以及價值。您可以在輸出中看到開關被封閉在一對單引號中,這意味着myTool程序中的getopts調用可能將-arg1「Arg1 Value」解釋爲單個字符串參數,而不是具有字符串值的開關。

解決的辦法是隻在數值部分使用escapeshellarg:

例如:

$cmd = '/tools/myTool ' . '-arg1 ' . escapeshellarg("Arg1 Value") . ' -arg2 ' . escapeshellarg('Arg2 Value') etc etc... 

這應該可以實現你的目標。