Python Paramiko exec_command超时不起作用?



我得到了以下ssh命令,

    try:
        print 'trying to restart'
        self.ssh.exec_command(RR_CMD % (self.path_ext, self.rport), timeout=1)
        print 'restarted'
    except:
        self.ssh.close()
        self.ssh = ssh.create_ssh_client(self.ip, self.port, self. username, self.password)
        self.restart()

基本上我正在尝试重新启动远程perl脚本。但有时,比如说 2000 年中有 1 个 - 我的 python 程序在 exec_command 行上冻结有时长达几分钟!

我想使用超时功能,我将其设置为 1 秒,但由于某种原因它不起作用。

我在exec_command没有按照我的预期获得尊重时遇到了超时问题。例如,我将超时设置为 60,并发现一个挂起的命令整夜运行。我之前做的是

response = client.exec_command(command, timeout=60)
returncode = response[0].channel.recv_exit_status()

但是超时为 None 或任何值,它挂在 recv_exit_status 上,现在,相反,我只是自己管理超时,因为exec_command是非阻塞的,通过轮询channel.exit_status_ready.

start = time.time()
while time.time() < start + timeout:
    if response[0].channel.exit_status_ready():
        break
    time.sleep(1)
else:
    raise TimeoutError(f'{command} timed out on {hostname}')
returncode = response[0].channel.recv_exit_status()

你的paramiko版本怎么样?

最新版本paramiko支持的参数timeout

帕拉米科更新日志 v1.10.0:

将超时参数添加到SSHClient.exec_command以便更轻松地设置命令的内部通道对象的超时。感谢切尔诺夫·弗拉基米尔的补丁。

对于那些使用recv_exit_status的人:

import paramiko
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('192.168.10.1', username='root', password='password')
_, out, err = ssh.exec_command("python3 -c 'from time import sleepnsleep(5)'")
# this
# print(out.channel.recv_exit_status())
# change this to
out.channel.status_event.wait(timeout=10)  # < 5 raise assert
assert out.channel.status_event.is_set()
print(out.channel.exit_status)
ssh.close()
print("end script")

相关内容

  • 没有找到相关文章

最新更新