IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

proc_open et données stdout


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2014
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2014
    Messages : 253
    Points : 164
    Points
    164
    Par défaut proc_open et données stdout
    Bonjour,

    Dans la continuité de ce post :
    https://www.developpez.net/forums/d2...-commande-dir/

    Je constate maintenant que passthru($cmd) n'exécute pas toutes les commandes dos lorsque php est utilité en tant que module apache (pages web) problème de droits utilisateur. (y a t il une solution pour cela ?). Du coup je passe par proc_open() qui marche dans tous les cas. Par contre comme j'essaie de lire les données texte sur la sortie de la commande dos, j'ai besoin de les lire dans le format de texte adéquat soit UTF8 (format d'origine du texte). Pour cela comme indiqué dans le post initial (voir lien au dessus) j'utilise une commande précédée de chcp 65001 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $cmd="chcp 65001 & DIR /-C \"".$chemin."\""
    Lorsque cette commande est envoyée sur proc_open, cela fonctionne mais le texte récupéré à l'aide de la fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    stream_get_contents($ressource_proc);
    n'est pas au format attendu soit UTF-8 mais transformé dans un autre format qui détruit les symboles spéciaux comme é, €... : je n'arrive pas à trouver le format de conversion et je pense que la conversion est destructive au final.

    En revanche lorsque la commande dos est redirigée vers le fichier "output.txt" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $cmd="chcp 65001 & DIR /-C \"".$chemin."\" > output.txt"
    celui-ci donne bien le résultat attendu : le texte dans le format UTF-8 sans aucune transformation ni erreur. Je ne comprends pas pourquoi je n'obtiens pas les mêmes résultats dans les deux cas et je souhaite trouver une solution évitant la création de fichiers ce qui alourdit le programme inutilement.

  2. #2
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2014
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2014
    Messages : 253
    Points : 164
    Points
    164
    Par défaut
    Existe t il une option des lignes de commandes dos ou de php qui permettrait de supprimer la ligne de commande envoyée en sortie proc_open() ou passthru() ? Je ne me rappelle plus comment faire et peut être que cela peut résoudre le problème...

  3. #3
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2020
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2020
    Messages : 35
    Points : 119
    Points
    119
    Par défaut
    Salut,

    Si c'est pour du web, pense à définir le charset avant l'affichage.
    Sinon chez moi, le code suivant a l'air de fonctionner avec cmd /u.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    header('Content-Type: text/plain; charset=utf-16');
    header('X-Content-Type-Options: nosniff');
     
    $path = "C:/fichiers/au/nom/difficile/à/afficher/";
    if(is_dir($path)){
        $dir = escapeshellarg($path);
        passthru("CMD /U /C DIR {$dir} /A:-D-H-S-L /-C /L");
    }

  4. #4
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2014
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2014
    Messages : 253
    Points : 164
    Points
    164
    Par défaut
    Bonjour,

    Ce dernier code ne fonctionne pas passthru ne retourne rien lorsque lancé depuis le navigateur internet là dessus je n'ai pas de changements.

    En revanche la commande précédée de CMD /U /C permet effectivement de supprimer les premières lignes retournées par proc_open(). Mais le résultat est inchangé. Je pense comprendre que le problème vient de l'envoi de la commande à proc_open() qui est formatée en ISO-8859-1 puisque :

    Pour cette commande lancée sous dos :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "CMD /U /C chcp 65001 & dir /-C /O:G \"".$chemin_dossier_avec_accent_aigu_é."\" 2>&1"
    J'obtiens l'affichage des répertoires et fichiers alors que cette même commande exécutée par proc_open() affiche dans la fenêtre dos :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     Le volume dans le lecteur \\192.168.1.50\chemin_dossier_avec_accent_aigu_é
     Le numéro de série du volume est 020D-B6BA
     
     Répertoire de \\192.168.1.50\chemin_dossier_avec_accent_aigu_é
     
    Fichier introuvable
    Comme si la ligne de commande exécutée était d'abord traduite dans un autre codage qui détruit les accents, (pas ce problèmes avec passthru()).

  5. #5
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2020
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2020
    Messages : 35
    Points : 119
    Points
    119
    Par défaut
    De mémoire lorsque plusieurs commandes sont passées à cmd /c, elles doivent être entourées de guillemets supplémentaires (les joies du shell windows).
    De plus, le /u devrait (peut-être) te permettre de te passer du chcp 65001. Pour le reste, je ne saurais dire...
    Si l'erreur ne vient pas de là, tu devrais peut-être essayer escapeshellarg sur ton répertoire, un peu comme dans mon exemple.
    La fonction escapeshellarg qui entre autres choses rajoute... des guillemets.

  6. #6
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2014
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2014
    Messages : 253
    Points : 164
    Points
    164
    Par défaut
    Oui peut être sans chpc 65001, mais dans ce cas je n'arrive pas à exploiter la sortie texte de proc_open() comme je le faisait avec chcp 65001 : explode(PHP_EOL,$sortie_texte) ne semble pas me retourner le tableau attendu, pourtant lorsque je sauve le résultat de la commande dans un fichier texte, effectivement celui-ci semble bien encodé en UTF-8 sans erreur (apparemment) au niveau des caractères spéciaux €,é....

    En fait sous dos l'affichage du résultat est bizzarrd les caractères sont espacés :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    L e   v o l u m e   d a n s   l e   l e c t e u r   \ \ 1 9 2 . 1 6 8 . 1 . 5 0 \D D D D
       L e   n u m  r o   d e   s  r i e   d u   v o l u m e   e s t   0 2 0 S - F F F F 
     
       R  p e r t o i r e   d e   \ \ 1 9 2 . 1 6 8 . 1 . 5 0 \ D D D D 
     
     1 9 7 0 - 0 1 - 1 7     2 2 : 0 2         < D I R >                     .
     1 9 7 0 - 0 1 - 1 1     2 2 : 4 4         < D I R >                     . .
    etc....
    Alors que sauvegardé dans un fichier texte, j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     Le volume dans le lecteur \\192.168.1.50\DDDD s’appelle DDDD
     Le numéro de série du volume est 020D-FFFF
     
     Répertoire de \\192.168.1.50\DDDD
     
    1970-01-17  22:02    <DIR>          .
    1970-01-11  22:44    <DIR>          ..
    1970-01-23  14:42    <DIR>          gérant
    2020-04-26  11:43    <DIR>          Nouveau dossier
    etc...

  7. #7
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2014
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2014
    Messages : 253
    Points : 164
    Points
    164
    Par défaut
    En fait le texte en retour de la commande CMD /U /C est en utf16-LE. Il faut le convertir en UTF-8.
    Mais certains noms de dossiers ne passent toujours pas, je pense que proc_open() traduit le charset de la commande en ISO ou autre donc j'ai l'impression qu'il n'y a pas de solution à cause de cela sauf en utilisant passthru() mais qui ne fonctionne pas lorsqu'utilisé dans une page web...

Discussions similaires

  1. Récupérer les données sortantes avec proc_open
    Par xounet dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 03/08/2020, 22h46
  2. Récupérer les données sortantes avec proc_open
    Par xounet dans le forum Langage
    Réponses: 2
    Dernier message: 03/08/2020, 22h45
  3. compression de données du point de vue algorithmique
    Par GoldenEye dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 26/06/2002, 16h51
  4. [Kylix] Sauvegarde de donnée utilisateur....
    Par Eclypse dans le forum EDI
    Réponses: 1
    Dernier message: 11/05/2002, 18h21
  5. Comparer des fichiers de données : Quel Langage ?
    Par Anonymous dans le forum Langages de programmation
    Réponses: 6
    Dernier message: 24/04/2002, 23h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo