⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dnsstats

📁 早期freebsd实现
💻
字号:
#!/bin/shPATH=:/bin:/usr/bin:/usr/ucb:/usr/local/bin# -------------------------------------------------------------#  Copyright (c) 1989, 1993 Regents of the University of Michigan.#  All rights reserved.##  Redistribution and use is permitted provided that this notice #  is preserved and that due credit is given to the University of #  Michigan. The name of the University may not be used to endorse #  or promote products derived from this software without specific #  prior written permission. This software is provided "as is" #  without express or implied warranty.##  DNS Statistics gatherer#  Author:  Bryan Beecher#  Last Modified:   7/8/93##  To make use of this software, you need to be running a copy of#  BIND 4.9 compiled with the QRYLOG option defined.##  The assumption behind this script is that it will be run out#  of crontab daily just before some sort of syslog manager#  copies the current contents of LOGFILE elsewhere before#  emptying the LOGFILE.  However, it can certainly be run on#  a LOGFILE that is not emptied daily, and in this case it#  would merely report the cumulative statistics.# -------------------------------------------------------------# -------------------------------------------------------------#  C O N F I G U R A T I O N    S E C T I O N# -------------------------------------------------------------####  NOTE:  Ultrix users may want to change the first line##         of this script from /bin/sh to /bin/sh5.### -------------------------------------------------------------#  Do we use 'getopts' or 'getopt'?# -------------------------------------------------------------GETOPT=getopts# -------------------------------------------------------------#  This is the name of the log.# -------------------------------------------------------------LOGFILE=/var/log/named# -------------------------------------------------------------#  This is the program we use to look things up.# -------------------------------------------------------------# QUERYPROG="/usr/local/bin/query -t PTR"# QUERYOPTIONS=""QUERYPROG="/usr/local/bin/dig"QUERYOPTIONS="PTR"# -------------------------------------------------------------#  This is the awk we use.# -------------------------------------------------------------AWK=/bin/awk# -------------------------------------------------------------#  This is the directory in which we should create temp files# -------------------------------------------------------------TMPDIR=/usr/tmp# -------------------------------------------------------------#  This is the default number of entries we want printed in#  each category of statistics.# -------------------------------------------------------------STOPAT=25# -------------------------------------------------------------#  E N D    O F    C O N F I G U R A T I O N    S E C T I O N# -------------------------------------------------------------# -------------------------------------------------------------#  handy files# -------------------------------------------------------------TMPFILE=$TMPDIR/.dnsstats$$OUTFILE=$TMPDIR/.dnsout$$ADDRFILE=$TMPDIR/.addrs$$NAMEFILE=$TMPDIR/.names$$TYPEFILE=$TMPDIR/.types$$WEEKFILE=$TMPDIR/.week$$# -------------------------------------------------------------#  handle arguments# -------------------------------------------------------------#	-d <day>#	This flag is used to append a dot-day suffix to the LOGFILE.#	Handy where log files are kept around for the last week#	and contain a day suffix.##	-f <logfile>#	Change the LOGFILE value altogether.##	-n#	Don't try to resolve IP addresses from in-addr.arpa names#	to "regular" names.  Handy if the DNS is slow or you just#	don't care about the domain names associated with the IP#	addresses.##	-w#	Count up all of the DNS statistics for the whole week.##	-c <#>#	Print only the top-# of entries in each category.#	Default is $STOPAT. ##	-a#	Print the entire list of entries in each category.# -------------------------------------------------------------NONAMES=0PRINTALL=0trap "rm -f $TMPFILE $OUTFILE $ADDRFILE $NAMEFILE $TYPEFILE $WEEKFILE ; exit 0" 0 1 2 3 15gethostbyaddr() {	QUERYNAME=`echo $ADDRESS | $AWK  '{ n = split($1, oct, ".")	  printf("%s.%s.%s.%s.in-addr.arpa.\n", oct[4], oct[3], oct[2], oct[1])	  }'`	$QUERYPROG $QUERYNAME $QUERYOPTIONS 2>&1 | $AWK ' BEGIN {	    msg = " ** Query failed ** "	    }	    {	    if ($4 == "PTR")		msg = substr($5, 1, length($5) - 1)	    else if ($3 == "PTR")		msg = substr($4, 1, length($4) - 1)	    }	    END {		printf(" %6d  %-39s [%s]\n", count, msg, address)	    }' count=$COUNT address=$ADDRESS - ;}if [ $GETOPT = "getopts" ] ; then	while getopts ac:d:f:nw ARG ; do		case $ARG in			a)	PRINTALL=1				;;			c)	STOPAT=$OPTARG				;;			d) 	LOGFILE=$LOGFILE"."$OPTARG				;;			f)	LOGFILE=$OPTARG				;;			n)	NONAMES=1				;;			w)	cat $LOGFILE* > $WEEKFILE				LOGFILE=$WEEKFILE				;;		esac	done	shift `expr $OPTIND - 1`else	set -- `getopt ac:d:f:nw $*`	if [ $? != 0 ] ; then		exit 2	fi	for ARG in $* ; do		case $ARG in			-a)	PRINTALL=1				shift				;;			-c)	STOPAT=$2				shift 2				;;			-d) 	LOGFILE=$LOGFILE"."$2				shift 2				;;			-f)	LOGFILE=$2				shift 2				;;			-n)	NONAMES=1				shift				;;			-w)	cat $LOGFILE* > $WEEKFILE				LOGFILE=$WEEKFILE				shift				;;			--)	shift				break				;;		esac	donefi# -------------------------------------------------------------#  divide the log file into three files:#	one for source addrs of incoming querys#	one for domain names that were queried upon#	one for query types# -------------------------------------------------------------$AWK '{	if ((n == 0) && ($5 == "last"))		next	else if ($5 == "last")		for (i=0; i<$8; i++) {			print info[2] >f1			print info[3] >f2			print info[4] >f3		}	else if ($6 == "XX") {		n = split($0, info, "/")		if (n == 4) {			print info[2] >f1			print info[3] >f2			print info[4] >f3		}	}		}' f1=$ADDRFILE f2=$NAMEFILE f3=$TYPEFILE $LOGFILE# -------------------------------------------------------------#  Print some general information# -------------------------------------------------------------echo "DNS stats for" `hostname` "for period ending" `ls -l $LOGFILE | $AWK '{ print $5, $6, $7 }'`echo "Total queries received: " `wc -l $ADDRFILE | $AWK '{ print $1}'`echoecho "Part I -- query sources"echo# -------------------------------------------------------------#  First, tell who was querying this nameserver# -------------------------------------------------------------if [ $NONAMES -eq 0 ] ; then	echo " Number   Source (by name if available)           IP address"	echo " ------   -----------------------------           ----------"	sort $ADDRFILE | uniq -c | sort -n -r > $TMPFILE	if [ $PRINTALL -eq 1 ] ; then		mv $TMPFILE $ADDRFILE	else		head -$STOPAT $TMPFILE > $ADDRFILE	fi	while [ 1 ] ; do		read COUNT ADDRESS		if [ $? -ne 0 ] ; then			break		fi		gethostbyaddr	done < $ADDRFILEelse	echo " Number  IP address"	echo " ------  ----------"	sort $ADDRFILE | uniq -c | sort -n -r > $TMPFILE	if [ $PRINTALL -eq 1 ] ; then		$AWK '{ printf(" %6d  [%s]\n", $1, $2) }' $TMPFILE	else		head -$STOPAT $TMPFILE | $AWK '{ printf(" %5d  [%s]\n", $1, $2) }'	fifi# -------------------------------------------------------------#  Second, tell what names were being queried upon# -------------------------------------------------------------echoecho "Part II -- queried names"echoecho " Number  Queried name"echo " ------  ------------"sort $NAMEFILE | uniq -c | sort -n -r > $TMPFILEif [ $PRINTALL -eq 1 ] ; then	$AWK '{ printf(" %6d  %s\n", $1, $2) }' $TMPFILEelse	head -$STOPAT $TMPFILE | $AWK '{ printf(" %6d  %s\n", $1, $2) }'fi# -------------------------------------------------------------#  Third, tell what sort of queries there were# -------------------------------------------------------------echoecho "Part III -- query types"echoecho " Number  Type"echo " ------  ----"sort $TYPEFILE | uniq -c | sort -n -r > $TMPFILEif [ $PRINTALL -eq 1 ] ; then	$AWK '{ printf(" %6d  %s\n", $1, $2) }' $TMPFILEelse	head -$STOPAT $TMPFILE | $AWK '{ printf(" %6d  %s\n", $1, $2) }'fi# -------------------------------------------------------------#  Last, tidy things up# -------------------------------------------------------------rm -f $TMPFILE $OUTFILE $ADDRFILE $NAMEFILE $TYPEFILE $WEEKFILE

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -