如何创build一个bash脚本来检查SSH连接?
我正在创build一个bash脚本,可以login远程机器并创build私钥和公钥。
我的问题是,远程机器不是很可靠,他们并不总是起来。 我需要一个bash脚本来检查SSH连接是否启动。 在实际创build密钥以备将来使用之前。
你可以用返回值来检查这个ssh给你:
$ ssh -q user@downhost exit $ echo $? 255 $ ssh -q user@uphost exit $ echo $? 0
编辑:另一种方法是使用nmap(你将不需要有钥匙或login的东西):
$ a=`nmap uphost -PN -p ssh | grep open` $ b=`nmap downhost -PN -p ssh | grep open` $ echo $a 22/tcp open ssh $ echo $b (empty string)
但是你必须grep消息(nmap不使用返回值来显示端口是否被过滤,closures或打开)。
EDIT2:
如果您对ssh-port的实际状态感兴趣,可以用egrep 'open|closed|filtered'
replacegrep open
:
$ nmap host -PN -p ssh | egrep 'open|closed|filtered'
只是要完成。
ssh -q -o "BatchMode=yes" -i /home/sicmapp/.ssh/id_rsa <ID>@<Servername>.<domain> "echo 2>&1" && echo $host SSH_OK || echo $host SSH_NOK
你可以使用这样的东西
$(ssh -o BatchMode=yes -o ConnectTimeout=5 user@host echo ok 2>&1)
这将输出“OK”,如果SSH连接是好的
作为对@Adrià Cidre
的回应的补充,你可以这样做:
status=$(ssh -o BatchMode=yes -o ConnectTimeout=5 user@host echo ok 2>&1) if [[ $status == ok ]] ; then echo auth ok, do something elif [[ $status == "Permission denied"* ]] ; then echo no_auth else echo other_error fi
尝试:
echo quit | telnet IP 22 2>/dev/null | grep Connected
我觉得你想在这里解决错误的问题。 你不应该试图让SSH守护进程更稳定吗? 尝试运行类似monit的东西,它将检查守护进程是否正在运行,如果没有,请重新启动它(给你时间来查找closuressshd后面的根问题)。 还是networking服务麻烦? 试着看看man ifup
。 整个该死的东西就像closures你一样? 那么,这是一个更大的问题…尝试查看你的日志(从syslog开始),find硬件故障或服务,closures你的boxen(也许温度监视器?)。
让你的脚本容错是好的,但你也可能想让你的boxen容错。