如何创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容错。