带有参数的php exec仍然不起作用

问题描述

| 我花了几个小时试图使这项工作成功,但没有成功。我在该网站上搜索了常见问题解答,以了解如何在我的帖子中很好地显示代码,但是没有找到任何东西,请提供任何提示? 我有以下命令可以在Linux服务器上的命令行上正常工作,但是当我将其传递给php exec函数并通过linux服务器上的apache运行它时,它将显示由脚本调用的使用信息,而不是该脚本的输出。
myTool -arg1 \"Arg1 value\" -arg2 value2 -arg3 value3
我试过了: 将整个命令字符串发送给exec 通过escapeshellcmd发送整个命令给执行 通过escapeshellarg将参数作为一个字符串“ 1”一起发送给exec 通过escapeshellarg分别将参数(例如::2ѭ)发送给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] => ) 
有人知道我想念什么吗?     

解决方法

这里的问题是您要转义开关和值。您可以在输出中看到,该开关用一对单引号引起来,这意味着myTool程序中的getopts调用可能会将-arg1 \“ Arg1 Value \”解释为单字符串参数,而不是带有字符串值。 解决方案是仅在值部分上转义shellarg: 例如。
$cmd = \'/tools/myTool \' . \'-arg1 \' . escapeshellarg(\"Arg1 Value\") . \' -arg2 \' . escapeshellarg(\'Arg2 Value\') etc etc...
那应该实现您的追求。     

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...