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)
что позволит вам проверить данные, прежде чем пытаться получить их.