2010-03-05 14 views
14

Je tente d'utiliser le module de sous-processus python pour me connecter à un site FTP sécurisé, puis récupérer un fichier. Cependant, je ne cesse de raccrocher juste en essayant d'envoyer le mot de passe quand il est demandé. J'ai jusqu'à présent le code suivant:Utiliser un sous-processus pour envoyer un mot de passe

from subprocess import Popen, PIPE 

proc = Popen(['sftp','[email protected]', 'stop'], stdin=PIPE) 
proc.communicate('password') 

Cela arrête encore à l'invite de mot de passe. Si je saisis le mot de passe manuellement, il se rendra sur le site ftp, puis entrera le mot de passe sur la ligne de commande. J'ai vu des gens suggérer d'utiliser pexpect mais une longue histoire, j'ai besoin d'une solution de bibliothèque standard. Y at-il de toute façon avec sous-processus et/ou tout autre stdlib? Qu'est-ce que j'oublie ci-dessus?

+0

Duplicata de http://stackoverflow.com/questions/2356391/why-supplying-stdin-to-subprocess-popen-cause-what-is-written-to-stdout-to-c ? –

Répondre

8

Peut-être que vous devriez utiliser une bibliothèque semblable à expect à la place? Par exemple Pexpect (example). Il existe également d'autres bibliothèques python similaires.

+0

+1 pour Pexpect. C'est la bonne solution pour interagir avec les processus de la console. –

+0

Existe-t-il un module stdlib expect? Je dois m'en tenir à stdlib. –

+0

Pexpect n'est pas stdlib. Mais il s'agit d'un python pur, il suffit donc de mettre le fichier pexpect.py quelque part sur votre chemin python. Par exemple à côté de votre fichier de script. – codeape

6

Essayez

proc.stdin.write('yourPassword\n') 
proc.stdin.flush() 

Cela devrait fonctionner. Ce que vous décrivez ressemble à stdin=None où le processus fils hérite du stdin du parent (votre programme Python).

+0

Hm ... ça semble toujours s'arrêter et demander le mot de passe. –

+1

Vous lisez stdout du processus dans un deuxième fil, n'est-ce pas? Sinon, des choses étranges peuvent arriver. Vérifiez également si sftp autorise un mot de passe de stdin en utilisant 'echo password | sftp ... 'depuis la ligne de commande. Il est possible que sftp ouvre toujours un shell. –

+2

les mots de passe ne sont pas écrits par l'entrée standard autant que je sache. Ce code est-il testé? –

1

Je recommande de mettre au rebut l'approche du sous-processus et d'utiliser le paquet paramiko pour l'accès sftp.

1

Utilisez Paramiko pour SFTP. Pour toute autre chose, cela fonctionne:

import subprocess 

args = ['command-that-requires-password', '-user', 'me'] 

proc = subprocess.Popen(args, 
         stdin=subprocess.PIPE, 
         stdout=subprocess.PIPE, 
         stderr=subprocess.PIPE) 

proc.stdin.write('mypassword\n') 
proc.stdin.flush() 

stdout, stderr = proc.communicate() 
print stdout 
print stderr 
+0

testé, et n'a pas fonctionné – weefwefwqg3

2
from subprocess import Popen, PIPE 

proc = Popen(['sftp','[email protected]', 'stop'], stdin=PIPE) 
proc.communicate(input='password') 

Essayez avec entrée = « mot de passe » en communication, qui a travaillé pour moi.