Я вызываю 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');
Однако сценарий командной строки говорит, что он получил только один аргумент: /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/"');
Скрипт, наконец, получает все 3 аргумента, как предполагалось.
Вам всегда нужно отправлять только цитируемый текст со сценарием и не разрешено отправлять переменную типа $ 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);
Кроме скрипта также необходимо:
set host [lindex $argv 0] set command [lindex $argv 1]