SSH 超时选项?ClientAlive 和 ConnectTimeout 似乎不满足我的需求

0 投票
2 回答
2907 浏览
提问于 2025-04-18 14:31

我正在通过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块,在那里你的程序可以继续运行。

撰写回答