Парамико: блокирование блоков навсегда
У меня проблема с подключением трубопроводов к 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()
Любые идеи?
EDIT:
Я посмотрел исходный код 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')
) или вставить в объект paramiko Channel
под объектом stdin
:
stdin.channel.shutdown_write()
Если вы хотите, чтобы сеанс bash продолжался для другой команды, вам нужно будет напрямую использовать объект канала. В документации для Channel
упоминаются recv_ready(self)
и recv(self, nbytes)
, которые позволят вам проверить данные, прежде чем пытаться их получить.