您的位置:首页 > 运维架构 > Shell

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

2016-04-09 10:33 1526 查看
#!/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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  shell telnet ping