SSH短时间后超时的选项? ClientAlive& ConnectTimeout似乎没有做我需要它们做的事情

时间:2014-07-23 21:39:43

标签: python linux ssh timeout

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

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

我在这里缺少一些明显的命令吗?

2 个答案:

答案 0 :(得分:4)

没有人专门发布任何与SSH有关的答案,所以我会提出一个SIGALRM解决方案,例如:https://stackoverflow.com/a/1191537/3803152

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块,您的程序可以在此处继续。

答案 1 :(得分: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