2013-06-05 15 views
14

Wzywam test.sh z PHP przy użyciu metody shell_exec.Przekazywanie zmiennych do 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'); 

Jednak skrypt z linii poleceń twierdzi, że otrzymał tylko 1 argument: /tmp/my_script.php

Kiedy zmienić wywołanie:

Kod:

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

Mówi, że otrzymał 3 argumenty, ale argv [1] i argv [2] są puste.

Kiedy zmienić wywołanie:

Kod:

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

Skrypt wreszcie odbiera wszystkie 3 argumenty zgodnie z przeznaczeniem.

Czy zawsze musisz wysłać tekst ze skryptem i nie możesz wysłać zmiennej takiej jak $ var? Czy istnieje jakiś specjalny sposób wysłania $ var?

Odpowiedz

11

Istnieje potrzeba, aby wysłać argumenty z kontyngentu więc należy go używać jak:

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

To działa – user2314387

+1

Jak czytasz te w my_script.php? –

+0

tak, jak pobrać te parametry w "/tmp/my_script.php"? –

16

Zmień

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

do

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

LUB

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

Również upewnić się używać escapeshellarg na obu twoich wartościach.

Przykład:

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

PHP tylko zanalizować '$' zmienne owinięta cudzysłów ('" ') –

+2

również upewnić się sanatize z escapseshellarg – Orangepill

+0

Zobacz docs dla. różnice między ciągami jedno- i podwójnie cudzysłowionymi: http://php.net/manual/en/language.types.string.php – DaoWen

2

Zmień

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

do

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

Następnie kod będzie tolerował spacje w nazwie pliku.

+0

Tak, robię to celowo. Mój prawdziwy błąd polegał na tym, że zapomniałem wyjąć '$ my_url' i' $ my_refer' z ciągu znaków. –

6

Zmienne nie będą interpolować wewnątrz pojedynczego cudzysłowu. Powinieneś również upewnić się, że twoje argumenty są poprawnie usunięte.

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

Dzięki Orangepill .. To działa – user2314387

2

Można znaleźć sprintf pomocny tutaj:

$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)); 

powinno się używać escapeshellarg zalecany w innych odpowiedzi, jeśli nie jesteś jednym dostarczanie wejście.

2

Miałem trudności z tym, więc pomyślałem, że udostępnię mój fragment kodu.

Przed

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

Po

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

Dodawanie wsporniki {} co jest stałe to dla mnie.

Również w celu potwierdzenia escapeshellarg jest również potrzebna.

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

wyjątkiem scenariusza potrzebne także:

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