2010-03-05 18 views
14

Estoy intentando utilizar el módulo de subproceso de python para iniciar sesión en un sitio ftp seguro y luego tomar un archivo. Sin embargo, sigo colgando solo tratando de enviar la contraseña cuando se solicita. Hasta ahora tengo el siguiente código:Usar subproceso para enviar una contraseña

from subprocess import Popen, PIPE 

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

Esto todavía se detiene cuando se solicita la contraseña. Si ingreso la contraseña manualmente, luego va al sitio ftp y luego ingresa la contraseña en la línea de comando. He visto personas que sugieren usar Pexpect pero a corto plazo, necesito una solución de biblioteca estándar. ¿Hay alguna forma de subproceso y/o cualquier otro stdlib? ¿Qué estoy olvidando arriba?

+0

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

Respuesta

8

¿Quizás debería usar una biblioteca similar a expect? Por ejemplo, Pexpect (example). También hay otras bibliotecas de Python similares.

+0

+1 para Pexpect. Esa es la solución correcta para interactuar con los procesos de la consola. –

+0

¿Hay un módulo stdlib expect? Necesito seguir con stdlib. –

+0

Pexpect no es stdlib. Pero es pura python, así que simplemente coloca el archivo pexpect.py en algún lugar de tu ruta python. Por ejemplo, al lado de tu archivo de script. – codeape

6

Trate

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

que debería funcionar.

Lo que usted describe suena como stdin=None donde el proceso secundario hereda el stdin del principal (su programa Python).

+0

Hm ... esto parece detenerse y pedir la contraseña. –

+1

Usted lee la salida estándar del proceso en un segundo hilo, ¿no es así? De lo contrario, cosas extrañas pueden suceder. Además, verifique si sftp permite una contraseña desde stdin usando 'echo password | sftp ... 'desde la línea de comando. Es posible que sftp siempre abra un shell. Las contraseñas –

+2

no se escriben a través de una entrada estándar hasta donde yo sé. ¿Este código es probado? –

1

Recomendaría desmantelar el enfoque de subproceso y usar el paquete paramiko para acceso sftp.

1

Utilice Paramiko para SFTP. Para cualquier otra cosa, esto funciona:

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

probado, y no funcionó – weefwefwqg3

2
from subprocess import Popen, PIPE 

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

Pruebe con entrada = ‘contraseña’ en la comunicación, que trabajó para mí.

Cuestiones relacionadas