Передача переменных в 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'); 

Однако сценарий командной строки говорит, что он получил только один аргумент: /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]