在Linux和Unix中测试SSH连接
在本文中,我将通过实时的实际示例共享不同的命令和方法来在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连接
在我之前的文章中,我分享了使用
nc
和ncat
在Linux服务器之间传输文件的步骤。我们还可以使用nc和ncat实用程序从目标主机检查端口状态并测试SSH连接
nc
和ncat
由nmap-ncat
rpm提供
检查服务器上是否安装了" 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