Knock, knock who’s there?

generic cli

Im Zeitalter der globalen Vernetzung möchte ich hin und wieder wissen, welche Verbindungen mein Server mit der Außenwelt hält. Klassisch nehme ich dafür ein netstat und pipe es durch ein paar Filter. Am Ende habe ich eine Ausgabe, die mir die Anzahl der Verbindungen zu einer IP Adresse anzeigt.

nscount () {
netstat -ntu | awk '{print $5}' | cut -d: -f1 -s | sort | uniq -c | sort -n
}
1 74.125.x.xxx
2 31.13.x.xxx
2 68.232.xx.xxx
3 54.192.x.xxx
7 54.230.x.xxx
10 192.168.x.xxx

Möchte man noch wissen zu wem die IP Adresse gehört, bemüht man noch whois. Wer schon mal ein whois weg gefeuert hat, kennt die langen Ausgaben. Also schrumpfen wir die Ausgabe auf die benötigte Information zusammen.

whois_short () {
name=$(whois "$*" | grep -E "Organization|owner|org-name|descr" | cut -d: -f2 | tr "\n" "%" | cut -d% -f1)
echo "$name" | sed -e 's/^[[:space:]]*//'
}

Damit nicht ständig wiederholende whois Anfragen gesendet werden, habe ich mich für ein lokales caching entschieden. Die Datei kann auch gleich von Hand mit den lokalen IP’s gefüttert werden.

cachefile="$HOME/.ip_cache"
getfromcache () {
if [ ! -f "$cachefile" ] ; then
return
fi
while read -r line
do
cache=$(echo $line | cut -d= -f1)
if [[ $cache == $* ]] ; then
echo $(echo $line | cut -d= -f2)
break
fi
done < "$cachefile"
}

Und um den lokalen Cache ggf. automatisch zu füllen.

whois_name () {
awk '{print $2}' "$*" | while IFS= read -r ip ; do
match=$(getfromcache "$ip")
if [ -z $match ] ; then
match=$(whois_short "$ip")
echo "$ip=$match" >> $cachefile
fi
printf "%-20s %s %s\n" $ip $match
done
}

Der Call der die einzelnen Funktionen kombiniert. Mir ist bewußt, das der Umweg über eine temporäre Datei wenig Effizient ist.

nsinfo () {
tmpfile="$HOME/.whois.tmp"
nscount > "$tmpfile"
whois_name "$tmpfile"
rm "$tmpfile"
}

Die Terminal Ausgabe sieht dann wie folgt aus.

69.164.x.xxx        Limelight Networks, Inc. (LLNW) 
74.125.x.xxx        Google Inc. (GOGL) 
54.192.x.xxx        Amazon Technologies Inc. (AT-88-Z) 
31.13.x.xxx         Facebook 
54.192.x.xxx        Amazon Technologies Inc. (AT-88-Z) 
192.168.x.xxx       LAN MBP 
54.230.x.xxx        Amazon.com, Inc. (AMAZO-4)