Ответ 1
Необходимо отправить аргументы с квотой, чтобы вы могли использовать ее как:
$page = shell_exec("/tmp/my_script.php '".$my_url."' '".$my_refer."'");
Я вызываю 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?
Необходимо отправить аргументы с квотой, чтобы вы могли использовать ее как:
$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");
ИЛИ
$page = shell_exec('/tmp/my_script.php "'.$my_url.'" "'.$my_refer.'"');
Также не забудьте использовать escapeshellarg
для обоих ваших значений.
Пример:
$my_url=escapeshellarg($my_url);
$my_refer=escapeshellarg($my_refer);
Переменные не будут интерполировать внутри одной кавычки. Также вы должны убедиться, что ваши аргументы правильно экранированы.
$page = shell_exec('/tmp/myscript.php '.escapeshellarg($my_url).' '.escapeshellarg($my_refer));
Изменить
$page = shell_exec('/tmp/my_script.php $my_url $my_refer');
к
$page = shell_exec('/tmp/my_script.php "'.$my_url.'" "'.$my_refer.'"');
Затем код будет терпеть пробелы в имени файла.
Вы можете найти 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
, как рекомендовано в других ответах, если вы не тот, кто подает вход.
Мне было трудно с этим, поэтому я решил поделиться своим фрагментом кода.
До
$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]