Bash: Odwrotne wyszukiwanie DNS aktywnych adresów IP

11

Mam jedno-wierszowe polecenie, które wyświetla listę 10 najbardziej aktywnych adresów IP z dziennika dostępu do serwera WWW:

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

Przykładowy zestaw wyników (dla uproszczenia tylko 3 wpisy) to:

20 12.34.56.7
22 3.67.89.201
29 9.0.203.255

Jak widać, liczba poprzedza adres IP, a dwa oddzielone są spacją. Są też puste miejsca poprzedzające liczenie, ale nie mogę ich tutaj pokazać.

Lubię robić odwrotne wyszukiwanie adresów IP w DNS, aby wyglądało to tak:

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)

Jak mogę to zrobić bez uciekania się do skryptu (czyli trzymania się wiersza poleceń w jednym wierszu)? Wszelkie porady są mile widziane.

GooDoo
źródło

Odpowiedzi:

16

Możesz użyć dig +noall +answer -x <IP>do wyszukania adresu IP.

Aby po prostu zapętlić plik zawierający listę adresów IP:

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

Lub potokuj dane wyjściowe polecenia liczenia. Tym razem osobno liczymy i adresy IP, a następnie drukujemy je w jednym wierszu:

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

Przykład (przepraszam za 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.

Możesz dalej digwysyłać dane wyjściowe potoku do awk, aby uzyskać nazwę hosta:

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
źródło
Dzięki za szybką odpowiedź! Jednak tym razem otrzymałem tylko wynik z kopania i straciłem licznik. Sygnał wyjściowy będzie: <liczba> <adres IP> <wstecznego DNS>
GooDoo
Jest to dość łatwe do zmiany, ponieważ whiledzieli dane wejściowe na podstawie białych znaków, dzięki czemu można odczytać liczbę i adres IP osobno. Zobacz moją aktualizację. Możesz grać z digopcjami, aby zmienić wyjście - tak naprawdę go nie użyłem.
slhck 24.09.13
Dzięki! Wprowadziłem kilka modyfikacji i teraz tego właśnie szukam: 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) }') )"; donedoceń swoją miłą pomoc!
GooDoo,
for i in `cat input.txt` ; do dig +noall +answer -x $i ; done >> output.txt
+1, ale btw, użycie xargs („xargs - budowanie i wykonywanie wierszy poleceń ze standardowego wejścia”) byłoby alternatywą dla pętli whilecat file | xargs -n1 dig +noall +answer -x
sfussenegger