シェルでプライベートIPアドレスかどうかを判断する

ファイル名:privateip.sh
中身:

#!/bin/bash
##IPアドレスはプライベートかどうかを判断する
## $1 IPアドレス
## リターン: 0プライベートIP,
##   1グローバルIP,
##   2入力エラー
is_local_ip (){
local S_IP=$1
echo $S_IP | egrep -q '^\s*[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\s*$’ || return 2
#RANGES=’10.0.0.0:10.255.255.255 172.16.0.0:172.31.255.255 192.168.0.0:192.168.255.255′
##プライベートアドレス範囲の値は十進数整数の値に変わる
RANGES=’167772160:184549375 2886729728:2887778303 3232235520:3232301055′
## xx桁の表示形式 256^3 256^2 256 1
STEP=(xx 16777216 65536 256 1)

##IPを10進整数へ変換する
ip2int(){
local S_IP=$1
local D_IP=0
for i in {1..4};do
T=`echo $S_IP | cut -d’.’ -f$i`
[ x$T = x0 -o “x$T" = “x" ] && continue
D_IP=`expr $T \* ${STEP[“$i"]} + $D_IP`
done
echo $D_IP
}

for RANGE in $RANGES; do
RANGE_S=${RANGE%:*}
RANGE_E=${RANGE#*:}
INT_IP=`ip2int $IP`
if [ $INT_IP -ge $RANGE_S -a $INT_IP -le $RANGE_E ] ;then
return 0
fi
done
return 1
}

###次にデモンストレーションです
IPS=’10.1.1.1 10.255.255.255 9.0.0.1 11.0.0.1 192.168.0.0 192.167.0.0 172.15.255.255 172.16.0.0 172.31.0.1 172.32.0.1 255.255.252.2x 172.16.9.255 10.3.5.0 255.10.255
.0 172.172.6.0 10.172.0.1′
for IP in $IPS;do
if is_local_ip $IP ;then
echo -e “$IP\tTrue"
else
echo -e “$IP\tFail"
fi
done

Source

Posted by arkgame