readline挂在paramiko.Channel上,用于某些超时值

问题描述 投票:1回答:1

我正在测试此代码以读取命令的输出,但是对于timeout值的某些值,它只是挂起。我怀疑这与watch的工作方式有关,但我无法弄清楚出了什么问题或如何解决它:

import paramiko

host = "micro"
# timeout = 2  # Succeeds
timeout = 3  # Hangs!
command = 'ls / && watch -n2 \'touch "f$(date).txt"\''

ssh_client = paramiko.SSHClient()
ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh_client.connect(host, password='', look_for_keys=False)

transport = ssh_client.get_transport()
channel = transport.open_session()
channel.get_pty()
channel.settimeout(timeout)
channel.set_combine_stderr(True)
stdout = channel.makefile()
channel.exec_command(command)

for line in stdout:  # Hangs here
    print(line.strip())

[有几个类似的问题,其中一些很旧(12,可能还有其他)]

对于其他同样不使用watch的命令,也不会发生这种情况。

有人知道此特定命令有什么特别之处,和/或如何可靠地设置读取操作的超时时间?

(在Python 3.4.2和paramiko 1.15.1上测试)

Edit 1

:我合并了channel.set_combine_stderr(True) as suggested in this answer to a related question,但仍然没有解决问题。但是,watch确实会产生很多输出,因此问题可能恰恰在于此。实际上,使用此命令消除了挂起:
command = 'ls / && watch -n2 \'touch "f$(date).txt"\' > /dev/null'

所以,这个问题可能几乎是Paramiko ssh die/hang with big output的一个重复,但是让我怀疑是否真的没有办法使用.readline()(在这种情况下通过__next__调用]

并且必须诉诸于以固定的缓冲区大小读取并手动组装线。

我正在测试此代码以读取命令的输出,但是对于某些超时值,它只是挂起。我怀疑这与手表的工作方式有关,但我无法弄清楚出了什么问题,或者...

python-3.x paramiko
1个回答
0
投票

这可能挂起,因为watch不产生换行符。如果有人替换

© www.soinside.com 2019 - 2024. All rights reserved.