【问题标题】:How to set ssh timeout?如何设置 ssh 超时?
【发布时间】:2011-06-23 15:15:24
【问题描述】:

我正在远程主机上执行通过无密码 SSH 连接的脚本。我想设置一个超时,这样如果远程主机的运行时间无限长,我想退出该 ssh 会话并继续我的 sh 脚本中的其他行。

如何设置超时时间?

【问题讨论】:

标签: shell ssh timeout


【解决方案1】:

好吧,你可以使用 nohup 来运行你在“非阻塞模式”下运行的任何东西。所以你可以继续检查它是否应该运行,运行,否则退出。

nohup ./my-script-that-may-take-long-to-finish.sh & ./check-if-previous-script-ran-or-exit.sh echo "脚本于 2011 年 2 月 15 日上午 9:20 结束" > /tmp/done.txt

所以在第二个中,您只需检查文件是否存在。

【讨论】:

  • 有道理。但是,正在运行的脚本给了我一些输出,显示在控制台上..如何检查我以前的脚本是运行还是退出?美元?还是别的什么?
  • 你可以让脚本在完成后创建一个文件。我已将评论添加到答案中...... grrr
【解决方案2】:
ssh -o ConnectTimeout=10  <hostName>

其中 10 是以秒为单位的时间。此超时仅适用于连接的创建。

【讨论】:

  • ConnectTimeout 只是设置连接设置的超时时间,对吧?
  • 这实际上不适用于“远程主机运行无限时间”:“ssh -o ConnectTimeout=5 host 'sleep 10'”等待 10 秒,而不是 5。
【解决方案3】:

使用-o ConnectTimeout-o BatchMode=yes -o StrictHostKeyChecking=no

ConnectTimeout 防止脚本挂起,BatchMode 防止其与 Host unknown 挂起,YES 添加到 known_hosts,StrictHostKeyChecking 添加自动指纹。

**** 注意 **** “StrictHostKeyChecking”仅适用于您信任主机的内部网络。根据 SSH 客户端的版本,“您确定要添加指纹”可能会导致客户端无限期挂起(主要是在 AIX 上运行的旧版本)。大多数现代版本都不会遇到这个问题。如果您必须处理多个主机的指纹,我建议使用某种配置管理工具(如 puppet/ansible/chef/salt/etc)维护 known_hosts 文件。

【讨论】:

  • -o StrictHostKeyChecking=no 不仅没有解决这个问题,而且如果您关心安全性,这可能是一个糟糕的主意,这可能是您首先使用 SSH 的原因。
  • 最好指出 -o StrictHostKeyChecking=no 可能存在的安全隐患。但是,它会防止脚本在执行过程中挂起。
  • 警告!!!!正如@Dolph 所写,如果您完全关心安全性,请不要使用StrictHostKeyChecking=no。 @Doug:脚本不会挂起 - 它只会坚持您第一次手动 ssh 到远程主机,因此它会了解主机。但它会保护您免受 MITM 攻击。请编辑此答案以反映这一点,因为它是一个非常危险的建议。它甚至没有被要求。
  • 更新了我的答案。根据我的经验,它可能会导致一些客户端挂起。
【解决方案4】:

你也可以用flag连接

-o ServerAliveInterval=
因此 SSH 客户端将每隔&lt;secs&gt; 秒向服务器发送一个空数据包,以保持连接处于活动状态。 在 Linux 中,这也可以在 /etc/ssh/ssh_config 中全局设置或在 ~/.ssh/config 中为每个用户设置。

【讨论】:

  • 这听起来与问题要求的相反。
【解决方案5】:

试试这个:

timeout 5 ssh user@ip

timeout 执行 ssh 命令(带 args)并在 5 秒后 ssh 未返回时发送 SIGTERM。 有关超时的更多详细信息,请阅读此文档: http://man7.org/linux/man-pages/man1/timeout.1.html

或者你可以使用ssh的参数:

ssh -o ConnectTimeout=3 user@ip

【讨论】:

  • 如果您在 Mac 上查找此命令,请尝试 brew install coreutils,然后使用 gtimeout(来源:stackoverflow.com/questions/3504945/timeout-command-on-mac-os-x)。
  • 这可能不是你想要的。考虑命令timeout 3s ssh user@server 'sleep 5; echo blarg &gt;&gt; /tmp/blarg' 这会杀死 SSH 客户端的进程,但 /tmp/blarg 仍会在远程服务器上被修改。这意味着,如果您在远程服务器上运行失控的 CPU 密集型作业,您将泄漏进程。
  • @JamieDavis ssh user@server 'timeout 5s sleep 10' 怎么样?
  • @FilipR 如果从未建立连接,这不会超时;)
  • “这个……或者这个”通常应该提出一个问题“为什么不两者兼而有之?”两者的结合是我在自己的脚本中使用的。 timeout $X 的阈值自然应该大于ssh -o ConnectTimeout=$Y 的阈值(即X &gt; Y)。这可以捕获连接成功后远程计算机挂起并且您永远无法到达队列中的下一台计算机的情况。
【解决方案6】:

如果一切都失败了(包括没有timeout 命令),这个shell 脚本中的概念将起作用:

 #!/bin/bash
 set -u
 ssh $1 "sleep 10 ; uptime" > /tmp/outputfile 2>&1 & PIDssh=$!
 Count=0
 while test $Count -lt 5 && ps -p $PIDssh > /dev/null
 do
    echo -n .
    sleep 1
    Count=$((Count+1))
 done
 echo ""

 if ps -p $PIDssh > /dev/null
 then
    echo "ssh still running, killing it"
    kill -HUP $PIDssh
 else
    echo "Exited"
 fi

【讨论】:

    【解决方案7】:

    “timeout 5 ssh user@machine”对我来说很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-01
      • 2015-02-13
      • 2012-06-13
      • 2019-06-25
      • 2011-08-09
      • 2013-10-26
      • 2011-11-08
      • 1970-01-01
      相关资源
      最近更新 更多