2011-11-08 34 views
10

Tôi gặp vấn đề với việc nhận đường ống để hoạt động với paramiko.Paramiko: Các khối ống luôn được đọc trên

này hoạt động:

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

này không không làm việc (khối mãi mãi trên stdout.read()):

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

Bất kỳ ý tưởng?

EDIT:

tôi nhìn vào mã nguồn cho paramiko và ChannelFile.close không thực sự làm bất cứ điều gì về thông tin liên lạc. Vì vậy, tôi nhìn API kênh, và điều này dường như làm việc:

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

Trả lời

14

Với một số điều tra, dường như stdin.close() không thực sự kết thúc phiên bash. Để làm điều đó, bạn có thể sử dụng lệnh bash exit (stdin.write('exit\n')) hoặc thâm nhập vào các paramiko Channel đối tượng bên dưới stdin đối tượng:

stdin.channel.shutdown_write() 

Nếu bạn muốn phiên bash để tiếp tục cho lệnh khác, bạn sẽ cần sử dụng trực tiếp đối tượng kênh. Số điện thoại documentation for Channel đề cập đến recv_ready(self)recv(self, nbytes) sẽ cho phép bạn kiểm tra dữ liệu trước khi bạn cố gắng lấy dữ liệu đó.

+0

Vâng, tôi đã tự tìm ra, nhưng SO không cho phép tôi trả lời các câu hỏi của riêng mình :-) – hmn

+1

BTW, cũng được đề cập ở đây: https://github.com/robey/paramiko/pull/43 – hmn

+1

liên kết chính xác hiện là https://github.com/paramiko/paramiko/pull/43 –

Các vấn đề liên quan