-
-
Save roelds/2775cfccfb7cd3706cc7de7f02225f56 to your computer and use it in GitHub Desktop.
ASN/IP/Route/hostname CLI lookup tool to map any network to corresponding ASN & prefix
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 | |
if command -v whois >/dev/null 2>&1 ; then echo "whois ok..." ; else echo "install whois!" && exit ; fi | |
# verified on latest Ubuntu server cloudimg | |
############################################################################################################ | |
# ---------------------------------------------------------------------- | |
# ASN/IPv4/Prefix lookup tool. Uses Team Cymru's whois service for data. | |
# ---------------------------------------------------------------------- | |
# example usage: | |
# asn <ASnumber> -- to lookup matching ASN data. Supports "as123" and "123" formats (case insensitive) | |
# asn <IP.AD.DR.ESS> -- to lookup matching route and ASN data | |
# asn <ROUTE> -- to lookup matching ASN data | |
# asn <host.name.tld> -- to lookup matching IP, route and ASN data (supports multiple IPs - e.g. DNS RR) | |
# | |
# Author: Adriano Provvisiero - BV Networks 2017 | |
# | |
############################################################################################################ | |
WhoisASN(){ | |
found_asname=$(whois -h whois.cymru.com " -f -w -c -p as$1" | sed -e 's/\ *|\ */|/g' | awk -F '[|]' {'print $3'}) | |
printf "$red[AS$1] $green$found_asname\n$white" | |
} | |
WhoisIP(){ | |
printf "$white%15s -> $yellow(route: %18s) $white-> $red[AS%s] $green%s\n" "$1" "$found_route" "$found_asn" "$found_asname" | |
} | |
LookupASNAndRouteFromIP(){ | |
found_route="" | |
found_asn="" | |
found_asname="" | |
output=$(whois -h whois.cymru.com " -f -p $1" | sed -e 's/\ *|\ */|/g') | |
found_asn=$(echo $output | awk -F'[|]' {'print $1'}) | |
found_asname=$(echo $output | awk -F'[|]' {'print $4'}) | |
found_route=$(echo $output | awk -F'[|]' {'print $3'}) | |
} | |
ResolveHostnameToIPList(){ | |
ip=$(host $1 | grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}') | |
echo -e "$ip\n" | |
} | |
green="\e[32m" | |
yellow="\e[33m" | |
white="\e[97m" | |
blue="\e[94m" | |
red="\e[31m" | |
input=$(echo $1 | sed -e 's/\/.*//g' | grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}') | |
if [ -z "$input" ]; then | |
# Input is not an IPv4 Address. Check if it is a number (ASN) | |
asn=$(echo $1 | sed -e 's/[a|A][s|S]//g' | grep -E "^[0-9]*$") | |
if [ -z "$asn" ]; then | |
# Input is not an ASN either. Consider it a hostname and try to resolve it. | |
echo -e -n "${blue}Resolving \"$1\"... " | |
ip=$(ResolveHostnameToIPList $1) | |
if [ -z "$ip" ]; then | |
echo -e "\e[97m\e[101mError: unable to resolve hostname\e[39m\e[49m" | |
tput sgr0 | |
exit | |
fi | |
numips=$(echo "$ip" | wc -l) | |
[[ $numips = 1 ]] && s="" || s="es" | |
echo -e "$blue$numips IP address$s found:" | |
for singleip in $ip; do | |
LookupASNAndRouteFromIP $singleip | |
WhoisIP $singleip | |
done | |
tput sgr0 | |
exit | |
else | |
# Input is an ASN | |
WhoisASN $asn | |
tput sgr0 | |
exit | |
fi | |
else | |
# Input is an IPv4 | |
LookupASNAndRouteFromIP $input | |
if [ -z "$found_asname" ] && [ -z "$found_route" ]; then | |
echo -e "\e[97m\e[101mError: no data found for $input\e[39m\e[49m" | |
tput sgr0 | |
exit | |
fi | |
echo -e "${green}1 IP address found:\e[39m" | |
WhoisIP $input | |
tput sgr0 | |
exit | |
fi |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment