Created
December 22, 2017 07:22
-
-
Save icy/b30893cecc8ec657317ba93831b0fd4a to your computer and use it in GitHub Desktop.
whoisvn.sh
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# Purpose: Test if a domain was registered | |
# Author: KyAnh <[email protected]> | |
# License: GPL v2 | |
# Home: http://viettug.org/wiki/fs/whoisvn | |
# Source: http://github.com/icy/whoisvn | |
# default suffixes | |
WHOISVN_SUFFIX=${WHOISVN_SUFFIX:-com net org info edu biz} | |
######################################################################## | |
# donot change these variables | |
_REGISTERED=0 | |
_AVAILABLE=1 | |
# user agent passed to `curl` | |
_USER_AGENT="Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0) FreeSoft/whoisvn" | |
_VERBOSE=0 | |
_DNSSERVERS="" | |
# message function | |
_msg() { | |
echo $* | |
} | |
_help() { | |
cat <<EOF | |
DESCRIPTION | |
Purpose: Quick test if some domain does exist | |
Author: kyanh <[email protected]> | |
Homepage: http://github.com/icy/whoisvn/ | |
License: GPL v2 | |
EXAMPLE | |
$ $(basename $0) example.net | |
$ $(basename $0) example.* | |
$ $(basename $0) -G example.net example.com | |
$ WHOISVN_SUFFIX="com net" $(basename $0) example | |
OPTIONS | |
-O --opendns use "dig ns @208.67.220.220" (default) | |
-G --googledns use "dig ns @8.8.8.8" | |
-s --dns <ip> use <ip> as DNS server | |
-a --all use all known DNS servers | |
-h --help print this message | |
Any option can be used multiple times. | |
ENVIRONMENT | |
WHOISVN_SUFFIX List of domain suffixes. | |
Defaults: $WHOISVN_SUFFIX | |
REQUIREMENTS | |
curl, dig, grep | |
HOW IT WORKS | |
The original version of this script sends some special queries to | |
some domain providers to check if that domain does exist. The result | |
may be slow and unreliable as the domain provider may change their | |
internal code. | |
This version uses a simple method: It queries some popular DNS servers | |
for the 'ns' entries of a domain. Normally such entries should exist | |
if the domain is registered. For example | |
$ dig ns @208.67.222.222 google.com | grep NS | |
google.com. 170335 IN NS ns2.google.com. | |
google.com. 170335 IN NS ns1.google.com. | |
google.com. 170335 IN NS ns3.google.com. | |
google.com. 170335 IN NS ns4.google.com. | |
KNOWN PROBLEMS | |
The domain 'google.xxx' is marked as registered by OpenDNS, but Google | |
DNS server knows nothing about it. | |
HISTORY | |
This script was to support .vn suffix. That's why the script has "vn" | |
in its name. However, the recent versions can work with any kind of | |
domains. The name still remains as a history portion. | |
EOF | |
return 0; | |
} | |
_test_programs() { | |
for _p in curl dig grep; do | |
which $_p 2>/dev/null 1>&2 | |
[ $? -ge 1 ] && (_msg "$_p not found"; exit 127) | |
done | |
} | |
######################################################################## | |
# look up functions | |
######################################################################## | |
# report the result | |
lookup_report() { | |
if [ "x$1" == "x$2" ]; then | |
_msg -e "\tregistered" | |
else | |
_msg -e "\tavailable" | |
fi | |
} | |
# to VNNIC: could you support external lookup? | |
lookup_by_vnnic() { | |
_msg "vnnic doesnot support external lookup" | |
return 1 | |
} | |
# http://fibo.com.vn/ | |
lookup_by_fibo() { | |
_msg "fibo support is obsolete" | |
return 1 | |
} | |
# http://matbao.net/ | |
lookup_by_matbao() { | |
_msg "matbao support is obsolete" | |
return 1 | |
} | |
# http://pavietnam.com.vn/ | |
# http://pavietnam.vn/vn/whois.php?domain=yahoo.biz&t=1291981524874 | |
lookup_by_pavietnam() { | |
_msg "PAVietnam support is obsolete since Feb 1st 2012" | |
return 1 | |
} | |
lookup_by_opendns() { | |
local domain="$1" | |
local _registered=0 | |
printf "%15s: %20s " "opendns.org" "${domain}" | |
dig ns @208.67.220.220 ${domain} 2>&1 \ | |
| grep -qE -- "^${domain}.+NS+" | |
[ $? -eq 0 ] && _registered=1 | |
lookup_report $_registered $_AVAILABLE | |
} | |
lookup_by_googledns() { | |
local domain="$1" | |
local _registered=0 | |
printf "%15s: %20s " "googledns" "${domain}" | |
dig ns @8.8.8.8 ${domain} 2>&1 \ | |
| grep -qE -- "^${domain}.+NS+" | |
[ $? -eq 0 ] && _registered=1 | |
lookup_report $_registered $_AVAILABLE | |
} | |
lookup_by_anydns() { | |
local _server="$1" | |
shift | |
local domain="$1" | |
local _registered=0 | |
printf "%15s: %20s " "$_server" "${domain}" | |
dig ns @$_server ${domain} 2>&1 \ | |
| grep -qE "^${domain}.+NS+" | |
[ $? -eq 0 ] && _registered=1 | |
lookup_report $_registered $_AVAILABLE | |
} | |
######################################################################## | |
# main routine | |
######################################################################## | |
_test_programs # or exit | |
if [ -z "$1" ]; then | |
_msg "You need to provide some domain(s). Try $0 --help for details." | |
exit 0 | |
fi | |
# parameters processing | |
services="" | |
domaines="" | |
while [ ! -z "$1" ]; do | |
case $1 in | |
--pavietnam) services="$services pavietnam" ;; | |
--matbao) services="$services matbao" ;; | |
-O|--opendns) services="$services opendns" ;; | |
-G|--googledns) services="$services googledns" ;; | |
-a|--all) services="$services opendns googledns" ;; | |
-h|--help) _help ; exit 0 ;; | |
-s|--dns) shift; \ | |
[ ! -z "$1" ] \ | |
&& _DNSSERVERS="${_DNSSERVERS} $1" ;; | |
-v|--verbose) export _VERBOSE=1 ;; | |
*) [ ! "${1:0:1}" = "-" ] \ | |
&& domains="$domains $1" ;; | |
esac | |
shift | |
done | |
[ -z "$services" ] && [ -z "$_DNSSERVERS" ] && services="opendns" | |
[ -z "$domains" ] && _help # and exit | |
last_names="$WHOISVN_SUFFIX" | |
for domain in $domains; do | |
echo $domain | grep -q '\.' | |
if [ $? -ge 1 ]; then | |
domain="$domain."'*' | |
fi | |
if [ "x${domain:0 -2}" == 'x.*' ]; then | |
domains="" | |
for dtd in $last_names; do | |
domains="${domains} ${domain%.*}.${dtd}" | |
done | |
else | |
domains="${domain}" | |
fi | |
for domain in $domains; do | |
for s in ${services}; do | |
lookup_by_${s} "${domain}" | |
done | |
for _dns in $_DNSSERVERS; do | |
lookup_by_anydns $_dns "${domain}" | |
done | |
done | |
done | |
# end of file # |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment