在Linux和Unix中测试SSH连接

时间:2020-02-23 14:40:34  来源:igfitidea点击:

在本文中,我将通过实时的实际示例共享不同的命令和方法来在Linux和Unix中"测试SSH连接"。

方法1:将超时与bash实用程序一起使用以测试SSH连接

大多数发行版中默认安装了/usr/bin/timeout实用程序,这是Linux中coreutils rpm的一部分

检查服务器上是否安装了" coreutils"

# rpm -q coreutils
coreutils-8.22-24.el7.x86_64

通过检查端口22的状态,我们可以将bash实用程序与timeout一起使用来测试SSH连接。
如果我们为22使用其他端口,则可以在下面的语法中替换它。

语法:

# timeout <value> bash -c "</dev/tcp/<server>/<port>"

这里的server2是我的目标主机,我将在端口22上以5s的超时值执行命令。

[root@server1 ~]# timeout 5 bash -c "</dev/tcp/server2/22"

如果退出状态为0,则表示测试ssh连接成功

[root@server1 ~]# echo $?
0

或者,如果我们以非零退出状态拒绝连接,则测试SSH连接失败

[root@server1 ~]# timeout 5 bash -c "</dev/tcp/server2/22"
bash: connect: Connection refused
bash: /dev/tcp/10.10.10.10/22: Connection refused
[root@server1 ~]# echo $?
1

Shell脚本示例我们可以在Shell脚本中使用此工具来测试通过端口22的SSH连接

# cat /tmp/check_connectivity.sh
#!/bin/bash
server=10.10.10.10      # server IP
port=22                 # port
connect_timeout=5       # Connection timeout
timeout $connect_timeout bash -c "</dev/tcp/$server/$port"
if [ $? == 0 ];then
   echo "SSH Connection to $server over port $port is possible"
else
   echo "SSH connection to $server over port $port is not possible"
fi

方法2:使用nmap测试SSH连接/nmap rpm提供了/usr/bin/nmap。

  • nmap被广泛用于检查端口状态,因此我们可以使用nmap在目标主机上检查22端口的状态

  • 大多数发行版默认未安装nmap,我们必须在使用前先安装它

  • 在RHEL/CentOS环境中,使用yum或者dnf安装nmap。

# yum -y install nmap

语法:

# nmap <server> -PN -p ssh | egrep 'open|closed|filtered'

其中

-Pn		Treat all hosts as online -- skip host discovery
-p ssh		Only scan the default SSH port
open		means that an application on the target machine is listening for connections/packets on that port
closed		ports have no application listening on them, though they could open up at any time
filtered	means that a firewall, filter, or other network obstacle is blocking the port so that Nmap cannot tell whether it is open or closed.

这里的" server2"是我的目标主机,我们正在寻找" nmap"的端口状态

[root@server1 ~]# nmap server2 -Pn -p ssh | egrep -io 'open|closed|filtered'
closed
[root@server1 ~]# nmap server2 -Pn -p ssh | egrep -io 'open|closed|filtered'
open

Shell脚本示例

我们可以在shell脚本中使用此命令来测试"端口22"上的SSH连接。

[root@server1 ~]# cat /tmp/check_connectivity.sh
#!/bin/bash
server=10.10.10.10      # server IP
port=22                 # port
connect_timeout=5       # Connection timeout
status=`nmap $server -Pn -p $port | egrep -io 'open|closed|filtered'`
if [ $status == "open" ];then
   echo "SSH Connection to $server over port $port is possible"
elif [ $status == "filtered" ]; then
   echo "SSH Connection to $server over port $port is possible but blocked by firewall"
elif [ $status == "closed" ]; then
   echo "SSH connection to $server over port $port is not possible"
else
   echo "Unable to get port $port status from $server"
fi

方法3:使用netcat或者nc测试SSH连接

  • 在我之前的文章中,我分享了使用ncncat在Linux服务器之间传输文件的步骤。

  • 我们还可以使用nc和ncat实用程序从目标主机检查端口状态并测试SSH连接

  • ncncatnmap-ncatrpm提供

检查服务器上是否安装了" nmap-ncat"

# rpm -q nmap-ncat
nmap-ncat-6.40-19.el7.x86_64

语法:

# nc --wait <value> <server> <port> < /dev/null &> /dev/null

其中我们定义了5秒的连接超时时间,我们可以根据自己的环境进行更改

在此命令中检查" nc"命令的退出状态。
对于" 0退出状态",我们知道"端口22"已打开,并且SSH连接将成功。

[root@server1 ~]# nc --wait 5 server2 22 < /dev/null &> /dev/null
[root@server1 ~]# echo $?
0

对于非零退出状态,我们知道各个目标主机的" SSH连接将失败"

[root@server1 ~]# nc --wait 5 server2 22 < /dev/null &> /dev/null
[root@server1 ~]# echo $?
1

Shell脚本示例

我们可以在我们的shell脚本示例中使用此命令来自动进行验证

# cat /tmp/check_connectivity.sh
#!/bin/bash
server=10.10.10.10      # server IP
port=22                 # port
connect_timeout=5       # Connection timeout
nc --wait $connect_timeout $server $port < /dev/null &> /dev/null
if [ $? == 0 ];then
   echo "SSH Connection to $server over port $port is possible"
else
   echo "SSH connection to $server over port $port is not possible"
fi

方法4:使用SSH检查SSH连接

  • 我知道我们正在寻找SSH替代品来检查SSH连接,但是如果配置中配置了少密码连接,那么我们也可以使用SSH进行此验证

  • 我们将使用ConnectTimeout来确保我们的SSH不会在等待连接变为活动状态时被卡住

  • StrictHostKeyChecking用于避免任何安全性和指纹提示

  • 如果"批处理模式"为"是",则密码/密码查询将被禁用

说明:

如果我们不使用无密码认证,则该方法将无济于事,因为该命令将提示输入密码,并且除非我们将某些hack用作" sshpass"或者使用期望脚本,否则该方法将无法自动执行

其中我们使用"exit 0"作为要在" SSH成功"上调用的远程命令。

[root@server1 ~]# ssh -q -o BatchMode=yes  -o StrictHostKeyChecking=no -o ConnectTimeout=5 server2 'exit 0'
[root@server1 ~]# echo $?
0

如果输出退出状态为"非零",那么我们知道测试" SSH连接失败"

[root@server1 ~]# ssh -q -o BatchMode=yes  -o StrictHostKeyChecking=no -o ConnectTimeout=5 server2 'exit 0'
[root@server1 ~]# echo $?
255

Shell脚本示例

我们可以在现有的shell脚本中使用此命令来实现自动化:

# cat /tmp/check_connectivity.sh
#!/bin/bash
server=10.10.10.10      # server IP
port=22                 # port
connect_timeout=5       # Connection timeout
ssh -q -o BatchMode=yes  -o StrictHostKeyChecking=no -o ConnectTimeout=$connect_timeout $server 'exit 0'
if [ $? == 0 ];then
   echo "SSH Connection to $server over port $port is possible"
else
   echo "SSH connection to $server over port $port is not possible"
fi

方法5:使用telnet测试SSH连接

  • telnet是检查端口状态的另一个非常方便的工具

-/usr/bin/telnet由telnet rpm提供,它是默认存储库的一部分,我们不需要任何第三方存储库

检查是否安装了" telnet"

# rpm -q telnet
telnet-0.17-65.el7_8.x86_64

语法:

# telnet <server> <port>

但是由于我们的最终目标是实现自动化,因此我们将调整语法

# echo quit | telnet <server> <port> 2>/dev/null | egrep -qi Connected

让我们用它来测试Linux中的SSH连接。
如果我们能够grep表示Connected,则可以访问"端口22",并且可以进行SSH连接。

[root@server1 ~]# echo quit | telnet server2 22 2>/dev/null | egrep -qi Connected
[root@server1 ~]# echo $?
0

如果我们得到一个"非零退出状态",这意味着我们无法在输出中进行grep Connected,因此不可能进行SSH连接。

[root@server1 ~]# echo quit | telnet server2 22 2>/dev/null | egrep -qi Connected
[root@server1 ~]# echo $?
1

Shell脚本示例

我们将在现有的示例shell脚本中使用telnet来测试SSH连接

# cat /tmp/check_connectivity.sh
#!/bin/bash
server=10.10.10.10      # server IP
port=22                 # port
connect_timeout=5       # Connection timeout
echo quit | telnet $server $port 2>/dev/null | egrep -qi "Connected"
if [ $? == 0 ];then
   echo "SSH Connection to $server over port $port is possible"
else
   echo "SSH connection to $server over port $port is not possible"
fi