SSH 在短时间内超时的选项?ClientAlive 和 ConnectTimeout 似乎没有做我需要他们做的事情



我正在通过SSH发送命令。这个特殊的命令告诉机器重新启动。不幸的是,这会挂起我的SSH会话,并且不会返回,因此我的脚本无法继续转发到其他任务。

我已经尝试了修改命令本身的各种组合,以包括"退出"和/或转义命令,但在这些情况下,机器都不会在重新启动和命令关闭SSH会话时捡起。我也尝试过SSH的ConnectTimeout和ClientAlive选项,但它们似乎使重启命令被忽略。

这里是否遗漏了一些明显的命令?

好吧,没有人发布任何与SSH有关的答案,所以我将提出一个SIGALRM解决方案,如下所示:Using module '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块,在这里您的程序可以继续。

我将在那里抛出一些伪代码,但是我建议使用一个标志来表示您是否已经重新启动。

文件 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

相关内容

  • 没有找到相关文章

最新更新