我正在远程主机上执行一个通过无密码SSH连接的脚本。我想设置一个超时,这样如果远程主机运行的时间是无限长的,我想退出那个ssh会话并继续我的sh脚本中的其他行。如何设置超时?
vuv7lop31#
ssh -o ConnectTimeout=10 <hostName>
其中10是以秒为单位的时间。此超时仅适用于连接的创建。
hgb9j2n62#
使用-o ConnectTimeout和-o BatchMode=yes -o StrictHostKeyChecking=no。
-o ConnectTimeout
-o BatchMode=yes -o StrictHostKeyChecking=no
ConnectTimeout防止脚本挂起,BatchMode防止Host unknown挂起,YES添加到known_hosts,StrictHostKeyChecking自动添加指纹。注意“StrictHostKeyChecking”仅适用于您信任主机的内部网络。根据SSH客户端的版本,“您确定要添加指纹吗”可能会导致客户端无限期挂起(主要是在AIX上运行的旧版本)。大多数现代版本都不会遇到这个问题。如果您必须与多个主机一起处理指纹,我建议使用某种配置管理工具来维护known_hosts文件,如puppet/ansible/chef/salt/等。
shyt4zoc3#
试试这个:
timeout 5 ssh user@ip
timeout执行ssh命令(带参数),如果ssh在5秒后没有返回,则发送SIGTERM。有关timeout的更多详细信息,请阅读此文档:http://man7.org/linux/man-pages/man1/timeout.1.html或者你可以使用ssh的参数:
ssh -o ConnectTimeout=3 user@ip
v09wglhw4#
你也可以和flag联系
-o ServerAliveInterval=<secs>
,所以SSH客户端每<secs>秒向服务器发送一个空数据包,只是为了保持连接。在Linux中,这也可以在/etc/ssh/ssh_config中全局设置,或者在~/.ssh/config中按用户设置。
<secs>
/etc/ssh/ssh_config
~/.ssh/config
j2datikz5#
如果所有其他方法都失败了(包括没有timeout命令),这个shell脚本中的概念将起作用:
timeout
#!/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
x759pob26#
你可以使用nohup在非阻塞模式下运行任何你正在运行的东西,所以你可以一直检查它是否应该运行,运行,否则退出。
nohup ./my-script-that-may-take-long-to-finish.sh & ./check-if-previous-script-ran-or-exit.sh
echo "Script ended on Feb 15, 2011, 9:20AM" > /tmp/done.txt
所以在第二个中,您只需检查文件是否存在。
ruarlubt7#
“timeout 5 ssh user@machine”对我来说很好用。
kb5ga3dv8#
添加下面的.ssh/config代码片段
.ssh/config
ServerAliveInterval 20 ServerAliveCountMax 5 ConnectTimeout 10
8条答案
按热度按时间vuv7lop31#
其中10是以秒为单位的时间。此超时仅适用于连接的创建。
hgb9j2n62#
使用
-o ConnectTimeout
和-o BatchMode=yes -o StrictHostKeyChecking=no
。ConnectTimeout防止脚本挂起,BatchMode防止Host unknown挂起,YES添加到known_hosts,StrictHostKeyChecking自动添加指纹。
注意“StrictHostKeyChecking”仅适用于您信任主机的内部网络。根据SSH客户端的版本,“您确定要添加指纹吗”可能会导致客户端无限期挂起(主要是在AIX上运行的旧版本)。大多数现代版本都不会遇到这个问题。如果您必须与多个主机一起处理指纹,我建议使用某种配置管理工具来维护known_hosts文件,如puppet/ansible/chef/salt/等。
shyt4zoc3#
试试这个:
timeout执行ssh命令(带参数),如果ssh在5秒后没有返回,则发送SIGTERM。有关timeout的更多详细信息,请阅读此文档:http://man7.org/linux/man-pages/man1/timeout.1.html
或者你可以使用ssh的参数:
v09wglhw4#
你也可以和flag联系
,所以SSH客户端每
<secs>
秒向服务器发送一个空数据包,只是为了保持连接。在Linux中,这也可以在/etc/ssh/ssh_config
中全局设置,或者在~/.ssh/config
中按用户设置。j2datikz5#
如果所有其他方法都失败了(包括没有
timeout
命令),这个shell脚本中的概念将起作用:x759pob26#
你可以使用nohup在非阻塞模式下运行任何你正在运行的东西,所以你可以一直检查它是否应该运行,运行,否则退出。
所以在第二个中,您只需检查文件是否存在。
ruarlubt7#
“timeout 5 ssh user@machine”对我来说很好用。
kb5ga3dv8#
添加下面的
.ssh/config
代码片段