Vor einem Jahr habe ich in einem Artikel beschrieben, wie man die Geräte im heimischen Netzwerk scannt und übersichtlich darstellt. Die Ausgabe listet alle Geräte mit Namen und IP-Adresse (siehe Screenshot). Nun hat Leser Dieter eine verbesserte Version vorgeschlagen, die einfacher und schneller ist.
Sorry für den grossen Screenshot, aber der Frosch musste mit darauf.
Hier seht ihr den Code der alten und neuen Version im Vergleich:
Alt: alias scanip="nmap -sn 192.168.1.0/24 | grep 'for' | tail -n +2 | awk '{print substr(\$0,22) }'"
Neu: alias scanip="nmap -sn 192.168.1.0/24 | awk '/for/ {print substr(\$0,22)}'"
Wie die alte Version funktioniert, könnt ihr hier nachlesen. Dieters verbesserte Variante macht sich die Such- und Ausgabe-Funktionen von awk zu Nutzen. Awk ist eine Skriptsprache zur Auswertung von Textdaten und erhielt ihren Namen 1977 von den drei Entwicklern: Alfred Aho, Peter Weinberger, und Brian Kernighan. Das Werkzeug ist Bestandteil jeder GNU/Linux-Distribution und muss daher nicht extra installiert werden. Wer eine einfache Einführung in awk sucht, wird zum Beispiel hier fündig.
Die Originalausgaben von 'nmap' sieht so aus:
ralf@ralf-laptop:~$ nmap -sn 192.168.1.0/24
Starting Nmap 7.80 ( https://nmap.org ) at 2022-03-20 17:51 CET
Nmap scan report for _gateway (192.168.1.1)
Host is up (0.014s latency).
Nmap scan report for raspi4 (192.168.1.49)
Host is up (0.0049s latency).
Nmap scan report for ralf-laptop (192.168.1.64)
Host is up (0.00019s latency).
Nmap scan report for devolo-860 (192.168.1.97)
Host is up (0.050s latency).
Nmap scan report for raspi3 (192.168.1.174)
Host is up (0.054s latency).
Nmap done: 256 IP addresses (5 hosts up) scanned in 2.47 seconds
Diese Ausgabe ist unübersichtlich und enthält viele uninteressante Details. Was wir sehen wollen, sind die Zeilen in denen das Wort 'for' vorkommt, und zwar nur den Text, der hinter dem 'for' steht. Die alte Version verwendet 'grep' für die Suche, 'tail' für die Ausgabe der relevanten Zeilen und 'awk', um die ersten 22 Zeichen einer Zeile zu unterdrücken.
Wie Dieters Code zeigt, kann die Ausgabe von 'nmap' komplett mit 'awk' bearbeitet werden. Awk sucht nach den Zeilen, in denen 'for' erscheint, und gibt dann den Text ab Position 22 aus. Im Unterschied zur alten Variante gibt die neue Version auch die IP des Routers aus, was vorher bewusst unterdrückt wurde (tail -n +2). Da in Dieters Version nur zwei Befehle (statt vier) zum Einsatz kommen, läuft sie ein wenig schneller.
Herzlichen Dank an Dieter, für diese kleine aber feine Verbesserung.
Nachtrag:
Nach dem Erscheinen des Artikels, lieferte Dieter eine Erweiterung des Befehls nach, mit dem unerwünschte Zeilen am Anfang ausgeblendet werden können:
nmap -sn 192.168.1.0/24 | awk '/for/ {if (NR > 2) print substr($0,22)}'
ARP-Scan oder netdiscover?
Ein bisschen simplifiziert kann das nmap von Haus aus schon mit der Option grepable output: nmap -sn -oG - 192.168.1.0/24. Das spart noch ein bisschen Rechenzeit und der Output kann, bei Bedarf, ohne weiteres in einer Pipe weiterverwendet werden.
Immer wieder frage ich mich, warum die "-oN/-oX/-oS/-oG/-oA"-Optionen (Output Normal, Xml, Scriptkiddie, Grepable, Allformats) von nmap scheinbar so wenigen bekannt ist?
# nmap -oG - -sn 192.168.1.0/24
gibt nur noch je eine zusätzliche Kopf- und Fußzeile aus - und die Option ist ja genau für "grep" gemacht worden ;)
Was ich noch cool finden würde, wäre wenn eine Art Loading Indicator (Spinner oder ähnliches) angezeigt werden würde, während der nmap Befehl läuft. Nur damit man sehen kann, dass der Scan noch im Gange ist.
Ich frage mich ja immer wieder, warum die Parameter "-oN/-oX/-oS/-oG/-oA" von
nmap
so wenigen bekannt sind? Damit hat man die Möglichkeit, die Ausgabe auf "Normal/Xml/Scriptkiddie/Grepable/Allformats" umzustellen... ergo reicht eigentlich einnmap -oG - -sn 192.168.1.0/24
vollkommen aus - ok, es gibt je eine Kopf- und Fußzeile dazu ;)
PS: Ich hatte den Kommentar gestern schon mal geschrieben, aber er tauchte hier nicht auf... 🤔