2011-11-08 11 views
10

Mam problem z dostaniem rurociągu do pracy z paramiko.Paramiko: Bloki rurociągów na zawsze czytają

to działa:

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

to robi nie pracy (bloki na zawsze na stdout.read()):

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

Jakieś pomysły?

EDIT:

Spojrzałem na kodzie źródłowym paramiko i ChannelFile.close naprawdę nie robić nic pod względem komunikacji. Więc spojrzał na API kanału, a to wydaje się działać:

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

Odpowiedz

14

Z pewnym dochodzenia wynika, że ​​stdin.close() rzeczywistości nie zakończyć sesję bash. Aby to zrobić, można użyć polecenia bash exit (stdin.write('exit\n')) lub kopać w paramiko Channel przedmiotu pod przedmiotem stdin:

stdin.channel.shutdown_write() 

Jeśli chcesz sesję bash, aby kontynuować do innego polecenia, będziesz trzeba bezpośrednio użyć obiektu kanału. The documentation for Channel wymienia recv_ready(self) i recv(self, nbytes), które pozwolą ci sprawdzić dane zanim spróbujesz je zdobyć.

+0

Tak, sama już to wymyśliłem, ale WIĘC nie pozwala mi odpowiedzieć na moje własne pytania :-) – hmn

+1

BTW, również zaadresowane tutaj: https://github.com/robey/paramiko/pull/43 – hmn

+1

poprawny link jest teraz https://github.com/paramiko/paramiko/pull/43 –