2012-06-26 4 views
2

avez besoin d'aide avec le module pexpectbesoin peu d'aide avec module pexpect

J'ai écrit un code simple qui cloner un dépôt git à partir d'un serveur en utilisant ssh. Je suis confronté à quelques problèmes.

Le mot de passe est affiché en texte brut.

Je ne connais pas un moyen approprié de quitter le programme après le téléchargement. il jette l'erreur suivante ...

Traceback (most recent call last): 
File "ToDelete3.py", line 65, in <module> 
    # # if i == 1: 
File "ToDelete3.py", line 36, in getRepository 
    i = p.expect([ssh_key,'password:',pexpect.EOF]) 
File "/usr/lib/python2.7/dist-packages/pexpect.py", line 1492, in interact 
    self.__interact_copy(escape_character, input_filter, output_filter) 
File "/usr/lib/python2.7/dist-packages/pexpect.py", line 1520, in __interact_copy 
    data = self.__interact_read(self.child_fd) 
File "/usr/lib/python2.7/dist-packages/pexpect.py", line 1510, in __interact_read 
    return os.read(fd, 1000) 
OSError: [Errno 5] Input/output error 

le code que je l'ai écrit jusqu'à présent est:

command = 'git clone ssh://[email protected]/something.git' 
ssh_key = 'Are you sure you want to continue connecting' 

def gracefulExit(): 
    print 'Password Incorrect !!!' 
    os._exit(1) 

def getRepository(): 
    p = pexpect.spawn(command,maxread=10000,timeout = 100) 
    p.logfile = sys.stdout # logs out the command 
    i = p.expect([ssh_key,'password:',pexpect.EOF]) 
    if i == 0: 
     print 'Inside sshkey' 
     p.sendline('yes') 
     i = p.expect([ssh_key,'password:',pexpect.EOF]) 
    if i == 1: 
     try: 
      p.sendline('mypassword') # this mypassword is shown in clear text on the console 
      p.interact() 
      p.logfile = sys.stdout 
      p.expect(pexpect.EOF) 
     except Exception,e: 
      print str(e) 
      gracefulExit() 
    if i == 2: 
     print 'Inside EOF block' 
     if p.isalive(): 
      print '******************************************************' 
      print '   Closing the process of Download !!!   ' 
      print '******************************************************\n\n' 
      p.close() 

Toutes les entrées est très apprécié ..

Merci. -Vijay

Répondre

3

Il y a quelques erreurs dans le programme:

p.interact() 

Ceci est utilisé lorsque l'on veut récupérer le contrôle après avoir fourni automatiquement le mot de passe en utilisant le module de pexpect. Vous n'avez pas besoin de l'utiliser puisque vous automatisez l'ensemble du dépôt.

Également quelques éléments peuvent être améliorés, après avoir passé le mot de passe, définir un délai d'attente infini, car il peut prendre un certain temps pour copier un dépôt git.

p.expect(pexpect.EOF, timeout=None) 

Après que vous pouvez lire toutes les sorties d'exécution avec la commande suivante

output_lines = p.before 
output_lines_list = output_lines.split('\r\n') 
for line in output_lines: print line 

vous pouvez également utiliser le ci-dessus pour enregistrer la sortie vers un fichier en écrivant directement à lui

L'utilisation de p.logifile = sys.stdout n'est pas bonne car elle va enregistrer l'opération pexpect depuis le début, y compris le passage du mot de passe.

Après cela, il n'y a pas besoin de fermer, vous n'exécutez pas un programme interactif. Retirez toutes ces lignes:

if i == 2: 
     print 'Inside EOF block' 
     if p.isalive(): 
      print '******************************************************' 
      print '   Closing the process of Download !!!   ' 
      print '******************************************************\n\n' 
      p.close() 

Le problème est que certains où vous devez stocker le mot de passe et l'utiliser avec p.sendline. Quoi qu'il en soit, vous stockez le mot de passe, il va être non sécurisé. Vous pouvez également prendre l'entrée au début du mot de passe, de cette façon vous ne stockez pas le mot de passe dans votre programme mais cela annule l'automatisation. Je ne vois pas un moyen de sortir mais pour prendre d'entrée de mot de passe, vous pouvez faire:

import getpass 
getpass.getpass("please provide your password") 
+0

Merci Pyfunc qui a fonctionné comme une gemme. Merci pour l'explication détaillée aussi. Aide à mieux le comprendre .. Désolé pour la réponse tardive .. Oui cela a effectivement fonctionné .. Mais un problème bien.Il ne montre pas le mot de passe quand j'entre, mais après cela ressemble à p.logfile = sys.stdout imprime le mot de passe en texte clair dans le terminal. des façons d'éviter cela .. – user596922

+0

Cela aide. Merci !! – user596922

0

Pour se débarrasser du mot de passe étant echo'd à stdout, utilisez ce qui suit lors de la redirection de sortie -

p.logfile_read = sys.stdout # logs out the command 

J'ai essayé cela moi-même et semble fonctionner. Here est la référence pour cette révélation.