Hostliste durch Skript erstellen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
pangu
Beiträge: 1400
Registriert: 15.11.2011 20:50:52
Lizenz eigener Beiträge: GNU General Public License
Wohnort: /proc/1

Hostliste durch Skript erstellen

Beitrag von pangu » 04.09.2012 12:51:07

Hi all,

vielleicht kann mir jemand von euch schnell weiterhelfen. Ich möchte mir eine zeilengetrennte Hostliste erstellen, indem ich alle Hosts-Up aufliste. Dabei nutze ich eine Datei subnets2scan.dat in welcher ich meine gewünschten Subnets reinschreibe, die ich vorher mit nmap durchsuche. Ich möchte zwei verschiedene Hostlisten erhalten: eine soll jeweils nur die IP beinhalten, und die andere auch den Hostnamen falls dieser ermittelt werden konnte. Dabei meine ich wirklich nur den Hostnamen, ohne Suffix (also kein FQDN!). Das Ganze möchte ich dann sortiert in die Hostlisten reinschreiben lassen. Das Skript sieht auf die Schnelle so aus:

generiere_hostliste.sh

Code: Alles auswählen

#/bin/sh
OUTFILE1=hostlistIP.dat
OUTFILE2=hostlistDNS.dat

# Erstmal säubern, falls alte noch existieren
[ -f hosts_scanned.dat ] && rm hosts_scanned.dat

# schreibe alle Hosts-Up in die Hostlist-Dateien
nmap -sP -R -iL subnets2scan.dat -oN $OUTFILE1 -n| grep "is up"|awk '{print $2}'
nmap -sP -R -iL subnets2scan.dat -oN $OUTFILE2 | grep "is up"|awk '{print $2}' |awk -F. '{ print $1 }'
die hostlistIP.dat wird korrekt geschrieben wie erwartet. Bei der hostlistDNS.dat hab ich aber noch folgendes Problem: wenn ein Host nicht reverse aufgelöst werden konnte, dann spuckt nmap nur dessen IP-Adresse aus. Der folgende Befehl bis hierher:

Code: Alles auswählen

nmap -sP -R -iL subnets2scan.dat -oN $OUTFILE2 | grep "is up"|awk '{print $2}'
ergibt dann folgende Ausgabe:
host1.meinedomain.de
kicher.meinedomain.de
lach.meinedomain.de
schmunzel.meinedomain.de
192.168.0.111
irgendwas.meinedomain.de
server.meinedomain.de
router.meinedomain.de
192.168.0.6
Also wollte ich jetzt noch das DNS-Suffix rausschneiden und hab hierfür |awk -F. '{ print $1 }' verwendet, was ja nichts anderes tut, als den ersten Punkt als Delimiter zu nutzen. Natürlich ist das falsch, denn das ergibt dann den Output:
host1
kicher
lach
schmunzel
192
irgendwas
server
router
192
Ich bin nicht so der Vollprofi und hoffe ihr könnt mir weiterhelfen, wie ich das lösen kann. Gerne könnt ihr mir auch viel einfachere und bessere Befehle zeigen, um mein Vorhaben zu erzielen. Ich habs halt auf die Schnelle so versucht, komme aber nun nicht weiter. Ich könnte ja irgendwie noch 'ne Abfrage vor dem letzten awk reinsetzen, dass $2 überprüft wird, ob es sich um eine FQDN oder IP-Adresse handelt. Oder wäre das wieder zu kompliziert und umständlich? Ach ich lass mich mal von euch überraschen :)

Danke im Voraus.
Man gibt Geld aus, das man nicht hat, um damit Dinge zu kaufen, die man nicht braucht, um damit Leute zu beeindrucken, die man nicht mag.

uname
Beiträge: 12406
Registriert: 03.06.2008 09:33:02

Re: Hostliste durch Skript erstellen

Beitrag von uname » 04.09.2012 13:38:08

Hübsch hässlich und auch nur für IPv4. Wer bietet eine schönere Lösung?

Code: Alles auswählen

... | awk -F. '$0 !~ /^[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*$/ {print $1 }'
Ich hoffe du wolltest das 192 vollständig rauswerfen und nicht in dem Fall die IP-Adresse ausgeben lassen. Das wäre nämlich etwas doof.

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: Hostliste durch Skript erstellen

Beitrag von Cae » 04.09.2012 13:46:33

Du verwendest -oN und eine Pipe danach, was passiert dann mit den Daten? Die werden doch ungefiltert in die Liste geschrieben und der Output ist leer, grep/awk sehen nie etwas. -oG macht da besser greppbaren Output raus, du könntest

Code: Alles auswählen

# nmap --foo … -oG - | grep … >out
fahren.

Die DNS-Auflösung würde ich nicht per nmap machen, sondern einfach mit den Tools, die es dafür gibt:

Code: Alles auswählen

$ awk -F. '/^[0-9]/ { system("dig +short $4 "." $3 "." $2 "." $1 ".in-addr.arpa. | egrep -o ^\\[^\\.\\]\\+ >>out.dns"); }' out
Okay, das egrep da drin ist ein bisschen blöde, das sollte man mit awk-Bordmitteln machen.

Gruß Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

Benutzeravatar
pangu
Beiträge: 1400
Registriert: 15.11.2011 20:50:52
Lizenz eigener Beiträge: GNU General Public License
Wohnort: /proc/1

Re: Hostliste durch Skript erstellen

Beitrag von pangu » 04.09.2012 14:21:04

Jaja, ich merks ... ich sollte mich wirklich mal mit RegEx & awk auseinandersetzen :D Danke euch soweit.

@uname: Leider nein, die IP muss drinbleiben. Entweder IP oder Hostname, bevorzugt soll der Hostname sein. Dein snippet passt soweit, nur fehlen mir jetzt eben die IP-Einträge :S PS: Kannste mir vielleicht erklären was dein awk genau macht? Ich versteh nur einen Teil davon, aber die Zeichensetzung bereitet mir noch etwas Probleme. Muss nicht sein, aber wenn du schonmal den Code so gepostet hast, frag ich mal einfach :)

@Cae: Also soweit ich das interpretiere funktioniert es so mit -oN, der output stimmt. Und awk und grep werden auch angewandt, also der Endstream ist da wie erwartet. Dig dauert länger, oder täusch ich mich? Da ist nmap eigentlich recht flott mit seinem Syntax muss ich sagen.
Man gibt Geld aus, das man nicht hat, um damit Dinge zu kaufen, die man nicht braucht, um damit Leute zu beeindrucken, die man nicht mag.

Benutzeravatar
r900
Beiträge: 1053
Registriert: 09.10.2011 20:06:11
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Stockholm

Re: Hostliste durch Skript erstellen

Beitrag von r900 » 04.09.2012 14:50:12

pangu hat geschrieben:Also soweit ich das interpretiere funktioniert es so mit -oN, der output stimmt. Und awk und grep werden auch angewandt, also der Endstream ist da wie erwartet.
Also nach dem was du da geschrieben hast wird der ungefilterte Kram in hostlistIP.dat und hostlistDNS.dat geschrieben und auf der Standardausgabe kommt das gefilterte raus. Guck dir halt mal die Dateien an. Wenn die gefilterte Ausgabe in die Dateien soll musst du die Standardausgabe in die jeweilige Datei umlenken, so wie von Cae beschrieben.

uname
Beiträge: 12406
Registriert: 03.06.2008 09:33:02

Re: Hostliste durch Skript erstellen

Beitrag von uname » 04.09.2012 14:52:45

Erklärung und erweiterte Lösung:

Code: Alles auswählen

... | awk -F. '$0 !~ /^[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*$/ {print $1 }'
Eigentlich ganz einfach. Trennzeichen ist immer noch "Punkt". Die awk-Bedingung prüft in einem regulären Ausdruck ob der Inhalt der Zeile ($0) nicht (!~) einem Ausdruck entspricht, welcher aus vier Blöcken mit jeweils beliebig vielen Zahlen getrennt durch Punkten besteht. Das "^" definiert den Anfang und das "$" das Ende, so dass nicht vor oder hinter den Zahlen doch noch Buchstaben stehen können.

Naja. awk kann natürlich auch if. Sieht aber noch dämlicher aus. Aber dann werden auch die IP-Adressen ausgegeben ;-)

Code: Alles auswählen

...|awk -F. '{ if ($0 !~ /^[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*$/) print $1; else print $0 }'
Ausgabe dann:

Code: Alles auswählen

st1
kicher
lach
schmunzel
192.168.0.111
irgendwas
server
router
192.168.0.6
Nun kann man natürlich auch die Bedingung und die Ausgaben umdrehen, wodurch das Ergebnis gleich bleibt:

Code: Alles auswählen

... |awk -F. '{ if ($0 ~ /^[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*$/) print $0; else print $1 }' 
Zuletzt geändert von uname am 04.09.2012 14:56:27, insgesamt 2-mal geändert.

Cae
Beiträge: 6349
Registriert: 17.07.2011 23:36:39
Wohnort: 2130706433

Re: Hostliste durch Skript erstellen

Beitrag von Cae » 04.09.2012 14:53:15

pangu hat geschrieben:Dig dauert länger, oder täusch ich mich? Da ist nmap eigentlich recht flott mit seinem Syntax muss ich sagen.
Der Unterschied besteht darin, dass awk die Auflösungen über dig nacheinander startet, anstatt paralell, wie nmap es tut. Im Prinzip kann man auch dig +short 1.2.0.192.in-addr.arpa. 2.2.0.192.in-addr.arpa. … machen, das wäre dann die parallele Auflösung, aber es *könnte* passieren, dass die cmdline zu lang wird. Probier's aus:

Code: Alles auswählen

$ awk -F. '/^[0-9]/ { list = list "'" $4 "." $3 "." $2 "." $1 ".in-addr.arpa.' "; } END { system("dig +short " list " | egrep -o ^\\[^\\.\\]\\+ >out.dns"); }' out
Wie immer ungetestet, ein bisschen Spaß muss ja bleiben. ;) Beachte, dass eventuelle Hostnamen oder sonstwas, das nicht mit einer Ziffer beginnt, nicht von out nach out.dns übernommen wird.

Gruß Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.

—Bruce Schneier

Benutzeravatar
pangu
Beiträge: 1400
Registriert: 15.11.2011 20:50:52
Lizenz eigener Beiträge: GNU General Public License
Wohnort: /proc/1

Re: Hostliste durch Skript erstellen

Beitrag von pangu » 04.09.2012 15:23:46

Natürlich, ich hab da was verwechselt gehabt, bzw. den Code falsch abgetippt, bevor ich ihn hier reingepastet hatte. Ich habs in -oG umgeschrieben und am Ende in Datei gelenkt.

Vielen Dank euch Allen, mein Ziel ist erreicht und das fertige Skript sieht so aus:

Code: Alles auswählen

OUTFILE1=hostlistIP.dat
OUTFILE2=hostlistDNS.dat

# schreibe Hosts-Alive in Hostliste
nmap -sP -R -iL subnets2scan.dat -oG unfiltered.output1 -n| grep "is up"|awk '{print $2}' |sort -n >$OUTFILE1
nmap -sP -R -iL subnets2scan.dat -oG unfiltered.output2   | grep "is up"|awk '{print $2}' |awk -F. '{ if ($0 !~ /^[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*$/) print $1; else print $0 }' |sort >$OUTFILE2

# entferne wieder die ungefilterten Zwischen-Outputs im Grepformat
[ -f unfiltered.output1 ] && rm unfiltered.output1
[ -f unfiltered.output2 ] && rm unfiltered.output2
:THX:
Man gibt Geld aus, das man nicht hat, um damit Dinge zu kaufen, die man nicht braucht, um damit Leute zu beeindrucken, die man nicht mag.

Antworten