如何在脚本中使用超时ssh?

use*_*421 155 ssh shell timeout

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

有什么想法怎么做?

use*_*421 259

ssh -o ConnectTimeout=10  <hostName>
Run Code Online (Sandbox Code Playgroud)

其中10是以秒为单位的时间.

  • 这实际上不适用于"远程主机运行无限时间":"ssh -o ConnectTimeout = 5主机'睡眠10'"等待10秒,而不是5秒. (7认同)
  • ConnectTimeout仅在连接设置上设置超时,对吧? (4认同)
  • @FerryBoender 很明显,“ConnectTimeout”仅影响连接。你的榜样与成功息息相关。 (4认同)

Dou*_*oug 103

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

ConnectTimeout使脚本不会挂起,BatchMode使其不会挂起Host未知,YES会添加到known_hosts,StrictHostKeyChecking会自动添加指纹.

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

  • `-o StrictHostKeyChecking = no`不仅没有解决问题,而且如果您关心安全性也是一个可怕的想法,这可能是您首先使用SSH的原因. (10认同)
  • 最好指出-o StrictHostKeyChecking = no可能带来的安全隐患.但是,它将阻止脚本在执行期间挂起. (9认同)
  • 警告!!!!正如@Dolph所写,如果你完全关心安全,请不要使用`StrictHostKeyChecking = no`.@Doug:脚本不会挂起 - 它只是坚持你第一次手动ssh到远程主机,所以它了解主机.但它会保护你免受MITM攻击.请编辑此答案以反映这一点,因为它是一个非常危险的建议.它甚至没有被要求. (2认同)
  • 更新了我的回答.根据我的经验,它可能会导致一些客户挂起. (2认同)

Lee*_*oYo 47

试试这个:

timeout 5 ssh user@ip
Run Code Online (Sandbox Code Playgroud)

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

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

ssh -o ConnectTimeout=3 user@ip
Run Code Online (Sandbox Code Playgroud)

  • 如果你在Mac上寻找这个命令,试试`brew install coreutils`然后使用`gtimeout`(来源:http://stackoverflow.com/questions/3504945/timeout-command-on-mac-os-x ). (4认同)
  • 这可能不会做你想要的.考虑命令`timeout 3s ssh user @ server'leat 5; echo blarg >>/tmp/blarg'`这会终止SSH客户端的进程,但/ tmp/blarg仍会在远程服务器上被修改.这意味着如果您在远程服务器上运行一个失控的CPU密集型作业,则会泄漏进程. (3认同)

Pat*_*oni 16

你也可以用旗帜连接

-o ServerAliveInterval=<secs>
所以SSH客户端每秒都会向服务器发送一个空包<secs>,只是为了保持连接的活跃性.在Linux中,这也可以在全局/etc/ssh/ssh_config或每用户中设置~/.ssh/config.

  • 这听起来与问题所要求的相反. (4认同)