如何创建bash脚本来检查SSH连接?

时间:2009-09-10 13:30:05

标签: bash ssh connection

我正在创建一个bash脚本,该脚本将登录到远程计算机并创建私钥和公钥。

我的问题是远程机器不是很可靠,而且它们并不总是正常运行。我需要一个bash脚本来检查SSH连接是否已启动。在实际创建密钥以供将来使用之前。

13 个答案:

答案 0 :(得分:126)

您可以使用返回值ssh检查这一点:

$ ssh -q user@downhost exit
$ echo $?
255

$ ssh -q user@uphost exit
$ echo $?
0

编辑:另一种方法是使用nmap(你不需要密钥或登录东西):

$ 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不使用返回值来显示端口是否被过滤,关闭或打开)。

EDIT2:

如果您对ssh-port的实际状态感兴趣,可以将grep open替换为egrep 'open|closed|filtered'

$ nmap host -PN -p ssh | egrep 'open|closed|filtered'

要完成。

答案 1 :(得分:19)

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

答案 2 :(得分:14)

你可以使用这样的东西

$(ssh -o BatchMode=yes -o ConnectTimeout=5 user@host echo ok 2>&1)

如果ssh连接正常,这将输出“ok”

答案 3 :(得分:6)

补充@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

答案 4 :(得分:3)

尝试:

echo quit | telnet IP 22 2>/dev/null | grep Connected

答案 5 :(得分:2)

关注@user156676,查看ip范围:

#!/bin/sh
IP='192.168.0.'
PWD='your_password'
USR='your_usr'

for i in $(seq 229 255);do
    sshpass -p $PWD ssh -q -o ConnectTimeout=3 ${USR}@${IP}${i} exit
    let ret=$?
    if [ $ret -eq 5 ]; then
        echo $IP$i "Refused!"  $ret
    elif [ $ret -eq 255 ] ; then
        echo $IP$i "Server Down!" $ret
    elif [ $ret -eq 0 ] ; then
        echo $IP$i "Connnected!" $ret
    else
        echo $IP$i "Unknown return code!" $ret
    fi  
done

答案 6 :(得分:1)

在成功连接后,ssh命令下面的退出代码应为0,否则应为非零值。

ssh -q -o BatchMode=yes user@remote.com exit

if [ $? != "0" ]; then
    echo "Connection failed"
fi

答案 7 :(得分:0)

如果有人只想检查端口22是否在远程计算机上打开,这个简单的netcat命令很有用。我使用它是因为nmap和telnet不适合我。此外,我的ssh配置使用键盘密码验证。

这是GUESSWHOz提出的解决方案的变体。

nc -q 0 -w 1 "${remote_ip}" 22 < /dev/null &> /dev/null && echo "Port is reachable" || echo "Port is unreachable"

答案 8 :(得分:0)

如果您想检查远程文件夹是否存在,或者是否真的进行任何其他文件测试:

if [ -n "$(ssh "${user}@${server}" [ -d "$folder" ] && echo 1; exit)" ]; then
    # exists
else
    # doesn't exist
fi

不要忘记"$(ssh ...)"中的引号。

答案 9 :(得分:0)

要连接到具有多个接口的服务器

ssh -o ConnectTimeout=1 -q Necktwi@192.168.1.61;[ $? = 1 ] || ssh -o ConnectTimeout=1 -q Necktwi@192.168.1.51

答案 10 :(得分:0)

使用BASH 4+脚本的示例:

# -- ip/host and res which is result of nmap (note must have nmap installed)
ip="192.168.0.1"
res=$(nmap ${ip} -PN -p ssh | grep open)

# -- if result contains open, we can reach ssh else assume failure) --
if [[ "${res}" =~ "open" ]] ;then
    echo "It's Open! Let's SSH to it.."
else
    echo "The host ${ip} is not accessible!"
fi

答案 11 :(得分:0)

https://onpyth.blogspot.com/2019/08/check-ping-connectivity-to-multiple-host.html

上面的链接是创建用于检查连接性的Python脚本。 您可以使用类似的方法并使用:

ping -w 1 -c 1 "IP Address" 

创建bash脚本的命令。

答案 12 :(得分:-6)

我觉得你在这里试图解决错误的问题。你不应该试图让ssh守护进程更稳定吗?尝试运行类似monit的内容,它将检查守护程序是否正在运行,如果不运行则重新启动它(让您有时间找到关闭sshd背后的root问题)。或者网络服务是否麻烦?试着看man ifup。整个事情就像关闭你一样吗?嗯,这是一个更大的问题...尝试查看您的日志(从syslog开始)查找硬件故障或关闭您的盒子的服务(可能是温度监控器?)。

让你的脚本容错是很好的,但你可能也想让你的boxen容错。