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

hmn*_*hmn 10 python ssh paramiko

我有一个问题,让管道与paramiko一起工作.

这有效:

ssh = paramiko.SSHClient()
[...]
stdin, stdout, stderr = ssh.exec_command("find /tmp")
stdout.read()
Run Code Online (Sandbox Code Playgroud)

这并没有工作(上stdout.read块永()):

[...]
stdin, stdout, stderr = ssh.exec_command("bash -")
stdin.write("find /tmp\n")
stdin.close()
stdout.read()
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

编辑:

我查看了paramiko的源代码,而ChannelFile.close在通信方面并没有真正做任何事情.所以我查看了通道API,这似乎有效:

stdin.write("find /tmp\n")
stdin.flush()
stdin.channel.shutdown_write()
stdout.read()
Run Code Online (Sandbox Code Playgroud)

101*_*100 14

通过一些调查,似乎stdin.close()实际上并没有结束bash会话.要做到这一点,你可以使用bash命令exit(stdin.write('exit\n'))或挖掘Channel对象下面的paramiko stdin对象:

stdin.channel.shutdown_write()
Run Code Online (Sandbox Code Playgroud)

如果您希望bash会话继续执行另一个命令,则需要直接使用通道对象.在对文档Channel提到recv_ready(self)recv(self, nbytes)这将使你牛逼检查数据,你设法得到它之前.