2011-05-25 139 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... 

这应该可以实现你的目标。