Linux Shell脚本中对IP子网掩码和网关的有效性判断[转]
Posted listenerln
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux Shell脚本中对IP子网掩码和网关的有效性判断[转]相关的知识,希望对你有一定的参考价值。
以下示例只是提供一些思路和简易的方法。请参考使用。以下代码在bash中验证通过,如果使用其它shell请自行调整。
1:IP格式效性判断
1 #return 1(failure) invalid ip,0(success) valid ip 2 is_valid_ip_format() 3 { 4 if [[ "$1" =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]] ;then 5 return 0 6 else 7 return 1 8 fi 9 }
补充说明:
if判断语句中使用shell的正则表达式,请注意,在正则表达式上是不需要加引号的!这是shell的新特性,网上有类似语句但是无法使用就是因为在正则表达式上加了引号。
2:IP冲突检测
1 #return 1(failure) conflict,0(success) not conflict 2 is_ip_conflict() 3 { 4 conflict=`ping -c 2 -t 1 $1 >/dev/null 2>&1 && arp $1` 5 if [ -z "$conflict" ];then 6 return 0 7 else 8 return 1 9 fi 10 }
补充说明:
IP冲突检测看起来是一个很复杂的问题,其实在TCP/IP协议中,IP冲突检测是ARP协议的一个额外功能,原理很简单,使用ARP协议向网络中广播自己的IP地址,如果收到响应则存在IP冲突,这个功能在TCP/IP协议第一卷ARP协议一章有详细介绍。这里先使用ping命令来探测一下设定的IP地址,然后在ARP缓存中查找是否存在有效的记录,如果有则存在IP冲突。这里不用关心ping命令是否能成功,不论是否成功,只要机器开着,ARP都能获取到其MAC地址,因为ARP工作在数据链路层。
3:子网掩码验证
1 #return 1(failure) is not a valid mask,0(success) is a valid mask 2 is_valid_mask() 3 { 4 nm=$(aton $1) 5 6 bit=1 7 flag=0 8 for i in {0..31} 9 do 10 v=$(( $bit << $i)) 11 flag=$(($nm & $v)) 12 if [ $flag -ne 0 ];then 13 break 14 fi 15 done 16 17 # ex:xxx.xxx.xxx.254/255 are not a valid mask 18 if [ "$i" -lt 2 ];then 19 return 1 20 fi 21 22 for j in `seq $i 31` 23 do 24 v=$(( $bit << $j)) 25 flag=$(($nm & $v)) 26 if [ $flag -eq 0 ];then 27 break 28 fi 29 done 30 31 if [ "$flag" -eq 0 ];then 32 return 1 33 else 34 return 0 35 fi 36 }
补充说明:
子网掩码也可以认为是一个非常有特点的IP地址。其特点在于,如果将子网掩码转成二进制,那么其中的1和0是连续的,也就是不会存在1和0交叉出现的现象,也正因为这样,IP配置才可以有192.168.1.23/24 这样的写法。所以,检测子网掩码是否有效就是判断其中的1是否是连续的。
4:IP、子网掩码和网关的有效性判断
1 #return 1(failure) is not a valid net,0(success) is a valid net 2 is_valid_net() 3 { 4 ip=$1 5 mask=$2 6 gw=$3 7 8 #ip&mask == gw&mask while is a valid net 9 ipn=$(aton $ip) 10 maskn=$(aton $mask) 11 gwn=$(aton $gw) 12 13 if [ $(($ipn & $maskn)) -ne $(($gwn & $maskn)) ];then 14 return 1 15 else 16 return 0 17 fi 18 }
补充说明:
作为网络基础,主机IP和网关应该在同一个子网内,基于此,可以作为简单判断IP地址、子网掩码和网关的基本原理,即IP地址与子网掩码进行位与的结果应该和网关与子网掩码位与结果相同。
5:IP地址字符串转整数
1 aton() 2 { 3 echo $1|gawk ‘{c=256;split($0,ip,".");print ip[4]+ip[3]*c+ip[2]*c^2+ip[1]*c^3}‘ 4 }
补充说明:
将IP地址转为整数,这应该是一个最基本的数据转换,方便进行计算。上面的4和5两个方法都是用到了这个函数。
ref: http://blog.csdn.net/ssmile/article/details/53188050
以上是关于Linux Shell脚本中对IP子网掩码和网关的有效性判断[转]的主要内容,如果未能解决你的问题,请参考以下文章
主机ip子网掩码 默认网关最后不是0,1。 linux的ip怎么设置?