背景:我们某个机房交换机需要替换,替换完成后,我们也需要校验主机和服务的连通性。以前只测某个主机时,测网络的话就ping一下,测端口的话就telnet一下。现在机器多起来,挨个敲命令就太麻烦了。花了一点时间写了一个通用脚本,现在分享一下。
分享脚本前先普及一下,脚本里核心的原理和方法
测试网络
测试网络,我们都会用ping,但是linux默认情况下ping会一直进行(windows是默认4次),所以查阅一下ping命令的参数(ping -h),可以发现用-c参数指定ping的次数。
另外ping命令执行后,执行
?
会
返
回
值
0
(
成
功
)
,
p
i
n
g
有
异
常
时
,
继
续
执
行
?会返回值0(成功),ping有异常时,继续执行
?会返回值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]"