Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1764726
  • 博文数量: 150
  • 博客积分: 660
  • 博客等级: 上士
  • 技术积分: 2480
  • 用 户 组: 普通用户
  • 注册时间: 2005-08-08 11:39
文章分类

全部博文(150)

文章存档

2019年(4)

2018年(36)

2017年(53)

2016年(7)

2015年(3)

2014年(3)

2013年(27)

2012年(2)

2011年(1)

2006年(1)

2005年(13)

分类: 系统运维

2013-09-18 12:53:14

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命令需要提前安装
   


阅读(2824) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~