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?
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."'");
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);
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));
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.
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.
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]