Bash: Зворотний пошук DNS-адреси активних IP-адрес


11

У мене є однорядкова команда, яка містить список 10 найактивніших IP-адрес із журналу доступу веб-сервера:

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

Вибірковим набором результатів (із 3 простотами для простоти) буде:

20 12.34.56.7
22 3.67.89.201
29 9.0.203.255

Як бачите, кількість передує IP-адресі, при цьому дві розділені порожнім пробілом. Перед рахунком теж є порожні пробіли, але я не можу їх показати тут.

Мені подобається робити зворотний пошук DNS IP-адрес, щоб він виглядав так:

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)

Як я можу це зробити, не вдаючись до скрипту (тобто дотримуючись однорядну команду)? Будь-яка порада високо цінується.

Відповіді:


16

Ви можете dig +noall +answer -x <IP>шукати IP-адресу.

Щоб просто перевести цикл на файл, який містить список IP-адрес:

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

Або передайте вихід вашої команди підрахунку. Цього разу ми отримуємо підрахунок та IP-адреси окремо, а потім друкуємо їх на одному рядку:

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

Приклад (вибачте за 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.

Ви можете digподати вихідні дані в awk, щоб просто отримати ім'я хоста:

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.

Дякуємо за швидку відповідь! Однак цього разу я отримую тільки висновок з копання, і я програв. Бажаним результатом буде: <count> <IP-адреса> <зворотний пошук DNS>
GooDoo

Це досить легко змінити, оскільки whileрозбиває вхід на основі пробілів, тому ви можете читати підрахунок та IP-адресу окремо. Дивіться моє оновлення. Ви можете грати з digпараметрами s, щоб змінити вихід - я його не використовував насправді.
slhck

Дякую! Я вніс деякі зміни, і тепер це те, що я шукаю: 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) }') )"; doneВдячний за добру допомогу!
GooDoo

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

+1, але btw, використання xargs ("xargs - створення та виконання командних рядків зі стандартного введення") було б альтернативою циклу cat file | xargs -n1 dig +noall +answer -x
while
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.