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

📄 whx.sh

📁 Shall高级编程
💻 SH
字号:
#!/bin/bash# whx.sh: "whois" spammer lookup# Author: Walter Dnes# Slight revisions (first section) by ABS Guide author.# Used in ABS Guide with permission.# Needs version 3.x or greater of Bash to run (because of =~ operator).# Commented by script author and ABS Guide author.E_BADARGS=65        # Missing command-line arg.E_NOHOST=66         # Host not found.E_TIMEOUT=67        # Host lookup timed out.E_UNDEF=68          # Some other (undefined) error.HOSTWAIT=10         # Specify up to 10 seconds for host query reply.                    # The actual wait may be a bit longer.OUTFILE=whois.txt   # Output file.PORT=4321if [ -z "$1" ]      # Check for (required) command-line arg.then  echo "Usage: $0 domain name or IP address"  exit $E_BADARGSfiif [[ "$1" =~ "[a-zA-Z][a-zA-Z]$" ]]  # Ends in two alpha chars?then                                  # It's a domain name && must do host lookup.  IPADDR=$(host -W $HOSTWAIT $1 | awk '{print $4}')                                      # Doing host lookup to get IP address.				      # Extract final field.else  IPADDR="$1"                         # Command-line arg was IP address.fiecho; echo "IP Address is: "$IPADDR""; echoif [ -e "$OUTFILE" ]then  rm -f "$OUTFILE"  echo "Stale output file \"$OUTFILE\" removed."; echofi#  Sanity checks.#  (This section needs more work.)#  ===============================if [ -z "$IPADDR" ]# No response.then  echo "Host not found!"  exit $E_NOHOST    # Bail out.fiif [[ "$IPADDR" =~ "^[;;]" ]]#  ;; connection timed out; no servers could be reachedthen  echo "Host lookup timed out!"  exit $E_TIMEOUT   # Bail out.fiif [[ "$IPADDR" =~ "[(NXDOMAIN)]$" ]]#  Host xxxxxxxxx.xxx not found: 3(NXDOMAIN)then  echo "Host not found!"  exit $E_NOHOST    # Bail out.fiif [[ "$IPADDR" =~ "[(SERVFAIL)]$" ]]#  Host xxxxxxxxx.xxx not found: 2(SERVFAIL)then  echo "Host not found!"  exit $E_NOHOST    # Bail out.fi# ======================== Main body of script ========================AFRINICquery() {#  Define the function that queries AFRINIC. Echo a notification to the#+ screen, and then run the actual query, redirecting output to $OUTFILE.  echo "Searching for $IPADDR in whois.afrinic.net"  whois -h whois.afrinic.net "$IPADDR" > $OUTFILE#  Check for presence of reference to an rwhois.#  Warn about non-functional rwhois.infosat.net server#+ and attempt rwhois query.  if grep -e "^remarks: .*rwhois\.[^ ]\+" "$OUTFILE"  then    echo " " >> $OUTFILE    echo "***" >> $OUTFILE    echo "***" >> $OUTFILE    echo "Warning: rwhois.infosat.net was not working as of 2005/02/02" >> $OUTFILE    echo "         when this script was written." >> $OUTFILE    echo "***" >> $OUTFILE    echo "***" >> $OUTFILE    echo " " >> $OUTFILE    RWHOIS=`grep "^remarks: .*rwhois\.[^ ]\+" "$OUTFILE" | tail -n 1 |\    sed "s/\(^.*\)\(rwhois\..*\)\(:4.*\)/\2/"`    whois -h ${RWHOIS}:${PORT} "$IPADDR" >> $OUTFILE  fi}APNICquery() {  echo "Searching for $IPADDR in whois.apnic.net"  whois -h whois.apnic.net "$IPADDR" > $OUTFILE#  Just  about  every  country has its own internet registrar.#  I don't normally bother consulting them, because the regional registry#+ usually supplies sufficient information.#  There are a few exceptions, where the regional registry simply#+ refers to the national registry for direct data.#  These are Japan and South Korea in APNIC, and Brasil in LACNIC.#  The following if statement checks $OUTFILE (whois.txt) for the presence#+ of "KR" (South Korea) or "JP" (Japan) in the country field.#  If either is found, the query is re-run against the appropriate#+ national registry.  if grep -E "^country:[ ]+KR$" "$OUTFILE"  then    echo "Searching for $IPADDR in whois.krnic.net"    whois -h whois.krnic.net "$IPADDR" >> $OUTFILE  elif grep -E "^country:[ ]+JP$" "$OUTFILE"  then    echo "Searching for $IPADDR in whois.nic.ad.jp"    whois -h whois.nic.ad.jp "$IPADDR"/e >> $OUTFILE  fi}ARINquery() {  echo "Searching for $IPADDR in whois.arin.net"  whois -h whois.arin.net "$IPADDR" > $OUTFILE#  Several large internet providers listed by ARIN have their own#+ internal whois service, referred to as "rwhois".#  A large block of IP addresses is listed with the provider#+ under the ARIN registry.#  To get the IP addresses of 2nd-level ISPs or other large customers,#+ one has to refer to the rwhois server on port 4321.#  I originally started with a bunch of "if" statements checking for#+ the larger providers.#  This approach is unwieldy, and there's always another rwhois server#+ that I didn't know about.#  A more elegant approach is to check $OUTFILE for a reference#+ to a whois server, parse that server name out of the comment section,#+ and re-run the query against the appropriate rwhois server.#  The parsing looks a bit ugly, with a long continued line inside#+ backticks.#  But it only has to be done once, and will work as new servers are added.#@   ABS Guide author comment: it isn't all that ugly, and is, in fact,#@+  an instructive use of Regular Expressions.  if grep -E "^Comment: .*rwhois.[^ ]+" "$OUTFILE"  then    RWHOIS=`grep -e "^Comment:.*rwhois\.[^ ]\+" "$OUTFILE" | tail -n 1 |\    sed "s/^\(.*\)\(rwhois\.[^ ]\+\)\(.*$\)/\2/"`    echo "Searching for $IPADDR in ${RWHOIS}"    whois -h ${RWHOIS}:${PORT} "$IPADDR" >> $OUTFILE  fi}LACNICquery() {  echo "Searching for $IPADDR in whois.lacnic.net"  whois -h whois.lacnic.net "$IPADDR" > $OUTFILE#  The  following if statement checks $OUTFILE (whois.txt) for the presence of#+ "BR" (Brasil) in the country field.#  If it is found, the query is re-run against whois.registro.br.  if grep -E "^country:[ ]+BR$" "$OUTFILE"  then    echo "Searching for $IPADDR in whois.registro.br"    whois -h whois.registro.br "$IPADDR" >> $OUTFILE  fi}RIPEquery() {  echo "Searching for $IPADDR in whois.ripe.net"  whois -h whois.ripe.net "$IPADDR" > $OUTFILE}#  Initialize a few variables.#  * slash8 is the most significant octet#  * slash16 consists of the two most significant octets#  * octet2 is the second most significant octetslash8=`echo $IPADDR | cut -d. -f 1`  if [ -z "$slash8" ]  # Yet another sanity check.  then    echo "Undefined error!"    exit $E_UNDEF  fislash16=`echo $IPADDR | cut -d. -f 1-2`#                             ^ Period specified as 'cut" delimiter.  if [ -z "$slash16" ]  then    echo "Undefined error!"    exit $E_UNDEF  fioctet2=`echo $slash16 | cut -d. -f 2`  if [ -z "$octet2" ]  then    echo "Undefined error!"    exit $E_UNDEF  fi#  Check for various odds and ends of reserved space.#  There is no point in querying for those addresses.if [ $slash8 == 0 ]; then  echo $IPADDR is '"This Network"' space\; Not queryingelif [ $slash8 == 10 ]; then  echo $IPADDR is RFC1918 space\; Not queryingelif [ $slash8 == 14 ]; then  echo $IPADDR is '"Public Data Network"' space\; Not queryingelif [ $slash8 == 127 ]; then  echo $IPADDR is loopback space\; Not queryingelif [ $slash16 == 169.254 ]; then  echo $IPADDR is link-local space\; Not queryingelif [ $slash8 == 172 ] && [ $octet2 -ge 16 ] && [ $octet2 -le 31 ];then  echo $IPADDR is RFC1918 space\; Not queryingelif [ $slash16 == 192.168 ]; then  echo $IPADDR is RFC1918 space\; Not queryingelif [ $slash8 -ge 224 ]; then  echo $IPADDR is either Multicast or reserved space\; Not queryingelif [ $slash8 -ge 200 ] && [ $slash8 -le 201 ]; then LACNICquery "$IPADDR"elif [ $slash8 -ge 202 ] && [ $slash8 -le 203 ]; then APNICquery "$IPADDR"elif [ $slash8 -ge 210 ] && [ $slash8 -le 211 ]; then APNICquery "$IPADDR"elif [ $slash8 -ge 218 ] && [ $slash8 -le 223 ]; then APNICquery "$IPADDR"#  If we got this far without making a decision, query ARIN.#  If a reference is found in $OUTFILE to APNIC, AFRINIC, LACNIC, or RIPE,#+ query the appropriate whois server.else  ARINquery "$IPADDR"  if grep "whois.afrinic.net" "$OUTFILE"; then    AFRINICquery "$IPADDR"  elif grep -E "^OrgID:[ ]+RIPE$" "$OUTFILE"; then    RIPEquery "$IPADDR"  elif grep -E "^OrgID:[ ]+APNIC$" "$OUTFILE"; then    APNICquery "$IPADDR"  elif grep -E "^OrgID:[ ]+LACNIC$" "$OUTFILE"; then    LACNICquery "$IPADDR"  fifi#@  ---------------------------------------------------------------#   Try also:#   wget http://logi.cc/nw/whois.php3?ACTION=doQuery&DOMAIN=$IPADDR#@  ---------------------------------------------------------------#  We've  now  finished  the querying.#  Echo a copy of the final result to the screen.cat $OUTFILE# Or "less $OUTFILE" . . .exit 0#@  ABS Guide author comments:#@  Nothing fancy here, but still a very useful tool for hunting spammers.#@  Sure, the script can be cleaned up some, and it's still a bit buggy,#@+ (exercise for reader), but all the same, it's a nice piece of coding#@+ by Walter Dnes.#@  Thank you!

⌨️ 快捷键说明

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