Bash: ricerca DNS inversa degli indirizzi IP attivi


11

Ho un comando a una riga che elenca i primi 10 indirizzi IP più attivi da un registro di accesso al server Web:

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

Un set di risultati di esempio (con solo 3 voci per semplicità) sarebbe:

20 12.34.56.7
22 3.67.89.201
29 9.0.203.255

Come puoi vedere, il conteggio precede l'indirizzo IP, con i due separati da uno spazio vuoto. In realtà ci sono anche spazi vuoti che precedono il conteggio ma non riesco a farli mostrare qui.

Mi piace fare una ricerca DNS inversa degli indirizzi IP in modo che assomigli a questo:

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)

Come posso farlo senza ricorrere a uno script (ovvero, attenersi a un comando di una riga)? Ogni consiglio è molto apprezzato.

Risposte:


16

È possibile utilizzare dig +noall +answer -x <IP>per cercare un indirizzo IP.

Per eseguire semplicemente il loop su un file che contiene un elenco di indirizzi IP:

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

Oppure, convoglia l'output del comando di conteggio. Questa volta otteniamo il conteggio e gli indirizzi IP separatamente e quindi li stampiamo su una riga:

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

Esempio (scusate l'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.

Puoi inoltre diggenerare l'output di pipe in awk per ottenere solo il nome host:

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.

Grazie per la pronta risposta! Tuttavia, questa volta ottengo solo l'output dallo scavo e ho perso il conto. L'output desiderato sarebbe: <conto> <indirizzo IP> <ricerca DNS inversa>
GooDoo

È abbastanza facile da cambiare poiché whiledivide l'input in base allo spazio bianco, quindi puoi leggere il conteggio e l'indirizzo IP separatamente. Vedi il mio aggiornamento Puoi giocare con digle opzioni per modificare l'output: non l'ho usato davvero.
slhck,

Grazie! Ho apportato alcune modifiche e ora è quello che sto cercando: 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) }') )"; doneapprezzo il tuo gentile aiuto!
GooDoo,

for i in `cat input.txt` ; do dig +noall +answer -x $i ; done >> output.txt

+1 ma a proposito, usare xargs ("xargs - costruisci ed esegui righe di comando dall'input standard") sarebbe un'alternativa al ciclo whilecat file | xargs -n1 dig +noall +answer -x
sfussenegger
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.