php exec与参数仍然无法正常工作

时间:2011-05-25 09:10:14

标签: php exec

我花了几个小时试图完成这项工作,但没有成功。我搜索了这个网站上的常见问题解答,了解如何在我的帖子中很好地显示代码,但没有找到任何内容,请给我任何提示?

我有以下命令在linux服务器上的命令行上正常工作,但是当我将它传递给php exec函数并通过linux服务器上的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

通过escapeshellcmd单独发送参数(例如:-arg1 "Arg1 value")到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);

这是apache服务器上php脚本的输出:

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 个答案:

答案 0 :(得分:2)

这里的问题是你正在逃避开关以及值。您可以在输出中看到开关被包含在一对单引号中,这意味着myTool程序中的getopts调用可能将-arg1“Arg1 Value”解释为单个字符串参数而不是具有字符串值的开关

解决方案是仅在值部分转义hellarhellar:

例如。

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

这应该实现你所追求的目标。