Jean-Francois Ortolo
2008-06-06 20:18:07 UTC
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
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