• 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

  • 相关阅读:
    (转)【经验之谈】Git使用之Windows环境下配置
    (转)SQL Server内存遭遇操作系统进程压榨案例
    (转)【javascript基础】原型与原型链
    (转)微信公众平台开发教程目录
    (转)C# .net微信开发,开发认证,关注触发消息,自动应答,事件响应,自定义菜单
    (转)利用快速开发框架,快速搭建微信浏览博客园首页文章
    (转)微信公众平台开发教程(七)Session处理
    多线程入门-创建线程
    MySQL数据库优化
    图解:从单个服务器扩展到百万用户的系统
  • 原文地址:https://www.cnblogs.com/listenerln/p/7735786.html
Copyright © 2020-2023  润新知