我正在远程主机上执行一个通过无密码SSH连接的脚本。我想设置一个超时,这样如果远程主机运行的时间是无限长的,我就想退出ssh会话,继续sh脚本中的其他行。
如何设置超时?
你可以使用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
在第二个例子中,你只需要检查文件是否存在。
ssh -o ConnectTimeout=10 <hostName>
10是以秒为单位的时间。此超时仅适用于连接的创建。
使用-o ConnectTimeout和-o BatchMode=yes -o StrictHostKeyChecking=no。
-o ConnectTimeout
-o BatchMode=yes -o StrictHostKeyChecking=no
ConnectTimeout使脚本不挂起,BatchMode使它不挂起主机未知,YES添加到known_hosts, StrictHostKeyChecking自动添加指纹。
****说明**** “StrictHostKeyChecking”仅适用于您信任主机的内部网络。根据SSH客户机的版本不同,“您确定要添加指纹吗”可能导致客户机无限期挂起(主要是在AIX上运行的旧版本)。大多数现代版本都没有这个问题。如果你必须处理多个主机的指纹,我建议使用一些配置管理工具(如puppet/ansible/chef/salt/etc)来维护known_hosts文件
你也可以用flag
-o ServerAliveInterval=<secs>
<secs>
/etc/ssh/ssh_config
~/.ssh/config
试试这个:
timeout 5 ssh user@ip
timeout执行ssh命令(带args),如果ssh在5秒后没有返回,则发送SIGTERM。 有关超时的详细信息,请阅读本文档: http://man7.org/linux/man-pages/man1/timeout.1.html < / p >
或者你可以使用ssh的参数:
ssh -o ConnectTimeout=3 user@ip
如果所有这些都失败了(包括没有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
timeout 5 SSH user@machine"对我来说很好。