2011-12-05 8 views
1

J'essaye de SFTP un fichier en utilisant le module pexpect.SFTP utilisant le module pexpect python

sftp_opts = ['-o', 'Port=%s' % port, 
       '-o', 'UserKnownHostsFile=%s' % known_hosts_file, 
       '-o', 'PasswordAuthentication=yes', 
       '%[email protected]%s' % (user, host)] 
    p = pexpect.spawn('sftp', sftp_opts) 

    try: 
     p.expect('(?i)password:') 
     x = p.sendline(password) 
     x = p.expect('sftp>') 
     x = p.sendline('cd ' + remote_dir) 
     x = p.expect('sftp>') 
     x = p.sendline('put ' + filename) 
     x = p.expect('sftp>') 
     x = p.isalive() 
     x = p.close() 
     retval = p.exitstatus 
    except pexpect.EOF: 
     print('SFTP file transfer failed due to premature end of file.') 
     return False 
    except pexpect.TIMEOUT: 
     print('SFTP file transfer failed due to timeout.') 
     return False 

On dirait que je suis capable de se connecter & s'authentifier à travers SSH, mais le retval est toujours 1 (état de sortie) et le fichier ne marche pas se sftp'ed.

Ai-je oublié quelque chose ici?

Si j'essaie d'attendre p (p.wait() au lieu de p.close()) - il ne revient jamais.

+2

[paramiko] (http://www.lag.net/paramiko/) supporte [SFTP] (http://www.lag.net/paramiko/docs/paramiko.SFTP-class. html). – ephemient

+0

@ ephemient - est-ce que paramiko est une meilleure option que pexpect? – user1082044

+0

Vous pouvez utiliser une clé publique SSH avec scp, qui ne nécessite pas de pexepect. – jordanm

Répondre

1

Pour résumer comme une réponse:

  • tour sur la consignation de débogage pour obtenir une meilleure idée de ce qui se passe mal; de David K. Hess

  • Utiliser pexpect mais automatiser scp au lieu de sftp; encore mieux utiliser les clés ssh; à partir de jornam

  • utiliser la fonction sftp de paramiko ssh lib; de ephemient