Передача нескольких переменных PHP в shell_exec()?

Я вызываю test.sh из PHP с использованием метода shell_exec.

$my_url="http://www.somesite.com/";
$my_refer="http://www.somesite.com/";
$page = shell_exec('/tmp/my_script.php $my_url $my_refer');

Однако в командной строке script говорится, что он получил только один аргумент:/tmp/my_script.php

Когда я меняю вызов на:

код:

$page = shell_exec('/tmp/my_script.php {$my_url} {$my_refer}');

В нем говорится, что он получил 3 аргумента, но argv [1] и argv [2] пусты.

Когда я меняю вызов на:

код:

$page = shell_exec('/tmp/my_script.php "http://www.somesite.com/" "http://www.somesite.com/"');

script, наконец, получает все 3 аргумента, как предполагалось.

Вам всегда нужно отправлять только цитированный текст с помощью script и не разрешено отправлять переменную типа $var? Или есть какой-то особый способ отправить $var?

Ответы

Ответ 1

Необходимо отправить аргументы с квотой, чтобы вы могли использовать ее как:

$page = shell_exec("/tmp/my_script.php '".$my_url."' '".$my_refer."'");

Ответ 2

Изменить

$page = shell_exec('/tmp/my_script.php $my_url $my_refer');

к

$page = shell_exec("/tmp/my_script.php $my_url $my_refer");

ИЛИ

$page = shell_exec('/tmp/my_script.php "'.$my_url.'" "'.$my_refer.'"');

Также не забудьте использовать escapeshellarg для обоих ваших значений.

Пример:

$my_url=escapeshellarg($my_url);
$my_refer=escapeshellarg($my_refer);

Ответ 3

Переменные не будут интерполировать внутри одной кавычки. Также вы должны убедиться, что ваши аргументы правильно экранированы.

 $page = shell_exec('/tmp/myscript.php '.escapeshellarg($my_url).' '.escapeshellarg($my_refer));

Ответ 4

Изменить

$page = shell_exec('/tmp/my_script.php $my_url $my_refer');

к

$page = shell_exec('/tmp/my_script.php "'.$my_url.'" "'.$my_refer.'"');

Затем код будет терпеть пробелы в имени файла.

Ответ 5

Вы можете найти sprintf здесь:

$my_url="http://www.somesite.com/";
$my_refer="http://www.somesite.com/";
$page = shell_exec(sprintf('/tmp/my_script.php "%s" "%s"', $my_url, $my_refer));

Вы должны обязательно использовать escapeshellarg, как рекомендовано в других ответах, если вы не тот, кто подает вход.

Ответ 6

Мне было трудно с этим, поэтому я решил поделиться своим фрагментом кода.

До

$output = shell_exec("/var/www/sites/blah/html/blahscript.sh 2>&1 $host $command");

После

$output = shell_exec("/var/www/sites/blah/html/blahscript.sh 2>&1 $host {$command}");

Добавление скобок {} - это то, что исправлено для меня.

Также необходимо подтвердить escapeshellarg.

$host=escapeshellarg($host);
$command=escapeshellarg($command);

Кроме того, требуется script:

set host [lindex $argv 0]
set command [lindex $argv 1]