Подтвердить что ты не робот

Парамико: блокирование блоков навсегда

У меня проблема с подключением трубопроводов к 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()
4b9b3361

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