Bash: pesquisa reversa de DNS de endereços IP ativos

10

Eu tenho um comando de uma linha que lista os 10 principais endereços IP mais ativos de um log de acesso ao servidor da Web:

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

Um conjunto de resultados de amostra (com apenas 3 entradas para simplificar) seria:

20 12.34.56.7
22 3.67.89.201
29 9.0.203.255

Como você pode ver, a contagem precede o endereço IP, com os dois separados por um espaço em branco. Na verdade, também existem espaços em branco que precedem a contagem, mas não consigo mostrá-los aqui.

Eu gosto de fazer uma pesquisa DNS reversa dos endereços IP, para que fique assim:

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)

Como posso fazer isso sem recorrer a um script (ou seja, seguindo um comando de uma linha)? Qualquer conselho é muito apreciado.

GooDoo
fonte

Respostas:

15

Você pode usar dig +noall +answer -x <IP>para procurar um endereço IP.

Para simplesmente fazer um loop sobre um arquivo que contém uma lista de endereços IP:

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

Ou canalize a saída do seu comando de contagem. Desta vez, obtemos a contagem e os endereços IP separadamente e os imprimimos em uma linha:

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

Exemplo (desculpe pelo 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.

Você pode aumentar ainda mais diga saída do canal no awk para obter apenas o nome do 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
fonte
Obrigado pela resposta rápida! No entanto, desta vez, recebo apenas a saída do dig e perdi a contagem. A saída desejada seria: <count> <endereço IP> <pesquisa DNS reversa>
GooDoo 24/13
É fácil mudar isso, pois whiledivide a entrada com base em espaço em branco, para que você possa ler a contagem e o endereço IP separadamente. Veja minha atualização. Você pode brincar com digas opções para alterar a saída - eu realmente não a usei.
slhck 24/09
Obrigado! Fiz algumas modificações e agora é o que estou procurando: 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) }') )"; doneAgradecemos sua ajuda!
GooDoo 25/09
for i in `cat input.txt` ; do dig +noall +answer -x $i ; done >> output.txt
1 mas entre, utilizando xargs ( "xargs - construir e executar linhas de comando de entrada padrão") seria uma alternativa à enquanto lacetescat file | xargs -n1 dig +noall +answer -x
sfussenegger