전신, 네트워크, 교육 망 등 ISP 네트워크 에 대한 스 크 립 트 획득
제 가 개선 한 스 크 립 트 는 셸 의 병행 처 리 를 추 가 했 습 니 다. 각 IP 세그먼트 의 처리 프로 세 스 간 에 연관 성 이 없 기 때문에 스 크 립 트 처리 시간 을 크게 줄 일 수 있 습 니 다. thread 값 을 마음대로 변경 하여 처리 하 는 프로 세 스 수 를 조정 할 수 있 습 니 다. 물론 큰 thread 값 일수 록 더 적은 처리 시간 을 가 져 올 수 있 지만 서버 에 더 큰 스트레스 를 줄 수 있 습 니 다.
- #!/bin/bash
- DIR=/root/dns/script
- FILE=$DIR/ip_apnic
- CHN=$DIR/iplist
- tel=$DIR/CHINANET
- cnc=$DIR/CNCGROUP
- cer=$DIR/CERNET
- crtc=$DIR/CRTC
- cmnet=$DIR/CMNET
- other=$DIR/OTHER
- fifofile=$DIR/fifo
- thread=20 #
-
- rm -f $FILE
- rm -f $tel $cer $cnc $other $cmnet $crtc $CHN
- wget http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest -O $FILE
-
- rm -f $fifofile
- mkfifo $fifofile
- exec 6<>$fifofile
- rm $fifofile
- for ((i=0;i<$thread;i++))
- do
- echo
- done >&6
-
- grep 'apnic|CN|ipv4|' $FILE | cut -f 4,5 -d'|'|sed -e 's/|/ /g' >$CHN
-
- while read ip cnt
- do
- read -u6
- {
- echo $ip:$cnt
- mask=$(cat <<EOF | bc | tail -1
- pow=32;
- define log2(x) {
- if (x<=1) return (pow);
- pow--;
- return(log2(x/2));
- }
- log2($cnt)
- EOF
- )
- touch $DIR/$ip.tmp
- while [ -z "`cat $DIR/$ip.tmp`" ]
- do
- /etc/whois/bin/whois3 -h whois.apnic.net $1 >$DIR/$ip.tmp
- echo "TRY PROCESS __________________________________$ip"
- done # whois , whois
- num=`grep "CERNET" $DIR/$ip.tmp |wc -l`
- if [ "$num" != "0" ]
- then
- echo $ip/$mask >> $cer
- echo "cernet"
- echo >&6
- rm -f $DIR/$ip.tmp
- continue
- else
- 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; }'`
- if [ "$NETNAME" = "CNC" -o "$NETNAME" = "UNICOM" -o "$NETNAME" = "CNCGROUP" ]
- then
- echo $ip/$mask >> $cnc
- echo "cnc"
- echo >&6
- rm -f $DIR/$ip.tmp
- continue
- elif [ "$NETNAME" = "CHINATELECOM" -o "$NETNAME" = "CHINANET" ]
- then
- echo $ip/$mask >> $tel
- echo "chinanet"
- echo >&6
- rm -f $DIR/$ip.tmp
- continue
- else
- 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'`
- case $MB in
- CNCGROUP)
- echo $ip/$mask >> $cnc
- echo "cnc"
- echo >&6
- rm -f $DIR/$ip.tmp
- ;;
- CHINANET)
- echo $ip/$mask >> $tel
- echo "chinanet"
- echo >&6
- rm -f $DIR/$ip.tmp
- ;;
- *)
- num=`grep -E "CHINANET|CHINATELECOM" $DIR/$ip.tmp |wc -l`
- if [ "$num" != "0" ]
- then
- echo $ip/$mask >> $tel
- echo "chinanet"
- echo >&6
- rm -f $DIR/$ip.tmp
- continue
- else
- num=`grep "CRTC" $DIR/$ip.tmp |wc -l`
- if [ "$num" != "0" ]
- then
- echo $ip/$mask >> $crtc
- echo "railway"
- echo >&6
- rm -f $DIR/$ip.tmp
- continue
- else
- num=`grep "CMNET" $DIR/$ip.tmp |wc -l`
- if [ "$num" != "0" ]
- then
- echo $ip/$mask >> $cmnet
- echo "cmnet"
- echo >&6
- rm -f $DIR/$ip.tmp
- continue
- else
- num=`grep -E "China Unicom|CNC Group" $DIR/$ip.tmp |wc -l`
- if [ "$num" != "0" ]
- then
- echo $ip/$mask >> $cnc
- echo "cnc"
- echo >&6
- rm -f $DIR/$ip.tmp
- continue
- else
- echo $ip/$mask >> $other
- rm -f $DIR/$ip.tmp
- echo >&6
- fi
- fi
- fi
- fi
- ;;
- esac
- fi
- fi
- }&
- done <$CHN # , thread
-
- wait
- exec 6>&-
- echo "fisrt script is finished"
전체 스 크 립 트 는 복잡 해 보이 지만 사실은 whois 가 얻 은 정 보 를 처리 하 는 과정 입 니 다. 개 선 된 부분 은 스 크 립 트 의 실행 속 도 를 크게 향상 시 키 는 것 을 제외 하고 각 ISP 주소 세그먼트 의 처리 과정 을 조정 하여 더욱 정확 하 게 만 들 었 습 니 다. 제 가 두 달 동안 사용 한 결과 정확도 가 매우 높 고 대부분 응용 수 요 를 만족 시 킬 수 있 습 니 다.
연 결 된 IP 구간 은 CNCGROUP 파일 에 자동 으로 출력 되 고 전신의 출력 은 CHINANET 파일 에, 교육 망 은 CERNET 파일 에 출력 되 며 나 는 철통 과 이동 구간 의 처리 도 넣 었 다. 나머지 는 OTHER 파일 에 출력 된다. 너 는 수요 에 따라 자신 이 필요 로 하 는 ISP 의 구간 을 스스로 정할 수 있다.
이 스 크 립 트 의 가장 큰 하 이 라 이 트 는 here document 의 사용 입 니 다. 이 지루 하고 재 미 없 는 스 크 립 트 를 우아 하 게 만 들 었 고 더욱 간결 하 게 만 들 었 습 니 다. vim 을 사용 하여 here document 에 맞 춰 대량의 문 서 를 똑 같이 조작 할 수 있 습 니 다. 빠 르 고 정확 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Nginx 실제 IP 모듈 획득 httprealip_module이 경우 홈 페이지 에 있 는 Nginx 로그 나 응용 프로그램 에서 얻 은 ip 소스 는 항상 각 기관실 에서 Squid 의 IP 일 뿐 입 니 다.사용자 의 실제 IP 가 아 닙 니 다.아파 치 의 경우 위 에서...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.