Linux shell自动化检测 网络与端口 联通情况

背景:我们某个机房交换机需要替换,替换完成后,我们也需要校验主机和服务的连通性。以前只测某个主机时,测网络的话就ping一下,测端口的话就telnet一下。现在机器多起来,挨个敲命令就太麻烦了。花了一点时间写了一个通用脚本,现在分享一下。

分享脚本前先普及一下,脚本里核心的原理和方法

测试网络

测试网络,我们都会用ping,但是linux默认情况下ping会一直进行(windows是默认4次),所以查阅一下ping命令的参数(ping -h),可以发现用-c参数指定ping的次数。
另外ping命令执行后,执行 ? 0 p i n g ?会返回值0(成功),ping有异常时,继续执行 ?会返回值>0(异常)。简单的代码如下:

HOST=8.8.8.8
ping -c 4 "$HOST"  ##这里设置4次,参考windows默认值
echo $?

测试端口
测试端口,我们一般都会用telnet,但是telnet貌似没有次数或时长的参数。我这里用的nc命令来测试。nc有个-t参数可以设置超时时长,-z参数是只用于扫描测试(我理解就是不会影响原服务),执行nc命令后,也用$?来检测结果是否有异常。简单代码如下:

HOST=8.8.8.8
PORT=8080
nc -w 10 -z $HOST $PORT ##-w设置超时时长10秒
echo $?

没有nc情况下

#!/bin/bash
IPADDR=$1
PORT=$2
 
if [ $# -ne 2 ]; then
    echo "Usage:"
    echo "  $0 [IPADDR|DOMAIN] [PORT]"
    echo ""
    echo "Examples:"
    echo "  $0 localhost 80"
    echo "  $0 192.168.1.1 80"
    exit
fi
 
result=`echo -e "\n" | telnet $IPADDR $PORT 2>/dev/null | grep Connected | wc -l`
 
if [ $result -eq 1 ]; then
      echo "Network is Open."
else
      echo "Network is Closed."
fi

自动化多IP,多端口测试脚本
好了,放大招了~~脚本注释直接写脚本里了,不影响执行哦

vi net_check.sh
#! /bin/bash
# 这一段代码实现:用户可以自己指定待扫描的列表文件,不指定的话,默认找同级目录的net.list文件。
ARGS_NUM=$#
if [ $ARGS_NUM -eq 0 ]; then
  LIST="net.list"
elif [ $ARGS_NUM -eq 1 ]; then
  LIST=$1
  [ ! -f $LIST ] && echo "File[$LIST] does not exists !" && exit 1
else
  echo "Usage net_check.sh [net_list_file]" && exit 1
fi

#这一段代码是实现通用日志打印,后面日志打印直接调用,不用辣么麻烦拼日期什么啦~~
#参考java的log4j,可能有的机器不支持printf命令
#如果对输出格式无所谓的话,用echo也一样的
#FUNCTION
log(){
  if [ $# -eq 2 ];then
    printf "%-5s `date '+%F %T'` $2\n" ${1^^}
  else
    printf "%-5s `date '+%F %T'` $*\n" INFO
  fi
}

#这一段代码是实现测试网络的,原理见文章里
#FUNCTION
ping_check(){
  HOST=$1
  log "Ping check : $HOST"
  ping -c 4 "$HOST" > /dev/null
  if [ $? -eq 0 ];then
    log "Ping $HOST successfully"
  else
    log "ERROR" "Ping $HOST failed"
  fi
}

#这一段代码是实现测试端口的,原理见文章里
#FUNCTION
port_check(){
  HOST=${1%%" "*}  ##根据空格,截取前者。也可以用awk等命令实现
  PORT=${1##*" "}  ##根据空格,截取后者。
  log "Port check : $HOST $PORT"
  nc -w 10 -z $HOST $PORT > /dev/null
  if [ $? -eq 0 ];then
    log "Port $HOST $PORT successfully"
  else
    log "ERROR" "Port $HOST $PORT failed"
  fi
}

#真正的执行在这里啦~~
#MAIN
cat $LIST|grep -v "#"|while read line  #剔除带#注释的行
do
  NET=`echo ${line##" "}`  #ltrim
  NET=`echo ${NET%%" "}`   #rtrim
  NET_PARA_NUM=`echo "$NET"|awk -F[" "]+ '{print NF}'`  #判断有几个参数
  if [ $NET_PARA_NUM -eq 1 ]; then
    ping_check "$NET"
  elif [ $NET_PARA_NUM -eq 2 ]; then
    port_check "$NET"
  else
    log error "Please make sure your config\"$line\" with the format\"HOST [PORT]\"" 
  fi
done
vi net.list
#test ping
8.8.8.8
10.1.1.1
#test port
10.1.1.1 21
10.1.1.1 22

测试结果展示:

INFO  2019-08-29 14:43:48 Ping check : 8.8.8.8
INFO  2019-08-29 14:43:51 Ping 8.8.8.8 successfully
INFO  2019-08-29 14:43:51 Port check : 10.1.1.1 21
ERROR 2019-08-29 14:43:51 Port 10.1.1.1 21 failed
ERROR 2019-08-29 14:43:51 Please make sure your config"10.1.1.1 21 80" with the format"HOST [PORT]"
发布了147 篇原创文章 · 获赞 72 · 访问量 49万+

猜你喜欢

转载自blog.csdn.net/diyiday/article/details/100144498