帕拉米科:管道块永远在读

时间:2011-11-08 15:28:59

标签: python ssh 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 个答案:

答案 0 :(得分:14)

通过一些调查,似乎stdin.close()实际上并未结束bash会话。为此,您可以使用bash命令exitstdin.write('exit\n'))或深入了解Channel对象下的paramiko stdin对象:

stdin.channel.shutdown_write()

如果您希望bash会话继续执行另一个命令,则需要直接使用通道对象。 documentation for Channel提及recv_ready(self)recv(self, nbytes),您可以在尝试获取数据之前检查数据。