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

标签 python linux ssh timeout

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

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

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

最佳答案

好吧,没有人专门针对 SSH 发布任何答案,因此我将提出一个 SIGALRM 解决方案,如下所示: Using module 'subprocess' with timeout

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 block ,您的程序可以在其中继续。

关于python - SSH 在短时间后超时的选项? ClientAlive 和 ConnectTimeout 似乎没有做我需要他们做的事情,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24921527/

相关文章:

python - F.monotonicly_increasing_id() 返回长随机数

linux - 安装 OpenCV 时出错

php - shell 通过 PHP : Trouble adding new cron job to crontab

ubuntu - 使用 Chef 开源服务器部署带有密码的私有(private) git 存储库

git - 致命的 : 'jigar/test.git' does not appear to be a git repository fatal: The remote end hung up unexpectedly

bash - 需要密码时检查SSH连接是否可行

python - 对 python 类的说明

python - 为什么在 while 循环中尝试覆盖变量时会出现内存错误? (Python)

python - 如何将大量数据发布到 Django?

linux - 如何检查 ssh-agent 是否已经在 bash 中运行?