我得到了以下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")