脚本实现telnet检测指定机器端口的连通性

时间:2022-03-15 05:28:29
#!/bin/ksh


# shell script: checklink.sh
# function: auto check the link of server IP and PORT
# date:   2016.04.07
# modify: 2016.04.07
# copyright by Li Jian.

#根据系统类型的不同,加载系统环境变量
if [ `uname` = "Linux" ]
then
  PROFILE=.bash_profile
else
  PROFILE=.profile

fi

. $HOME/$PROFILE

#在脚本执行目录下创建日志文件 .log 和检测的最终结果文件.dat
resultfile=$PWD/checklink.dat
log_file=$PWD/checklink.log

#判断脚本执行的时候传递的参数个数是否正确,包括ip地址和端口号port两个参数
if [ $# -ne 2 ]
then
    echo `date +"%Y.%m.%d %T"`"the parameter numbers are not correct,exit!" >>${log_file}
    exit
fi

#读取传递的脚本参数
IP=$1
port=$2

#判断两个参数是否为空
if [ -z $IP -o -z $port ]
then
    echo `date +"%Y.%m.%d %T"`"the parameter should not be null,exit!" >>${log_file}
    exit
fi

#通过Ping命令先检测指定的ip地址是否能连通,通过ping命令发送四个包(可以是发送另外的数量),限制超时时间为3秒钟(也可以是其他值,具体要看能忍受多长时间的延迟),主要根据丢包的比例来决定该ip地址是否能连通,比如ping 百度返回id结果如下:

zxin10@ubuntu:~/lijian$ ping www.baidu.com -c 4 -w 3
PING www.a.shifen.com (180.97.33.108) 56(84) bytes of data.
64 bytes from 180.97.33.108: icmp_seq=1 ttl=128 time=3.79 ms
64 bytes from 180.97.33.108: icmp_seq=2 ttl=128 time=5.32 ms
64 bytes from 180.97.33.108: icmp_seq=3 ttl=128 time=3.92 ms


--- www.a.shifen.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2004ms


RATE=`ping -c 4 -w 3 $IP | grep 'packet loss' | grep -v grep | awk -F',' '{print $3}' | awk -F'%' '{print $1}'`     #得到丢包的比例的数值
#RATE=`ping -c 4 -w 3 $IP | grep 'packet loss' | grep -v grep | cut -f3 -d, | cut -f1 -d%`


if [ $RATE -eq 100 ]     #这个值具体可以设置成75、50等等,这里设置成包全丢的情况下为不通
then
    echo `date +"%Y.%m.%d %T"`" ping the $IP is not connected, FAILURE" >${log_file}
    echo "FAILURE"           #全丢了说明该IP地址不通
else
    telnet $IP $port<<@@@ 2>${resultfile} 1>&2               #否则telnet命令检测指定端口号PORT是否连通,如果可以连通,则立马quit退出连接,将连接结果和错误信息等都写入到结果文件中
quit
@@@


    RESULT=`cat ${resultfile} 2>/dev/null | grep "Connection closed by foreign host" | wc -l`        #匹配看结果文件中手否有这句话
    echo `date +"%Y.%m.%d %T"`"the result of telnet is $RESULT" >${log_file}
    
    if [ $RESULT -eq 1 ]
    then
        echo `date +"%Y.%m.%d %T"`" telnet the $IP and $port SUCCESS" >>${log_file}         #如果有的话就说明该端口是通的,返回结果字符串SUCCESS到文件并同时打印大屏幕上
        echo "SUCCESS"
    else
        echo `date +"%Y.%m.%d %T"`" telnet the $IP and $port FAILURE" >>${log_file}           #否则就说明该端口是不通的,打印FAILURE
        echo "FAILURE"
    fi
fi


rm -f ${resultfile}            #删除结果文件,日志文件保留


以上就是脚本文件 checklink.sh,用于自动的检测指定机器端口的连通性。

运行的时候先赋予脚本执行权限:

chmod +x checklnk.sh

然后执行脚本并传递两个参数:第一个IP地址,第二个端口号,比如:

./checklink.sh 192.168.25.67 21



疑问:这里为何不直接调用telnet命令来检测指定IP地址和端口号,而需要先调用ping命令,再调用telnet命令呢?

解答:对于telnet命令,当传递的ip地址不同的时候,就会陷入长时间的等待中,因为telnet不可设置超时时间,所以需要先通过ping命令筛除掉那些IP地址不通的IP,再通过telnet判断指定的端口,若是端口不通的话telnet会立刻返回的,如果短靠谱是可以连通,则立即quit退出telnet登陆,根据返回结果判断是否连通。


这里还有一篇很好的帖子,通过C语言程序来设置和控制telnet 的返回超时时间的,很经典

http://bbs.csdn.net/topics/340269286