Bash: Reverse DNS-Suche von aktiven IP-Adressen

10

Ich habe einen einzeiligen Befehl, der die 10 aktivsten IP-Adressen aus einem Webserver-Zugriffsprotokoll auflistet:

cat access.log | awk '{print $1}' | sort | uniq -c | sort -n | tail -n10

Eine Beispielergebnismenge (der Einfachheit halber mit nur 3 Einträgen) wäre:

20 12.34.56.7
22 3.67.89.201
29 9.0.203.255

Wie Sie sehen können, steht die Anzahl vor der IP-Adresse, wobei die beiden durch ein Leerzeichen getrennt sind. Es gibt tatsächlich Leerzeichen vor der Zählung, aber ich kann sie hier nicht anzeigen lassen.

Ich mache gerne eine umgekehrte DNS-Suche der IP-Adressen, damit es so aussieht:

20 12.34.56.7 (d12-34-56-7.abhsia.telus.net)
22 3.67.89.201 (customer.vpls.net)
29 9.0.203.255 (9-0-203-255.hlrn.qwest.net)

Wie kann ich dies tun, ohne auf ein Skript zurückzugreifen (dh mich an einen einzeiligen Befehl zu halten)? Jeder Rat wird sehr geschätzt.

GooDoo
quelle

Antworten:

15

Sie können dig +noall +answer -x <IP>eine IP-Adresse nachschlagen.

So durchlaufen Sie einfach eine Datei mit einer Liste von IP-Adressen:

while read ip; do dig +noall +answer -x $ip; done < ips.txt

Oder leiten Sie die Ausgabe Ihres Zählbefehls weiter. Dieses Mal erhalten wir die Anzahl und die IP-Adressen separat und drucken sie dann in einer Zeile aus:

cat access.log | awk '{print $1}' | sort | 
uniq -c | sort -n | tail -n10 |
while read count ip; do printf "%d " $count; printf "%s " $ip; dig +noall +answer -x $ip; done

Beispiel (Entschuldigung für die UUOC):

cat test | while read count ip; do printf "%d " $count; printf "%s " $ip; dig +noall +answer -x $ip; done
20 8.8.8.8 8.8.8.8.in-addr.arpa.    52767   IN  PTR google-public-dns-a.google.com.
22 8.8.4.4 4.4.8.8.in-addr.arpa.    61369   IN  PTR google-public-dns-b.google.com.

Sie können die digAusgabe in awk weiterleiten, um nur den Hostnamen zu erhalten:

cat test | while read count ip; do printf "%d " $count; printf "%s " $ip; echo $(dig +noall +answer -x $ip | awk '{ print $(NF) }'); done
20 8.8.8.8 google-public-dns-a.google.com.
22 8.8.4.4 google-public-dns-b.google.com.
slhck
quelle
Danke für die prompte Antwort! Diesmal erhalte ich jedoch nur die Ausgabe von dig und habe die Zählung verloren. Die gewünschte Ausgabe wäre: <Anzahl> <IP-Adresse> <Reverse DNS-Suche>
GooDoo
Dies ist recht einfach zu ändern, da whiledie Eingabe basierend auf Leerzeichen aufgeteilt wird, sodass Sie Anzahl und IP-Adresse getrennt lesen können. Siehe mein Update. Sie können mit digden Optionen spielen, um die Ausgabe zu ändern - ich habe sie nicht wirklich verwendet.
Slhck
Vielen Dank! Ich habe einige Änderungen vorgenommen und jetzt ist es das, wonach ich suche: cat access.log | awk '{print $1}' | sort | uniq -c | sort -n | sed "s/^[ \t]*//" | tail -n10 | while read count ip ; do echo "$count " "$ip" "( $(dig +noall +answer -x $ip | awk '{ print $(NF) }') )"; doneSchätzen Sie Ihre freundliche Hilfe!
GooDoo
for i in `cat input.txt` ; do dig +noall +answer -x $i ; done >> output.txt
+1 aber übrigens, mit xargs ("xargs - Befehlszeilen aus Standardeingabe erstellen und ausführen") wäre eine Alternative zu while-Schleifencat file | xargs -n1 dig +noall +answer -x
sfussenegger