Discussion:
J'ai un probleme avec la fonction syste m()
(trop ancien pour répondre)
Jean-Francois Ortolo
2008-06-06 20:18:07 UTC
Permalink
Bonjour

J'ai besoin de lancer un script Shell à partir d'un script PHP.

Je sais que la fonction adéquate pour cela, est la fonction system()

La fonction $res = system($cmd, $output) rend false dans $ret quand
il y a une erreur, ainsi que le type d'erreur dans la variable $output.

Moi, $ret ne me rend rien ( chaîne vide ), et $output a la valeur 0.

Cependant, ll semble que le script lancé ne s'exécute pas.

la commande $cm est affectée avec ceci: $cmd = "/bin/sh ". $arg;

ou $arg = "script1.sh"; script1.sh est le nom du script Shell à
lancer, qui d'ailleurs a la la 1ère ligne comme cela:
#/bin/sh ( je ne sais pas si ça ne fait pas double emploi avec le
shell /bin/sh du début de $cmd, mais il paraît que l'utilisateur nobody
n'a pas la permission de lancer un shell, alors... )

Donc, voici mon script PHP:

<html>
<head>
<meta http-equiv="Pragma" content="no-cache">
<title>Mise à jour des pronostics de Jean-Francois Ortolo</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<?php

// On affiche toutes les erreurs.
ini_set('display_errors', true);
error_reporting(E_ALL);

set_time_limit(6000);

echo " Bonjour, mise a jour des stats sur le site de
Jean-Francois Ortolo.<br>\n";
echo " Veuillez patienter, cela peut prendre quelque
minutes...<br>\n";

$arg = "script1.sh";
$ret = system("/bin/sh ". escapeshellarg($arg), $output);

/* if($ret === false)
{ */
echo "Erreur dans la fonction system: ret = " . $ret . ", output =
" . $output . "<br>\n";
/* exit(-1);
} */

echo " Mise a jour des stats effectuée.<br>\n";

echo " Mise à jour des pronostics de Jean-Francois
Ortolo<br> sur le site www.lescourses.com.<br>\n";

include("script2.php");

echo " La mise a jour des pronostics est terminée.<br>\n";

?>
</body>
</html>


Je ne comprend pas comment ce script script1.php pourrait ne pas
s'exécuter, vu qu'apparemment il n'y a pas d'erreur avec system(), et
que j'ai pris la précaution d'utiliser la fonction escapeshellarg() pour
l'argument.

Le script PHP ci-dessus, est lancé à distance par un navigateur
client classique, le serveur Apache tourne sous l'utilisateur nobody, et
l'interpréteur PHP est compilé comme module externe.

Toutes les permissions de tous les répertoires parents sont à 777, et
les permissions des scripts sont à 755 ( exécution et lecture pour le
groupe et les autres, exécution lecture et écriture pour l'utilisateur ).

Le serveur est dédié et c'est une distro Linux RedHat 7.2 ( ça ne
nous rajeunit pas :( ).

L'interpréteur PHP est la version 4.4.2.

Merci pour votre aide.

Bien à vous.

Amicalement.

Jean-François Ortolo
Denis Beauregard
2008-06-07 08:25:27 UTC
Permalink
Le 06 Jun 2008 20:18:07 GMT, Jean-Francois Ortolo
Post by Jean-Francois Ortolo
Je sais que la fonction adéquate pour cela, est la fonction system()
Cependant, ll semble que le script lancé ne s'exécute pas.
Certains hébergeurs ont désactivé system() pour des raisons de
sécurité.


Denis
Thoane
2008-06-07 08:25:27 UTC
Permalink
Post by Jean-Francois Ortolo
J'ai besoin de lancer un script Shell à partir d'un script PHP.
Je sais que la fonction adéquate pour cela, est la fonction system()
La fonction $res = system($cmd, $output) rend false dans $ret quand
il y a une erreur, ainsi que le type d'erreur dans la variable
$output.
Moi, $ret ne me rend rien ( chaîne vide ), et $output a la valeur 0.
Bonjour,

Revois la doc pour system(), dans ton appel c'est $output qui contient
le code retour et $res contient la dernière ligne renvoyée par ton script.
Utilise plutôt exec :

exec( $cmd, $output, $res );

Qui renvoit elle aussi la dernière ligne.

Voir: http://www.php.net/system http://www.php.net/exec
--
Thoane, turfiste
Jean-Francois Ortolo
2008-06-07 08:25:27 UTC
Permalink
Je me répond à moi-même

J'ai essayé la fonction shell_exec() , qui rend ce qui est affiché
par le script Shell en paramètre,

et il semble que quand le Safe Mode est à Off ( c'est mon cas ),

il n'y ait pas de restrictions sérieuses sur le script Shell déclenché.

Le PATH ne contenant pas le répertoire courant, j'ai été obligé de
spécifier le nom du script de cette manière:

$output = shell_exec("./script1.sh");

Tout ce qui est affiché par le script Shell est renvoyé dans la
variable $output, mais bufferisé en une seule ligne, sans sauts de ligne.

Egalement, le script Shell peut apparemment contenir des appels à
d'autre programmes ( pas seulement des commandes Shell ), et également
des redirection telles que > ou >> vers un fichier texte.

La variable $? donnant le code de retour de chaque commandes dans le
script, est bien alimentée.

Donc au final, mon problème est résolu.

Bien à vous.

Amicalement.

Jean-François Ortolo
Jean-Francois Ortolo
2008-06-07 17:37:54 UTC
Permalink
Bonjour

A tous ceux qui m'ont aidé dans la résolution de ce problème.

Merci beaucoup de votre aide.

Bien à vous.

Amicalement.

Jean-François Ortolo

Continuer la lecture sur narkive:
Loading...