我遇到了使用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()
答案 0 :(得分:14)
通过一些调查,似乎stdin.close()
实际上并未结束bash会话。为此,您可以使用bash命令exit
(stdin.write('exit\n')
)或深入了解Channel
对象下的paramiko stdin
对象:
stdin.channel.shutdown_write()
如果您希望bash会话继续执行另一个命令,则需要直接使用通道对象。 documentation for Channel
提及recv_ready(self)
和recv(self, nbytes)
,您可以在尝试获取数据之前检查数据。