Bash: búsqueda inversa de DNS de direcciones IP activas

10

Tengo un comando de una línea que enumera las 10 principales direcciones IP más activas de un registro de acceso al servidor web:

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

Un conjunto de resultados de muestra (con solo 3 entradas para simplificar) sería:

20 12.34.56.7
22 3.67.89.201
29 9.0.203.255

Como puede ver, el recuento precede a la dirección IP, con los dos separados por un espacio en blanco. En realidad, también hay espacios en blanco que preceden al conteo, pero no puedo hacer que se muestren aquí.

Me gusta hacer una búsqueda DNS inversa de las direcciones IP para que se vea así:

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)

¿Cómo puedo hacer esto sin recurrir a un script (es decir, apegarme a un comando de una línea)? Cualquier consejo es muy apreciado.

GooDoo
fuente

Respuestas:

15

Puede usar dig +noall +answer -x <IP>para buscar una dirección IP.

Para simplemente recorrer un archivo que contiene una lista de direcciones IP:

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

O canalice la salida de su comando de conteo. Esta vez obtenemos el recuento y las direcciones IP por separado y luego las imprimimos en una línea:

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

Ejemplo (perdón por el 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.

Puede seguir canalizando digla salida a awk para obtener el nombre del 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.
slhck
fuente
¡Gracias por la pronta respuesta! Sin embargo, esta vez solo obtengo la salida de dig y perdí la cuenta. El resultado deseado sería: <cuenta> <dirección IP> <búsqueda inversa de DNS>
GooDoo
Eso es bastante fácil de cambiar, ya que whiledivide la entrada en función del espacio en blanco, por lo que puede leer el recuento y la dirección IP por separado. Mira mi actualización. Puedes jugar con diglas opciones para cambiar la salida, no la he usado realmente.
slhck
¡Gracias! He realizado algunas modificaciones y ahora es lo que estoy buscando: ¡ 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) }') )"; doneAgradezco su amable ayuda!
GooDoo
for i in `cat input.txt` ; do dig +noall +answer -x $i ; done >> output.txt
+1 pero por cierto, usar xargs ("xargs - construir y ejecutar líneas de comando desde la entrada estándar") sería una alternativa a los bucles whilecat file | xargs -n1 dig +noall +answer -x
sfussenegger