2011-11-08 9 views
10

Tengo un problema para hacer que las tuberías funcionen con paramiko.Paramiko: Bloques de tuberías para siempre en lectura

Esto funciona:

ssh = paramiko.SSHClient() 
[...] 
stdin, stdout, stderr = ssh.exec_command("find /tmp") 
stdout.read() 

esto no de trabajo (bloques para siempre en stdout.read()):

[...] 
stdin, stdout, stderr = ssh.exec_command("bash -") 
stdin.write("find /tmp\n") 
stdin.close() 
stdout.read() 

¿Alguna idea?

EDIT:

Miré el código fuente de paramiko y ChannelFile.close en realidad no hace nada en términos de comunicación. Así que miré a la API de canal, y esto parece que funciona:

stdin.write("find /tmp\n") 
stdin.flush() 
stdin.channel.shutdown_write() 
stdout.read() 

Respuesta

14

Con un poco de investigación, parece que en realidad no stdin.close() finalizar la sesión de bash. Para ello, puede utilizar el comando de bash exit (stdin.write('exit\n')) o cavar en el paramiko Channel objeto debajo del stdin objeto:

stdin.channel.shutdown_write() 

Si desea la sesión de bash para continuar por otro comando, se le necesita usar el objeto de canal directamente. El documentation for Channel menciona recv_ready(self) y recv(self, nbytes) que le permitirán verificar los datos antes de intentar obtenerlos.

+0

Sí, ya lo descubrí, pero SO no me deja responder mis propias dudas todavía :-) – hmn

+1

BTW, también abordado aquí: https://github.com/robey/paramiko/pull/43 – hmn

+1

The el enlace correcto ahora es https://github.com/paramiko/paramiko/pull/43 –