Apache et windows->recuperer sortie com mande exec()
6 réponses
Thierry B.
Bonjour,
j'ai un petit problème avec un script que j'essaie d'utiliser sur
windows qui utilise la commande exec('commande', $retour). Sous Windows,
$retour est toujour vide. Par exemple un simple
>exec('netstat', $retour);
>echo $retour;
$retour est un tableau, mais toujours vide.
--
Thierry B.
"Bon, je vais aller péter ailleurs" (mon fils, 6 ans)
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Olivier Miakinen
j'ai un petit problème avec un script que j'essaie d'utiliser sur windows qui utilise la commande exec('commande', $retour). Sous Windows, $retour est toujour vide. Par exemple un simple
exec('netstat', $retour); echo $retour;
$retour est un tableau, mais toujours vide.
Peut-être que le PATH (chemin d'accès aux commandes) n'est pas configuré de la même manière en interactif et depuis un script PHP, et que du coup il ne trouve pas la commande ?
Quelques idées pour progresser dans le diagnostic :
- au lieu d'appeler la commande netstat, appelle un script (ou batch) ou bien une commande très longue, afin de voir si la commande est bien appelée ;
- récupérer le 3e paramètre de la fonction exec() (return_var) ;
- essayer avec passthru().
-- Olivier Miakinen Aidez Saburi à rester près de sa famille et poursuivre ses études en France, signez la pétition : <http://www.fcpe94.ouvaton.org/article_petition.php3?id_article=9>
j'ai un petit problème avec un script que j'essaie d'utiliser sur
windows qui utilise la commande exec('commande', $retour). Sous Windows,
$retour est toujour vide. Par exemple un simple
exec('netstat', $retour);
echo $retour;
$retour est un tableau, mais toujours vide.
Peut-être que le PATH (chemin d'accès aux commandes) n'est pas configuré
de la même manière en interactif et depuis un script PHP, et que du coup
il ne trouve pas la commande ?
Quelques idées pour progresser dans le diagnostic :
- au lieu d'appeler la commande netstat, appelle un script (ou batch) ou
bien une commande très longue, afin de voir si la commande est bien
appelée ;
- récupérer le 3e paramètre de la fonction exec() (return_var) ;
- essayer avec passthru().
--
Olivier Miakinen
Aidez Saburi à rester près de sa famille et poursuivre ses études
en France, signez la pétition :
<http://www.fcpe94.ouvaton.org/article_petition.php3?id_article=9>
j'ai un petit problème avec un script que j'essaie d'utiliser sur windows qui utilise la commande exec('commande', $retour). Sous Windows, $retour est toujour vide. Par exemple un simple
exec('netstat', $retour); echo $retour;
$retour est un tableau, mais toujours vide.
Peut-être que le PATH (chemin d'accès aux commandes) n'est pas configuré de la même manière en interactif et depuis un script PHP, et que du coup il ne trouve pas la commande ?
Quelques idées pour progresser dans le diagnostic :
- au lieu d'appeler la commande netstat, appelle un script (ou batch) ou bien une commande très longue, afin de voir si la commande est bien appelée ;
- récupérer le 3e paramètre de la fonction exec() (return_var) ;
- essayer avec passthru().
-- Olivier Miakinen Aidez Saburi à rester près de sa famille et poursuivre ses études en France, signez la pétition : <http://www.fcpe94.ouvaton.org/article_petition.php3?id_article=9>
Thierry B.
Peut-être que le PATH (chemin d'accès aux commandes) n'est pas configuré de la même manière en interactif et depuis un script PHP, et que du coup il ne trouve pas la commande ?
Quelques idées pour progresser dans le diagnostic :
- au lieu d'appeler la commande netstat, appelle un script (ou batch) ou bien une commande très longue, afin de voir si la commande est bien appelée ;
- récupérer le 3e paramètre de la fonction exec() (return_var) ;
- essayer avec passthru().
OK,
merci pour les pistes. J'ai cerné le problème, sans déterminer la cause. Ce n'est pas un problème de path , j'ai essayé le chemin direct aussi. J'ai essayé system, exec, passthru. Apparemment rien n'y fait, cela dépend du programme lancé (Dans mon exemple, il y a une erreur, 'netstat' est en fait un des cas qui marchent).
exemple sous dos, je prend n'importe quel exécutable :
Hardlink - JCB ¸ 2000 ===================== Syntaxe : --------- hardlink : le nom du fichier ou dossier pour lequel on veut crer un lien : l'emplacement du lien 1
Cà marche. Je prend un autre programme, en l'occurence celui dont je veux me servir, mais j'en ai trouvé d'autres dans ce cas :
??? Et apparemment c'est comme cela pour plein de programmes DOS. Pour certain la sortie est récupérée en PHP, pour d'autre non.
Détail intéressant, si je lance ces même commandes en interactif :
phpcli test.php
test.php contenant les commandes exec et print, j'ai d'abord la sortie de la commande 'rlog.exe', donc elle est bien éxécutée, puis après :
Array ( ) donc il n'a pas pu récupérer la sortie. Je me demande si quelque chose
dans les binaires DOS, la fàçon dont ils ont été compilé ou la fàcon dont les sorties sont gérées, j'en sais rien, n'influe pas sur la capacité de PHP sous windows a récupérer 'stdout'.
Quand au code de retour de la commande passtru , je ne sais pas trop quoi en penser. Dans l'exemple précédent, si je remplace exec par passthru, j'ai -1, ce qui voudrai dire que la commande n'a pas été exécutée (?), mais lancé en interactif j'ai 1, ce qui voufrait dire que çà a marché. Mais pourtant en interactif avec exec $output restait vide. De plus avec netstat le code de retour est 0, ce qui pour moi représente false, alors que la commande a réussi. A moins que çà ne soit bien exploité que sous Unix ?
Peut-être que le PATH (chemin d'accès aux commandes) n'est pas configuré
de la même manière en interactif et depuis un script PHP, et que du coup
il ne trouve pas la commande ?
Quelques idées pour progresser dans le diagnostic :
- au lieu d'appeler la commande netstat, appelle un script (ou batch) ou
bien une commande très longue, afin de voir si la commande est bien
appelée ;
- récupérer le 3e paramètre de la fonction exec() (return_var) ;
- essayer avec passthru().
OK,
merci pour les pistes. J'ai cerné le problème, sans déterminer la cause.
Ce n'est pas un problème de path , j'ai essayé le chemin direct aussi.
J'ai essayé system, exec, passthru. Apparemment rien n'y fait, cela
dépend du programme lancé (Dans mon exemple, il y a une erreur,
'netstat' est en fait un des cas qui marchent).
exemple sous dos, je prend n'importe quel exécutable :
Hardlink - JCB ¸ 2000 ===================== Syntaxe : --------- hardlink : le nom du fichier ou dossier pour lequel on veut crer un lien : l'emplacement du lien 1
Cà marche. Je prend un autre programme, en l'occurence celui dont je
veux me servir, mais j'en ai trouvé d'autres dans ce cas :
??? Et apparemment c'est comme cela pour plein de programmes DOS. Pour
certain la sortie est récupérée en PHP, pour d'autre non.
Détail intéressant, si je lance ces même commandes en interactif :
phpcli test.php
test.php contenant les commandes exec et print, j'ai d'abord la sortie
de la commande 'rlog.exe', donc elle est bien éxécutée, puis après :
Array ( )
donc il n'a pas pu récupérer la sortie. Je me demande si quelque chose
dans les binaires DOS, la fàçon dont ils ont été compilé ou la fàcon
dont les sorties sont gérées, j'en sais rien, n'influe pas sur la
capacité de PHP sous windows a récupérer 'stdout'.
Quand au code de retour de la commande passtru , je ne sais pas trop
quoi en penser. Dans l'exemple précédent, si je remplace exec par
passthru, j'ai -1, ce qui voudrai dire que la commande n'a pas été
exécutée (?), mais lancé en interactif j'ai 1, ce qui voufrait dire que
çà a marché. Mais pourtant en interactif avec exec $output restait vide.
De plus avec netstat le code de retour est 0, ce qui pour moi représente
false, alors que la commande a réussi. A moins que çà ne soit bien
exploité que sous Unix ?
Peut-être que le PATH (chemin d'accès aux commandes) n'est pas configuré de la même manière en interactif et depuis un script PHP, et que du coup il ne trouve pas la commande ?
Quelques idées pour progresser dans le diagnostic :
- au lieu d'appeler la commande netstat, appelle un script (ou batch) ou bien une commande très longue, afin de voir si la commande est bien appelée ;
- récupérer le 3e paramètre de la fonction exec() (return_var) ;
- essayer avec passthru().
OK,
merci pour les pistes. J'ai cerné le problème, sans déterminer la cause. Ce n'est pas un problème de path , j'ai essayé le chemin direct aussi. J'ai essayé system, exec, passthru. Apparemment rien n'y fait, cela dépend du programme lancé (Dans mon exemple, il y a une erreur, 'netstat' est en fait un des cas qui marchent).
exemple sous dos, je prend n'importe quel exécutable :
Hardlink - JCB ¸ 2000 ===================== Syntaxe : --------- hardlink : le nom du fichier ou dossier pour lequel on veut crer un lien : l'emplacement du lien 1
Cà marche. Je prend un autre programme, en l'occurence celui dont je veux me servir, mais j'en ai trouvé d'autres dans ce cas :
??? Et apparemment c'est comme cela pour plein de programmes DOS. Pour certain la sortie est récupérée en PHP, pour d'autre non.
Détail intéressant, si je lance ces même commandes en interactif :
phpcli test.php
test.php contenant les commandes exec et print, j'ai d'abord la sortie de la commande 'rlog.exe', donc elle est bien éxécutée, puis après :
Array ( ) donc il n'a pas pu récupérer la sortie. Je me demande si quelque chose
dans les binaires DOS, la fàçon dont ils ont été compilé ou la fàcon dont les sorties sont gérées, j'en sais rien, n'influe pas sur la capacité de PHP sous windows a récupérer 'stdout'.
Quand au code de retour de la commande passtru , je ne sais pas trop quoi en penser. Dans l'exemple précédent, si je remplace exec par passthru, j'ai -1, ce qui voudrai dire que la commande n'a pas été exécutée (?), mais lancé en interactif j'ai 1, ce qui voufrait dire que çà a marché. Mais pourtant en interactif avec exec $output restait vide. De plus avec netstat le code de retour est 0, ce qui pour moi représente false, alors que la commande a réussi. A moins que çà ne soit bien exploité que sous Unix ?
??? Et apparemment c'est comme cela pour plein de programmes DOS. Pour certain la sortie est récupérée en PHP, pour d'autre non.
C'est peut-être alors la différence entre stdout et stderr. La commande exec ne semble pas fournir le moyen de récupérer séparément le flux de sortie et le flux d'erreur.
Essaye ceci (syntaxe Unix, je ne sais pas si cela marche pour DOS) : exec('C:cvsrlog.exe 2>&1', $output); print_r($output);
Tu peux aussi tenter : exec('C:cvsrlog.exe >stdout.txt 2>stderr.txt'); puis regarder le contenu des fichiers stdout.txt et stderr.txt
-- Olivier Miakinen Aidez Saburi à rester près de sa famille et poursuivre ses études en France, signez la pétition : <http://www.fcpe94.ouvaton.org/article_petition.php3?id_article=9>
??? Et apparemment c'est comme cela pour plein de programmes DOS. Pour
certain la sortie est récupérée en PHP, pour d'autre non.
C'est peut-être alors la différence entre stdout et stderr. La commande
exec ne semble pas fournir le moyen de récupérer séparément le flux de
sortie et le flux d'erreur.
Essaye ceci (syntaxe Unix, je ne sais pas si cela marche pour DOS) :
exec('C:\cvs\rlog.exe 2>&1', $output);
print_r($output);
Tu peux aussi tenter :
exec('C:\cvs\rlog.exe >stdout.txt 2>stderr.txt');
puis regarder le contenu des fichiers stdout.txt et stderr.txt
--
Olivier Miakinen
Aidez Saburi à rester près de sa famille et poursuivre ses études
en France, signez la pétition :
<http://www.fcpe94.ouvaton.org/article_petition.php3?id_article=9>
??? Et apparemment c'est comme cela pour plein de programmes DOS. Pour certain la sortie est récupérée en PHP, pour d'autre non.
C'est peut-être alors la différence entre stdout et stderr. La commande exec ne semble pas fournir le moyen de récupérer séparément le flux de sortie et le flux d'erreur.
Essaye ceci (syntaxe Unix, je ne sais pas si cela marche pour DOS) : exec('C:cvsrlog.exe 2>&1', $output); print_r($output);
Tu peux aussi tenter : exec('C:cvsrlog.exe >stdout.txt 2>stderr.txt'); puis regarder le contenu des fichiers stdout.txt et stderr.txt
-- Olivier Miakinen Aidez Saburi à rester près de sa famille et poursuivre ses études en France, signez la pétition : <http://www.fcpe94.ouvaton.org/article_petition.php3?id_article=9>
??? Et apparemment c'est comme cela pour plein de programmes DOS. Pour certain la sortie est récupérée en PHP, pour d'autre non.
C'est peut-être alors la différence entre stdout et stderr. La commande exec ne semble pas fournir le moyen de récupérer séparément le flux de sortie et le flux d'erreur.
Essaye ceci (syntaxe Unix, je ne sais pas si cela marche pour DOS) : exec('C:cvsrlog.exe 2>&1', $output); print_r($output);
Tu peux aussi tenter : exec('C:cvsrlog.exe >stdout.txt 2>stderr.txt'); puis regarder le contenu des fichiers stdout.txt et stderr.txt
Je crois que je viens de trouver "malheureusement" la solution, passer à Apache 2 (à essayer) :
??? Et apparemment c'est comme cela pour plein de programmes DOS. Pour
certain la sortie est récupérée en PHP, pour d'autre non.
C'est peut-être alors la différence entre stdout et stderr. La commande
exec ne semble pas fournir le moyen de récupérer séparément le flux de
sortie et le flux d'erreur.
Essaye ceci (syntaxe Unix, je ne sais pas si cela marche pour DOS) :
exec('C:\cvs\rlog.exe 2>&1', $output);
print_r($output);
Tu peux aussi tenter :
exec('C:\cvs\rlog.exe >stdout.txt 2>stderr.txt');
puis regarder le contenu des fichiers stdout.txt et stderr.txt
Je crois que je viens de trouver "malheureusement" la solution, passer à
Apache 2 (à essayer) :
??? Et apparemment c'est comme cela pour plein de programmes DOS. Pour certain la sortie est récupérée en PHP, pour d'autre non.
C'est peut-être alors la différence entre stdout et stderr. La commande exec ne semble pas fournir le moyen de récupérer séparément le flux de sortie et le flux d'erreur.
Essaye ceci (syntaxe Unix, je ne sais pas si cela marche pour DOS) : exec('C:cvsrlog.exe 2>&1', $output); print_r($output);
Tu peux aussi tenter : exec('C:cvsrlog.exe >stdout.txt 2>stderr.txt'); puis regarder le contenu des fichiers stdout.txt et stderr.txt
Je crois que je viens de trouver "malheureusement" la solution, passer à Apache 2 (à essayer) :