Bash: recherche DNS inversée des adresses IP actives

10

J'ai une commande sur une ligne qui répertorie les 10 meilleures adresses IP les plus actives d'un journal d'accès au serveur Web:

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

Un exemple de jeu de résultats (avec seulement 3 entrées pour plus de simplicité) serait:

20 12.34.56.7
22 3.67.89.201
29 9.0.203.255

Comme vous pouvez le voir, le nombre précède l'adresse IP, les deux étant séparés par un espace vide. Il y a également des espaces vides précédant le décompte, mais je ne peux pas les faire apparaître ici.

J'aime faire une recherche DNS inversée des adresses IP pour qu'elles ressemblent à ceci:

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)

Comment puis-je faire cela sans avoir recours à un script (c'est-à-dire, s'en tenir à une commande sur une ligne)? Tout conseil est fort apprécié.

GooDoo
la source

Réponses:

15

Vous pouvez utiliser dig +noall +answer -x <IP>pour rechercher une adresse IP.

Pour simplement parcourir un fichier contenant une liste d'adresses IP:

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

Ou dirigez la sortie de votre commande de comptage. Cette fois, nous obtenons le nombre et les adresses IP séparément, puis les imprimons sur une seule ligne:

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

Exemple (désolé pour 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.

Vous pouvez ajouter digla sortie de pipe dans awk pour obtenir simplement le nom d'hôte:

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
la source
Merci pour la réponse rapide! Cependant, cette fois, je ne reçois que la sortie de creuser et j'ai perdu le compte. La sortie souhaitée serait: <nombre> <adresse IP> <recherche DNS inversée>
GooDoo
C'est assez facile à changer car whiledivise l'entrée en fonction de l'espace blanc, vous pouvez donc lire le nombre et l'adresse IP séparément. Voir ma mise à jour. Vous pouvez jouer avec digles options de pour changer la sortie - je ne l'ai pas vraiment utilisée.
slhck
Merci! J'ai fait quelques modifications et maintenant c'est ce que je recherche: 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) }') )"; doneappréciez votre aimable aide!
GooDoo
for i in `cat input.txt` ; do dig +noall +answer -x $i ; done >> output.txt
+1 mais btw, utiliser xargs ("xargs - construire et exécuter des lignes de commande à partir de l'entrée standard") serait une alternative aux boucles cat file | xargs -n1 dig +noall +answer -x
while