Skip to content

Instantly share code, notes, and snippets.

@icy
Created December 22, 2017 07:22
Show Gist options
  • Save icy/b30893cecc8ec657317ba93831b0fd4a to your computer and use it in GitHub Desktop.
Save icy/b30893cecc8ec657317ba93831b0fd4a to your computer and use it in GitHub Desktop.
whoisvn.sh
#!/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