Paramiko: Трубные блоки навсегда на чтение

У меня проблема с получением труб для работы с 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 ответ

Решение

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

stdin.channel.shutdown_write()

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

Другие вопросы по тегам