PHP Exec с аргументами по-прежнему не работает - PullRequest
0 голосов
/ 25 мая 2011

Я потратил несколько часов, пытаясь сделать эту работу, но безуспешно.Я искал часто задаваемые вопросы на этом сайте о том, как правильно отображать код в моем сообщении, но ничего не нашел, какие-либо советы, пожалуйста?

У меня есть следующая команда, которая отлично работает в командной строке на сервере Linux,но когда я передаю его в функцию php exec и запускаю его через apache на сервере linux, он показывает мне информацию об использовании, полученную вызываемым скриптом, вместо вывода этого скрипта.

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

Я пытался: отправить всю эту командную строку в exec

, отправив всю эту команду через escapeshellcmd в exec

, отправив все аргументы в одну строку (-arg1 "Arg1 value" -arg2 value2 -arg3 value3) через escapeshellarg в exec

отправка аргументов индивидуально (например: -arg1 "Arg1 value") через escapeshellarg в 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 Ответ

2 голосов
/ 25 мая 2011

Проблема здесь в том, что вы экранируете как коммутатор, так и значение. В выводе вы можете видеть, что переключатель заключен в пару одинарных кавычек, что означает, что вызов getopts в программе myTool, вероятно, интерпретирует -arg1 «Arg1 Value» как аргумент из одной строки, а не как переключатель со строковым значением .

Решение состоит в том, чтобы экранировать оболочки только в части значения:

например.

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

Это должно достичь того, что вы ищете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...