전신, 네트워크, 교육 망 등 ISP 네트워크 에 대한 스 크 립 트 획득

연결, 전신, 교육 망 등 ISP 의 네트워크 를 받 아야 할 때 가 많 습 니 다. 서로 다른 ISP 간 의 연결 이 매우 좋 지 않 고 지연 이 매우 높 기 때문에 인터넷 에 매우 높 은 셸 스 크 립 트 가 ISP 의 네트워크 를 얻 는 데 사 용 됩 니 다. 제 버 전도 이 버 전에 따라 수정 되 었 습 니 다. 사실은 생각 이 똑 같 습 니 다.모두 apnic 의 whois 서버 를 통 해 정 보 를 얻 고 정리 한 것 입 니 다.
제 가 개선 한 스 크 립 트 는 셸 의 병행 처 리 를 추 가 했 습 니 다. 각 IP 세그먼트 의 처리 프로 세 스 간 에 연관 성 이 없 기 때문에 스 크 립 트 처리 시간 을 크게 줄 일 수 있 습 니 다. thread 값 을 마음대로 변경 하여 처리 하 는 프로 세 스 수 를 조정 할 수 있 습 니 다. 물론 큰 thread 값 일수 록 더 적은 처리 시간 을 가 져 올 수 있 지만 서버 에 더 큰 스트레스 를 줄 수 있 습 니 다.

  
  
  
  
  1. #!/bin/bash   
  2. DIR=/root/dns/script   
  3. FILE=$DIR/ip_apnic   
  4. CHN=$DIR/iplist   
  5. tel=$DIR/CHINANET   
  6. cnc=$DIR/CNCGROUP   
  7. cer=$DIR/CERNET   
  8. crtc=$DIR/CRTC   
  9. cmnet=$DIR/CMNET   
  10. other=$DIR/OTHER   
  11. fifofile=$DIR/fifo   
  12. thread=20 #   
  13.    
  14. rm -f $FILE   
  15. rm -f $tel $cer $cnc $other $cmnet $crtc $CHN   
  16. wget http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest -O $FILE   
  17.    
  18. rm -f $fifofile   
  19. mkfifo $fifofile   
  20. exec 6<>$fifofile   
  21. rm $fifofile   
  22. for ((i=0;i<$thread;i++))   
  23. do   
  24.    echo   
  25. done >&6   
  26.    
  27. grep 'apnic|CN|ipv4|' $FILE | cut -f 4,5 -d'|'|sed -e 's/|/ /g' >$CHN   
  28.    
  29. while read ip cnt   
  30. do   
  31.        read -u6   
  32.        {   
  33.         echo $ip:$cnt   
  34.         mask=$(cat <<EOF | bc | tail -1   
  35.         pow=32;   
  36.         define log2(x) {   
  37.         if (x<=1) return (pow);   
  38.                 pow--;   
  39.                 return(log2(x/2));   
  40.         }   
  41.         log2($cnt)   
  42. EOF   
  43. )   
  44.          touch $DIR/$ip.tmp   
  45.          while [ -z "`cat $DIR/$ip.tmp`" ]   
  46.          do   
  47.              /etc/whois/bin/whois3 -h whois.apnic.net $1 >$DIR/$ip.tmp   
  48.              echo "TRY PROCESS __________________________________$ip"   
  49.          done                 #  whois , whois   
  50.          num=`grep "CERNET" $DIR/$ip.tmp |wc -l`   
  51.                 if [ "$num" != "0" ]   
  52.                 then   
  53.                         echo $ip/$mask >> $cer   
  54.                         echo "cernet"   
  55.                         echo >&6   
  56.                         rm -f $DIR/$ip.tmp   
  57.                         continue   
  58.                 else   
  59.                          NETNAME=`sed -e '/./{H;$!d;}' -e 'x;/netnum/!d' $DIR/$ip.tmp |grep ^netname | sed -e 's/.*: \(.*\)/\1/g' | sed -e 's/-.*//g'| sed -e 's/cJ/ /g' | awk -F' ' '{ printf $1; }'`   
  60.                         if [ "$NETNAME" = "CNC" -o "$NETNAME" = "UNICOM" -o "$NETNAME" = "CNCGROUP"  ]   
  61.                         then   
  62.                                 echo $ip/$mask >> $cnc   
  63.                                 echo "cnc"   
  64.                                 echo >&6   
  65.                                 rm -f $DIR/$ip.tmp   
  66.                                 continue   
  67.                         elif [ "$NETNAME" = "CHINATELECOM" -o "$NETNAME" = "CHINANET" ]   
  68.                         then   
  69.                                 echo $ip/$mask >> $tel   
  70.                                 echo "chinanet"   
  71.                                 echo >&6   
  72.                                 rm -f $DIR/$ip.tmp   
  73.                                 continue   
  74.                         else   
  75.                                 MB=`sed -e '/./{H;$!d;}' -e 'x;/mnt-by/!d' $DIR/$ip.tmp|grep ^mnt-by |head -1| sed -e 's/.*: \(.*\)/\1/g' |sed  -e 's/ *MAINT-//g'| sed -e 's/-.*//g'`   
  76.                                 case $MB in   
  77.                                 CNCGROUP)   
  78.                                         echo $ip/$mask >> $cnc   
  79.                                         echo "cnc"   
  80.                                         echo >&6   
  81.                                         rm -f $DIR/$ip.tmp   
  82.                                 ;;   
  83.                                 CHINANET)   
  84.                                         echo $ip/$mask >> $tel   
  85.                                         echo "chinanet"   
  86.                                         echo >&6   
  87.                                         rm -f $DIR/$ip.tmp   
  88.                                 ;;   
  89.                                 *)   
  90.                                         num=`grep -E "CHINANET|CHINATELECOM" $DIR/$ip.tmp |wc -l`   
  91.                                         if [ "$num" != "0" ]   
  92.                                         then   
  93.                                                 echo $ip/$mask >> $tel   
  94.                                                 echo "chinanet"   
  95.                                                 echo >&6   
  96.                                                 rm -f $DIR/$ip.tmp   
  97.                                                 continue   
  98.                                         else   
  99.                                                 num=`grep "CRTC" $DIR/$ip.tmp |wc -l`   
  100.                                                 if [ "$num" != "0" ]   
  101.                                                 then   
  102.                                                         echo $ip/$mask >> $crtc   
  103.                                                         echo "railway"   
  104.                                                         echo >&6   
  105.                                                         rm -f $DIR/$ip.tmp   
  106.                                                         continue   
  107.                                                 else   
  108.                                                         num=`grep "CMNET" $DIR/$ip.tmp |wc -l`   
  109.                                                         if [ "$num" != "0" ]   
  110.                                                         then   
  111.                                                                 echo $ip/$mask >> $cmnet   
  112.                                                                 echo "cmnet"   
  113.                                                                 echo >&6   
  114.                                                                 rm -f $DIR/$ip.tmp   
  115.                                                                 continue   
  116.                                                         else   
  117.                                                                 num=`grep -E "China Unicom|CNC Group" $DIR/$ip.tmp |wc -l`   
  118.                                                                 if [ "$num" != "0" ]   
  119.                                                                 then   
  120.                                                                         echo $ip/$mask >> $cnc   
  121.                                                                         echo "cnc"   
  122.                                                                         echo >&6   
  123.                                                                         rm -f $DIR/$ip.tmp   
  124.                                                                         continue   
  125.                                                                 else   
  126.                                                                         echo $ip/$mask >> $other   
  127.                                                                         rm -f $DIR/$ip.tmp   
  128.                                                                         echo >&6   
  129.                                                                 fi   
  130.                                                         fi   
  131.                                                 fi   
  132.                                         fi   
  133.                                 ;;   
  134.                                 esac   
  135.                           fi   
  136.                    fi   
  137.        }&   
  138. done <$CHN # , thread   
  139.    
  140. wait   
  141. exec 6>&-   
  142. echo "fisrt script is finished"   

전체 스 크 립 트 는 복잡 해 보이 지만 사실은 whois 가 얻 은 정 보 를 처리 하 는 과정 입 니 다. 개 선 된 부분 은 스 크 립 트 의 실행 속 도 를 크게 향상 시 키 는 것 을 제외 하고 각 ISP 주소 세그먼트 의 처리 과정 을 조정 하여 더욱 정확 하 게 만 들 었 습 니 다. 제 가 두 달 동안 사용 한 결과 정확도 가 매우 높 고 대부분 응용 수 요 를 만족 시 킬 수 있 습 니 다.
연 결 된 IP 구간 은 CNCGROUP 파일 에 자동 으로 출력 되 고 전신의 출력 은 CHINANET 파일 에, 교육 망 은 CERNET 파일 에 출력 되 며 나 는 철통 과 이동 구간 의 처리 도 넣 었 다. 나머지 는 OTHER 파일 에 출력 된다. 너 는 수요 에 따라 자신 이 필요 로 하 는 ISP 의 구간 을 스스로 정할 수 있다.
이 스 크 립 트 의 가장 큰 하 이 라 이 트 는 here document 의 사용 입 니 다. 이 지루 하고 재 미 없 는 스 크 립 트 를 우아 하 게 만 들 었 고 더욱 간결 하 게 만 들 었 습 니 다. vim 을 사용 하여 here document 에 맞 춰 대량의 문 서 를 똑 같이 조작 할 수 있 습 니 다. 빠 르 고 정확 합 니 다.

좋은 웹페이지 즐겨찾기