以下示例只是提供一些思路和簡易的方法。請參考使用。以下代碼在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
