web-dev-qa-db-fra.com

Passer plusieurs variables PHP à Shell_exec ()?

J'appelle test.sh depuis PHP en utilisant la méthode 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');

Cependant, le script de ligne de commande indique qu'il n'a reçu qu'un seul argument: le fichier /tmp/my_script.php

Lorsque je change l'appel pour:

Code:

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

Il dit qu'il a reçu 3 arguments mais l'argv [1] et l'argv [2] sont vides.

Lorsque je change l'appel pour:

Code:

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

Le script reçoit enfin les 3 arguments comme prévu.

Devez-vous toujours envoyer du texte simplement cité avec le script et n'êtes pas autorisé à envoyer une variable comme $ var? Ou existe-t-il un moyen spécial d'envoyer un $ var?

19
user2314387

Il est nécessaire d'envoyer les arguments avec quota, vous devez donc les utiliser comme:

$page = Shell_exec("/tmp/my_script.php '".$my_url."' '".$my_refer."'");
15
Code Lღver

Changement

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

à

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

OR

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

Assurez-vous également d'utiliser escapeshellarg sur vos deux valeurs.

Exemple:

$my_url=escapeshellarg($my_url);
$my_refer=escapeshellarg($my_refer);
22
David Chen

Les variables ne seront pas interpolées à l'intérieur d'une seule chaîne entre guillemets. Vous devez également vous assurer que vos arguments sont correctement échappés.

 $page = Shell_exec('/tmp/myscript.php '.escapeshellarg($my_url).' '.escapeshellarg($my_refer));
9
Orangepill

Vous pourriez trouver sprintf utile ici:

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

Vous devez absolument utiliser escapeshellarg comme recommandé dans les autres réponses si vous n'êtes pas celui qui fournit l'entrée.

2
DaoWen

Changement

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

à

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

Ensuite, votre code tolérera les espaces dans le nom de fichier.

2
David Jashi

J'ai eu des difficultés avec cela, alors j'ai pensé partager mon extrait de code.

Avant

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

Après

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

Ajout du {} les parenthèses est ce qui l'a corrigé pour moi.

De plus, pour confirmer que escapeshellarg est également nécessaire.

$Host=escapeshellarg($Host);
$command=escapeshellarg($command);

Sauf script également nécessaire:

set Host [lindex $argv 0]
set command [lindex $argv 1]
2
bluenapalm