前言
在Linux服务器中我们偶尔会需要用到telnet命令来帮助我们判断当前服务器到其他服务器应用的网络关系是否开通,交互式的telnet对于我们批量验证网络关系并不友好,因此本篇文章将分享一下怎么用脚本的方式来批量验证telnet的结果。希望对各位读者有所帮助
在开始之前,我们先简单说一下telnet
命令,telnet
命令支持2种模式:会话模式和命令模式,一般情况下我们使用telnet ip port
连接到某个服务上面时就会进入到会话模式,此时我们可以通过命令和远程的服务端进行交互。退出的时候使用ctrl+]
退出会话模式(进入到命令模式),再输入quit
退出命令模式,此时才能完全退出telnet命令。
可以看到退出telnet
命令略显麻烦,下面我们来说一下如何快速的退出telnet
命令,可以结合echo
命令帮助我们完成。在连接成功/失败后会自动断开连接。
echo "" | telnet ip port
上面的命令虽然解决了快速退出telnet
的需要,但还是不够优雅,因为这里还面临1个问题:无法控制超时时间,我们可以结合timeout
命令来设置一个超时时间,例如下面的例子
echo "" | timeout --signal 9 2 telnet 39.98.74.233 80
上面的脚本解决了处理连接超时的问题,但是结果输出略显冗余,我们还可以进一步用脚本做优化,使用$?
来接收命令的执行,以下面的脚本为例,我们来简单分析一下这个脚本的执行流程。
① 定义需要扫描的ip和端口
② 使用timeout
命令设置telnet
命令的超时时间
③ 使用echo追加字符串来强制退出telnet
这里有个小细节,我们在前面说过telnet退出第一次后会进入到命令模式,想要完整的退出的话需要额外输入close
或者quit
命令,这里使用-e
命令使echo
具备解析转义字符的能力,而\x1d
和\x0d
分别对应16进制下的1d
和0d
,对应ASCII中的空格键和回车键。从而让我们可以同时退出telnet
的两种模式。
④ eval
命令用于把一长串的命令当做一个整体命令来执行,方便我们对输出结果进行统一的重定向
⑤使用$?
判断telnet
命令是否正常联通,输出我们想要的结果语句
PS:如果需要扫描很多组不同的IP和端口的话,建议可以再把下面的脚本优化一下,抽一个函数出来处理。
#!/bin/bash
ipList=("10.10.10.10" "10.33.33.33")
portList=("80")
for ip in ${ipList[@]}
do
for port in $portList
do
eval "echo -e '\x1dclose\x0d' | timeout --signal=9 2 telnet $ip $port" >/dev/null 2>&1
if [ $? -ne 0 ]; then
echo "connect $ip $port fail!"
else
echo "connect $ip $port success."
fi
done
done