【问题标题】:Paramiko: Piping blocks forever on readParamiko:在读取时永远阻塞管道
【发布时间】:2011-12-24 13:38:12
【问题描述】:

我在让管道与 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()

【问题讨论】:

    标签: python ssh paramiko


    【解决方案1】:

    经过一些调查,stdin.close() 似乎并没有真正结束 bash 会话。为此,您可以使用 bash 命令 exit (stdin.write('exit\n')) 或挖掘 stdin 对象下方的 paramiko Channel 对象:

    stdin.channel.shutdown_write()
    

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

    【讨论】:

    • 是的,我自己已经想通了,但是还不让我回答自己的问题 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多