
Ich führe derzeit ein Skript aus, das nslookup auf einer Reihe von Hosts verwendet und dann awk verwendet, um die gewünschten Zeilen in eine Tabelle zu drucken. Ich drucke eine Zeile in Datei1 und eine andere in Datei2 und verwende dann, paste file1 file2 >> file3
um diese Tabelle zu erstellen.
Die Tabelle sieht so aus
Host IP
name 10.10.10.10
name 10.10.10.10
name 10.10.10.10
Das funktioniert größtenteils. Aber aus irgendeinem Grund erhalten etwa 20 meiner 160 Ergebnisse in der linken Spalte „Answer:“ und in der rechten Spalte erscheint der Hostname. So:
Host IP
answer: hostname
Dies wird in den Ergebnissen zufällig angezeigt und ich kann es nicht herausfinden, da das Wort „Answer:“ im nslookup nirgends vorkommt, sodass das Skript nicht versehentlich einen Fehler auslösen könnte.
Hier ist mein Skript als Referenz:
hosts='hosts.list'
filelines=`cat $hosts`
Empty_Containers(){
truncate -s 0 tmp.txt
truncate -s 0 file1
truncate -s 0 file2
}
for h in $filelines ;
do
Empty_Containers
nslookup $h > tmp.txt
if grep -q "NXDOMAIN" tmp.txt
then
cat tmp.txt | awk 'FNR ==4 {print$5}' > file1
echo "Did_Not_Resolve" > file2
paste file1 file2 >> i.txt
else
cat tmp.txt | awk 'FNR ==4 {print$2}' > file1
cat tmp.txt |awk 'FNR ==5 {print$2}' > file2
paste file1 file2 >> i.txt
fi
cat i.txt | column -t 2 i.txt
done
Antwort1
Wenn Ihr gewünschtes Ziel lediglich die Erstellung einer Tabelle mit Hostnamen und IP-Adressen ist und Sie nicht besonders auf die Verwendung achten nslookup
, konnte ich die gewünschte Ausgabe scheinbar mit einer schnellen for .. echo
Schleife erstellen:
for h in $( cat hosts.list ); do
a=$(dig +short $h | head -n1)
echo -e "$h\t${a:-Did_Not_Resolve}"
done
dig
ist ein etwas benutzerfreundlicheres DNS-Tool als . nslookup
Die Verwendung der +short
Option macht die Ausgabe noch übersichtlicher. Die Ausgabe einer Anfrage, für die kein Datensatz vorhanden ist, ist eine leere Zeichenfolge. Daher verwende ich die integrierte bash
Standardparametererweiterung ( ${var:-default}
), um den Fall zu behandeln, dass kein Datensatz vorhanden ist, was eine „Standard“-Antwort von ergibt Did_Not_Resolve
.
$ dig www.example.com
; <<>> DiG 9.10.6 <<>> www.example.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 23579
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4000
;; QUESTION SECTION:
;www.example.com. IN A
;; ANSWER SECTION:
www.example.com. 20308 IN A 93.184.216.34
;; Query time: 28 msec
;; SERVER: 172.28.8.1#53(172.28.8.1)
;; WHEN: Fri Jun 01 12:02:27 MST 2018
;; MSG SIZE rcvd: 60
$ dig +short www.example.com
93.184.216.34
Der endgültige Ertrag ist dieser Output:
www.example.com 93.184.216.34
www.google.com 172.217.14.68
host.doesnotexist.tld Did_Not_Resolve
unix.stackexchange.com 151.101.129.69
Eine Alternative zu dig
ist auch host
:
$ for h in $(cat hosts.list); do host $h; done
www.example.com has address 93.184.216.34
www.example.com has IPv6 address 2606:2800:220:1:248:1893:25c8:1946
www.google.com has address 216.58.193.196
www.google.com has IPv6 address 2607:f8b0:4007:80d::2004
Host host.doesnotexist.tld not found: 3(NXDOMAIN)
unix.stackexchange.com has address 151.101.129.69
unix.stackexchange.com has address 151.101.1.69
unix.stackexchange.com has address 151.101.65.69
unix.stackexchange.com has address 151.101.193.69
Als Antwort auf die Fragen im folgenden Kommentar:
Die einzige Option, die ich für verwende, dig
ist +short
, wodurch die Ausgabe entweder auf die IP-Adresse des angegebenen Hosts oder andernfalls auf eine leere Zeichenfolge reduziert wird. Ich führe es dig
in einer Subshell ( $( dig [...] )
) aus, da ich deren Ausgabe erfasse und sie der Variablen a
(für „Adresse“) zuweise. Ich leite die Ausgabe von dig
weiter head -n1
, da einige Hosts (wie der Host) unix.stackexchange.com
mehrere IP-Adressen zurückgeben; der Einfachheit halber nehme ich einfach die erste.
Der Grund dafür, dass dies in eine Variable extrahiert wird, besteht darin, dass wir einen einfachen Parametererweiterungstrick verwenden können, um den Text „Nicht aufgelöst“ anstelle einer leeren Zeichenfolge bereitzustellen, wie hier zuvor beschrieben.
Genauere Erläuterung der echo
Aussage wie gewünscht:
echo -e "$h\t${a:-Did_Not_Resolve}"
- Der
-e
Schalter zeigt anecho
, dass ichtScape-Sequenzen. In diesem Fall verwende ich\t
, was in Kombination mit-e
zu einem wird Tabund nicht zu einem wörtlichen Escape-Zeichent
. $h
wird, wie zu erwarten, einfach durch den Inhalt der Variablen ersetzth
.\t
wird, wie bereits erläutert, zu einem Tab.${a:-Did_Not_Resolve}
. Ah, hier liegt die Magie.bash
hat die Fähigkeit, bei der Parametererweiterung ein wenig Introspektion als Teil des Prozesses durchzuführen. Die Syntax${var:-default}
wird auf den Inhalt der Variablen erweitertvar
oder, wenn dieser Wert nicht gesetzt oder null ist, der angegebene Ersatz (in diesem Beispielfalldefault
; oder im tatsächlichen Anwendungsfall hierDid_Not_Resolve
). Weitere Einzelheiten hierzu finden Sie auf derbash
Manualpage im Abschnitt „Parametererweiterung“.
Als Endergebnis wird in jeder Zeile in der folgenden Reihenfolge der Hostname, ein Tab, und entweder die Adresse (falls vorhanden) oder der Text Did_Not_Resolve
(falls nicht vorhanden) ausgegeben.