Передача переменных в 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');
однако сценарий командной строки говорит, что он получил только 1 аргумент: /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?
6 ответов
необходимо отправить аргументы с квотой, поэтому вы должны использовать его как:
$page = shell_exec("/tmp/my_script.php '".$my_url."' '".$my_refer."'");
изменить
$page = shell_exec('/tmp/my_script.php $my_url $my_refer');
to
$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');
to
$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]