2011-11-08 13 views
10

Paramiko ile çalışmak için pipetlemeyle ilgili bir sorunum var.Paramiko: Okunması halinde sonsuza kadar boru blokları

Bu çalışır:

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

Bu değil nasıl çalışır (stdout.read sonsuza blokları()):

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

Herhangi bir fikir?

DÜZENLEME:

Ben paramiko için kaynak koduna baktım ve ChannelFile.close gerçekten iletişim anlamında bir şey yapmaz. Bu yüzden kanal API baktım ve bu iş gibi görünüyor: Bazı soruşturma ile

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

cevap

14

, stdin.close() aslında bash oturumu bitmez anlaşılmaktadır. Başka bir komut için devam etmek bash oturumu isterseniz olacak,

stdin.channel.shutdown_write() 

: Bunu yapmak için, bash komutunu exit (stdin.write('exit\n')) kullanın veya stdin nesneye altına paramiko içine Channel nesneyi kazabilseydim Kanal nesnesini doğrudan kullanmanız gerekir. documentation for Channel, recv_ready(self) ve recv(self, nbytes)'dan bahseder ve bu verileri almayı denemeden önce kontrol etmenizi sağlar.

+0

Evet, bunu zaten kendim çözdüm, ama SO, kendi sorularıma cevap vermeme izin vermiyor :-) – hmn

+1

BTW, ayrıca şu adrese de yazdı: https://github.com/robey/paramiko/pull/43 – hmn

+1

Doğru bağlantı şu anda https://github.com/paramiko/paramiko/pull/43 –

İlgili konular