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

Python Discussion :

Creer un dialogue avec le shell ?


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 60
    Points : 38
    Points
    38
    Par défaut Creer un dialogue avec le shell ?
    Salut

    voilà je cherche à ecrire des choses dans le shell

    En faite je veux decompresser un rar mais protegé par un mot de passe

    Donc je voudrais faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    os.open=("unrar e a.rar")
    Apres cette commande le shell demande password, mon programme ecrit donc le pass et fait entré

    Et je lit le resultat donné par le shell ok ou pas ok

    Peut on creer un lien interactif avec le shell

    Merci

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 99
    Points : 102
    Points
    102
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    from subprocess import Popen
    mot_de_passe = 'mon mot de passe'
    output, error = Popen(["unrar", "e", "a.rar"], stdout=PIPE).communicate(mot_de_passe)
    Viola qui devrait (normalement) marcher. La méthode communicate va ecrire dans le shell pour passer les bonnes infos.

    Si tu as un soucis, va jeter un œil sur la doc du module subprocess, y'a plein d'exemple.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 60
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par shadowsam Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    from subprocess import Popen
    mot_de_passe = 'mon mot de passe'
    output, error = Popen(["unrar", "e", "a.rar"], stdout=PIPE).communicate(mot_de_passe)
    Viola qui devrait (normalement) marcher. La méthode communicate va ecrire dans le shell pour passer les bonnes infos.

    Si tu as un soucis, va jeter un œil sur la doc du module subprocess, y'a plein d'exemple.
    Merci beaucoup

    Sais tu comment recuperer la reponse en gros si c bon il sera ecrit

    J'aimerais recuperer et verifié qu'il soit bien ecrit
    Par contre si la reponse est différente je tue le process genre CTRL^C

    Merci de ton aide

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 99
    Points : 102
    Points
    102
    Par défaut
    Oops, je viens de voir une petite errreur dans le code que je t'ai donné.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    cmd = "unrar e a.rar".split()
    output, error = Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate(mot_de_passe)
    La sortie standard du shell va s'ecrir dans "output" et les erreurs dans "error".
    Il te suffit donc de tester "output" pour y trouver ce que tu cherches.

    Pour tuer ton process si besoin, il me semble qu'il y a une methode terminate. Dans ce cas la il faut que tu sauves ton pipe dans une variable.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    cmd = "unrar e a.rar".split()
    my_process = Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    output, error = my_process.communicate(mot_de_passe)
     
    if "error" in output:
      my_process.terminate()
    Ca donnerait un truc du genre, ton code.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 60
    Points : 38
    Points
    38
    Par défaut
    Merci beaucoup je test ce soir et te tiens au courant


  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 60
    Points : 38
    Points
    38
    Par défaut
    Ca marche pas

    Pour faire encore plus simple

    cree 2 fichier a et c

    puis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    from subprocess import Popen, call,PIPE
    import subprocess
     
    p1=Popen(["cp", "-i", "a","c"],stdout=PIPE,stderr=PIPE).communicate("y")
    cp demande si il faut ecraser c mais le y pour yes n'arrive jamais

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 99
    Points : 102
    Points
    102
    Par défaut
    Dans la doc à la section 'communicate' voila ce qu'on peut y lire :
    Note that if you want to send data to the process’s stdin, you need to create the Popen object with stdin=PIPE.
    Donc je dirais qu'il suffit de mettre "stdin=subprocess.PIPE" dans les paramètres de Popen.

    Je ne peux pas trop tester pour le moment, mais bon ca a l'air assez explicite.

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 60
    Points : 38
    Points
    38
    Par défaut
    je me suis dit aussi ca toute la nuit

    Mais rien j'ai tout testé et jamais réussi à valider la copie de fichier

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 99
    Points : 102
    Points
    102
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    import subprocess
    import os
    import sys
     
    os.chdir("C:\\")
    print "PWD:", os.getcwd()
     
    for file in ("test.txt", "test_2.txt"):
        fp = open(file,   'w')
        fp.write("test")
        fp.close()
     
    cmd = "C:\\WINDOWS\\system32\\xcopy.exe test.txt test_2.txt".split()
     
    process = subprocess.Popen(cmd, 
                               stdout=subprocess.PIPE,
                               stderr=subprocess.PIPE,
                               stdin=subprocess.PIPE)
    output,error = process.communicate("O")
     
    print output
    print >> sys.stderr, error
    Retour:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    PWD: C:\
    Remplacer C:\test_2.txt (Oui/Non/Tous)? O
    C:test.txt
    1 fichier(s) copi‚(s)
    Voila, ce code là marche chez moi. Je suis sous Windows, donc peut être qu'il y a une petite subtilité entre les deux OS qui expliquerait pourquoi chez toi ca ne marche pas.

    Si les linux-ien ont une solution elle sera la bienvenue.

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 60
    Points : 38
    Points
    38
    Par défaut
    rien a faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    import subprocess
    import sys
    from subprocess import Popen
    cmd = "cp -i a b".split()
    my_process = subprocess.Popen(cmd,
                               stdout=subprocess.PIPE,
                               stderr=subprocess.PIPE,
                               stdin=subprocess.PIPE)
     
    output, error = my_process.communicate("o")
    print output
    print >> sys.stderr, error
    La sortie

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     python pass.py
     
    cp: écraser `b'?
    le o n'est jamais envoyé

  11. #11
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Points : 923
    Points
    923
    Par défaut
    Il faut rajouter un retour à la ligne (simuler un appui sur entrer)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    output, error = my_process.communicate("o\n")
    Chez moi (Ubuntu 8.04) ça fonctionne.

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 60
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par oiffrig Voir le message
    Il faut rajouter un retour à la ligne (simuler un appui sur entrer)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    output, error = my_process.communicate("o\n")
    Chez moi (Ubuntu 8.04) ça fonctionne.
    Mais quel C..

    Evidemment j'y avais pas pensé

    Ca marche impec pour le cp
    Par contre sais tu pourquoi ca ne marche pas pour decompresser
    Cree un a.rar avec mot de passe 123
    essai ca

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    import subprocess
    import sys
    from subprocess import Popen
    cmd = "rar e a.rar".split()
    my_process = subprocess.Popen(cmd,
                               stdout=subprocess.PIPE,
                               stderr=subprocess.PIPE,
                               stdin=subprocess.PIPE)
     
    output, error = my_process.communicate("123\n")
    print output
    print >> sys.stderr, error
    Il attend et tu peux taper le mot de passe, mais tout seul il ne le fait pas

  13. #13
    Membre éclairé
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Points : 773
    Points
    773
    Par défaut
    peut-être la commande envoyée pour decompresser met plus de temps avant de demander un input que la commande cp... peut-être faudrait-il verifier l'output jusqu'a ce que le mot de passe soit demandé, puis communiquer ce dernier.

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    99
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 99
    Points : 102
    Points
    102
    Par défaut
    Normalement il n'y a pas besoin.

    Tant que "communicate" n'a pas été appelé, la commande ne se lance pas. C'est l'appel a cette API qui "lance" la commande et dialogue avec elle au besoin.

    Je ne comprends pas pourquoi cela ne marche pas alors que dans le cas d'un "cp" normal il n'y a pas de soucis. Et je ne peux rien tester, sous windows ca passe parfaitement.

Discussions similaires

  1. [API Shell] Dialogue avec la console
    Par Jose.N70 dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 21/11/2013, 01h34
  2. Dialoguer avec le shell d'un serveur en ssh
    Par Sylver--- dans le forum Langage
    Réponses: 3
    Dernier message: 20/12/2006, 09h03
  3. Boite de dialogue avec opengl
    Par inddzen dans le forum OpenGL
    Réponses: 3
    Dernier message: 23/04/2004, 20h25
  4. [Debutant] comment creer un Executable avec Jbuilder
    Par JavaEli dans le forum JBuilder
    Réponses: 10
    Dernier message: 29/03/2004, 11h22
  5. dialoguer avec un serveur RADIUS
    Par jypee76 dans le forum Développement
    Réponses: 4
    Dernier message: 12/08/2003, 10h06

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