一、需求说明
我们在编写网络相关脚本的时候,尝尝会遇到需要判断IP地址是否合法的问题,需要知道输入的IP地址是否为一个正确的IP地址。又或者我们需要知道IP地址是公网IP地址还是私网IP地址。此博文就是为了满足这个需求而编写,用于验证输入的IP地址是否合法,入IP地址格式错误返回1,输入正确可用IP(公网、私网)返回0,输入环回口IP、组播IP等返回2。输入常见的特殊IP地址也会告知验证结果。关于IP地址的介绍见博文TCP/IP之IP协议及IP地址详解。
二、脚本内容
#!/bin/bash
#script name: ipcheck.sh
#author: wuhs
#version: v1
#date: 2022-05-18
#description: 此脚本用于验证输入IP地址是否为有效IP地址
#description: 输入IP地址格式错误返回1,输入正确可用IP(公网、私网)返回0,输入环回口IP、组播IP等返回2
#函数定义
function ipcheck(){
local IP=$1
VALID_CHECK=$(echo $IP|awk -F. '$1<=255&&$2<=255&&$3<=255&&$4<=255{print "yes"}')
if echo $IP|grep -E "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$" >/dev/null;then
if [[ $VALID_CHECK = "yes" ]];then
echo "$IP 满足IP格式数字要求"
p1=$(echo $IP|cut -d. -f1)
p2=$(echo $IP|cut -d. -f2)
p3=$(echo $IP|cut -d. -f3)
p4=$(echo $IP|cut -d. -f4)
if [ $p1 == 127 ];then
echo "$IP 是一个环回口地址"
return 2
elif [ $p1==169 -a $p2 == 254 ];then
echo "$IP 是一个自动专用IP地址,window终端在DHCP获取地址失败时分配的地址"
return 2
elif [ $p1 == 0 -a $p2 == 0 -a $p3 == 0 -a $p4 == 0 ];then
echo "$IP 表示任意地址,用于配置默认路由"
return 2
elif [ $p1 == 255 -a $p2 == 255 -a $p3 == 255 -a $p4 == 255 ];then
echo "$IP 表示限制广播地址"
return 2
elif [ $p1 -ge 224 -a $p1 -le 239 ];then
echo "$IP 是一个D类地址,用于组播"
return 2
elif [ $p1 -ge 240 -a $p1 -le 247 ];then
echo "$IP 是一个E类地址,属于实验室保留地址"
return 2
elif [ $p1 == 0 -a $p4 == 255 ];then
echo "$IP 可能是一个反向掩码"
return 2
elif [ $p1 == 10 ];then
echo "$IP 是一个私网IP地址"
return 0
elif [ $p1 == 172 -a $p2 -ge 16 -a $p2 -le 31 ];then
echo "$IP 是一个私网IP地址"
return 0
elif [ $p1 == 192 -a $p2 == 168 ];then
echo "$IP 是一个私网IP地址"
return 0
elif [ $p1 != 0 ];then
echo "$IP 是一个公网IP地址"
return 0
else
echo "$IP 无效!"
return 1
fi
else
echo "$IP 无效,请检查并重新输入!"
return 1
fi
else
echo "格式错误,请重新输入!"
return 1
fi
}
#带IP参数执行脚本则执行检查参数IP是否正确,否则弹窗要求出入IP
if [ $# == 0 ]; then
while true;
do
read -p "请输入待检查IP: " IP
ipcheck $IP
[ $? -ne 1 ] && break || continue
done
else
ipcheck $1
fi
三、使用示例
1、无参数执行脚本
[root@s146 ipcheck]# ./ipcheck.sh
请输入待检查IP: a.b.c.c
格式错误,请重新输入!
请输入待检查IP: 100.200.300.400
100.200.300.400 无效,请检查并重新输入!
请输入待检查IP: 1.1.1.1
1.1.1.1 满足IP格式数字要求
1.1.1.1 是一个公网IP地址
2、带参数执行脚本
[root@s146 ipcheck]# ./ipcheck.sh 2.2.2.2
2.2.2.2 满足IP格式数字要求
2.2.2.2 是一个公网IP地址
3、验证环回口IP
[root@s146 ipcheck]# ./ipcheck.sh 127.0.0.3
127.0.0.3 满足IP格式数字要求
127.0.0.3 是一个环回口地址
[root@s146 ipcheck]# ./ipcheck.sh 127.0.0.253
127.0.0.253 满足IP格式数字要求
127.0.0.253 是一个环回口地址
4、验证window自动专用IP
[root@s146 ipcheck]# ./ipcheck.sh 169.254.1.1
169.254.1.1 满足IP格式数字要求
169.254.1.1 是一个自动专用IP地址,window终端在DHCP获取地址失败时分配的地址
5、验证私网IP
[root@s146 ipcheck]# ./ipcheck.sh 10.20.30.40
10.20.30.40 满足IP格式数字要求
10.20.30.40 是一个私网IP地址
[root@s146 ipcheck]# ./ipcheck.sh 172.16.100.1
172.16.100.1 满足IP格式数字要求
172.16.100.1 是一个私网IP地址
[root@s146 ipcheck]# ./ipcheck.sh 192.168.200.100
192.168.200.100 满足IP格式数字要求
192.168.200.100 是一个私网IP地址
6、验证组播IP
[root@s146 ipcheck]# ./ipcheck.sh 224.0.0.5
224.0.0.5 满足IP格式数字要求
224.0.0.5 是一个D类地址,用于组播
[root@s146 ipcheck]# ./ipcheck.sh 224.0.0.6
224.0.0.6 满足IP格式数字要求
224.0.0.6 是一个D类地址,用于组播
7、其他特殊IP地址验证
[root@s146 ipcheck]# ./ipcheck.sh 0.0.0.0
0.0.0.0 满足IP格式数字要求
0.0.0.0 表示任意地址,用于配置默认路由
[root@s146 ipcheck]# ./ipcheck.sh 255.255.255.255
255.255.255.255 满足IP格式数字要求
255.255.255.255 表示限制广播地址
[root@s146 ipcheck]# ./ipcheck.sh 0.0.0.255
0.0.0.255 满足IP格式数字要求
0.0.0.255 可能是一个反向掩码
[root@s146 ipcheck]# ./ipcheck.sh 247.1.2.3
247.1.2.3 满足IP格式数字要求
247.1.2.3 是一个E类地址,属于实验室保留地址
[root@s146 ipcheck]# ./ipcheck.sh 0.0.10.2
0.0.10.2 满足IP格式数字要求
0.0.10.2 无效!