1、脚本位置
略
2、脚本说明
2.1 原理
根据whois 和whois3命令去whois.apnic.net服务器上查询每个ip范围所归属的netname,依次区分省市和运营商(每个省市和运营商在apnic分配表上是单列的)
2.2 输入和输出文件
输入文件:apnic的最新ip分配列表
输出文件:所有国内ip的按省市的分布,格式为:开始ip-结束ip,运营商-省或直辖市(或者只有isp名称无省市)
2.3 函数说明
脚本为了更好的容错性,写了两个函数timeout()和get_ip_netname().
timeout()函数是防止因网络超时或其他原因导致脚本执行时间过长,其中限定了单次执行whois命令最长为5秒;
get_ip_netname()是个递归函数,持续扫描源文件直到所有ip列表都被成功执行过whois命令,即所有执行失败的whois查询都会在后续的递归调用中重新被查询到。
3、脚本
#!/bin/sh
#确定脚本执行目录
if [ $(echo $0 | grep '^/') ]; then
DATA_DIR=$(dirname $0)
else
DATA_DIR=$(pwd)/$(dirname $0)
fi
#设置超时函数,防单次whois执行超过timeout的设置值,超过则杀掉本次whois查询,并记录失败的ip
timeout(){
if [ $# -le 0 ]
then
echo "should input command"
exit -1
fi
command=$*
echo $command
$command &
commandpid=$!
echo $commandpid
count=1
timeout=5
ret=-1
while [ $count -le $timeout ]
do
if [ -z "`ps x |awk '{print $1}' |grep $commandpid `" ]
then
echo $command exit before timeout
wait $commandpid
ret=$?
exit $ret
fi
sleep 1
let 'count++'
done
kill -9 $commandpid
echo Timeout
exit $ret
}
#设置whois需要查询的源文件,从apnic获得;删除部分中间和临时文件
FILE=$DATA_DIR/ip_apnic
#如果每次执行都希望下载最新列表,那么需要解除rm -f $FILE和下面wget的注释
#rm -f $FILE
rm -f cn_all_by_province.txt cn_other.txt cn.net test.txt
#如果第一次执行,或者不是最是的ip列表,需要解除下面wget的注释
#wget -O $FILE
#获取ip的netname,格式为开始ip-结束ip,运营商-省市简称
function get_ip_netname() {
cat test.txt |while read ip cnt
do
NETNAME=`timeout whois $ip | grep -A1 inetnum| sed 'N;s/\n//g'|sed 's/inetnum://g'|sed 's/netname:/,/g' |sed 's/ //g'`
if [ "$?" -eq "0" ] ; then
echo $ip,$cnt,$NETNAME >>cn.net
#如果执行成功则在test.txt中删除本行
sed -i '/'"$ip"'/d' test.txt
fi
echo $NETNAME
case $NETNAME in
*CNCGROUP*|*UNICOM*)
# echo $ip,$cnt,$NETNAME >>cn_all_by_province.txt
echo $NETNAME >>cn_all_by_province.txt
;;
*CHINANET*)
#echo $ip,$cnt,$NETNAME >>cn_all_by_province.txt
echo $NETNAME >>cn_all_by_province.txt
;;
#这里暂时注释掉移动的ip因为该方法获取的CMNET的总表和部分省份ip范围,后面有获取分省份的细分ip范围的命令
*CMNET*)
# #echo $ip,$cnt,$NETNAME >>cn_all_by_province.txt
echo $NETNAME >>cn_cm_all.txt
;;
*CRTC*)
# #echo $ip,$cnt,$NETNAME >>cn_all_by_province.txt
echo $NETNAME >>cn_cm_all.txt
;;
*)
#echo $ip,$cnt,$NETNAME >>cn_other.txt
echo $NETNAME >>cn_other.txt
;;
esac
done
linenum=`wc -l test.txt|awk '{print $1}'`
if [ "$linenum" -ge "1" ]; then
echo $linenum
get_ip_netname
else
return 0
fi
}
grep 'apnic|CN|ipv4|' $FILE | cut -f 4,5 -d'|'|sed -e 's/|/ /g'> test.txt
get_ip_netname
#获取移动和铁通的ip列表
#移动ip
whois-3.1/whois3 -h whois.apnic.net -l -i mb MAINT-CN-CMCC | grep -A1 inetnum | sed '-e/--/d'| sed 'N;s/\n//g'|sed 's/inetnum://g'|sed 's/netname://g'|awk '{print $1,$2,$3,",",$4}' >cm.txt
sed -i 's/[ ]//g' cm.txt
#获取铁通ip
whois-3.1/whois3 -h whois.apnic.net -l -i mb MAINT-CN-CRTC | grep -A1 inetnum | sed '-e/--/d'| sed 'N;s/\n//g'|sed 's/inetnum://g'|sed 's/netname://g' |awk '{print $1,$2,$3,",",$4}'>CRTC.txt
sed -i 's/[ ]//g' CRTC.txt
#汇总ip列表,awk删掉netname后面无用信息,保证格式仅为”ip开始-ip结束,netname“
cat cn_all_by_province.txt cn_other.txt cm.txt CRTC.txt |awk '{print $1}'>ip.txt
4、备注
whois3命令需要提前安装