SSH 超时选项?ClientAlive 和 ConnectTimeout 似乎不满足我的需求
我正在通过SSH发送一个命令,这个命令是让机器重启。不幸的是,这个命令会让我的SSH连接卡住,导致无法返回,这样我的脚本就无法继续执行后面的任务。
我尝试了各种方法来修改这个命令,比如在里面加上“exit”或者其他退出的命令,但无论怎么做,机器都没有同时执行重启和关闭SSH连接的命令。我还尝试了SSH的ConnectTimeout和ClientAlive选项,但这些似乎让重启命令被忽略了。
难道我遗漏了什么明显的命令吗?
2 个回答
0
我这里给大家提供一些伪代码,建议使用一个标志来表示你是否已经重启过。
文件 rebootState.py
hasRebooted = False
文件 sshCommander.py
from rebootState import hasRebooted
if (hasRebooted):
# Write to rebootState.py "hasRebooted = True"
# System call to reboot machine
else:
# Continue execution
5
好吧,没人专门回答关于SSH的问题,所以我来提一个用SIGALRM
的解决方案,就像这里说的:使用模块'subprocess'并设置超时
class TimeoutException(Exception): # Custom exception class
pass
def TimeoutHandler(signum, frame): # Custom signal handler
raise TimeoutException
# Change the behavior of SIGALRM
OriginalHandler = signal.signal(signal.SIGALRM,TimeoutHandler)
# Start the timer. Once 30 seconds are over, a SIGALRM signal is sent.
signal.alarm(30)
# This try/except loop ensures that you'll catch TimeoutException when it's sent.
try:
ssh_foo(bar) # Whatever your SSH command is that hangs.
except TimeoutException:
print "SSH command timed out."
# Reset the alarm stuff.
signal.alarm(0)
signal.signal(signal.SIGALRM, OriginalHandler)
这个方法基本上是设置一个30秒的计时器,然后尝试执行你的代码。如果在时间用完之前代码没有完成,就会发送一个SIGALRM
信号,我们会捕捉到这个信号,并把它转化为一个TimeoutException
。这样就会强制程序进入except
块,在那里你的程序可以继续运行。