Paramiko: Трубные блоки навсегда на чтение - PullRequest
10 голосов
/ 08 ноября 2011

У меня проблема с получением трубопровода для работы с paramiko.

Это работает:

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

Это работает , а не (блокируется навсегда на stdout.read()):

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

Есть идеи?

РЕДАКТИРОВАТЬ:

Я посмотрел исходный код paramiko, и ChannelFile.close на самом деле ничего не делает в терминахобщения.Итак, я посмотрел на API канала, и это, кажется, работает:

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

1 Ответ

14 голосов
/ 09 ноября 2011

При некотором исследовании кажется, что stdin.close() фактически не завершает сеанс bash. Для этого вы можете использовать команду bash exit (stdin.write('exit\n')) или покопаться в объекте paramiko Channel под объектом stdin:

stdin.channel.shutdown_write()

Если вы хотите, чтобы сеанс bash продолжался для другой команды, вам нужно напрямую использовать объект канала. В документации для Channel упоминаются recv_ready(self) и recv(self, nbytes), которые позволят вам проверить данные, прежде чем пытаться их получить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...