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)

Как я могу сделать это, не прибегая к сценарию (то есть придерживаясь однострочной команды)? Любой совет высоко ценится.

GooDoo
источник

Ответы:

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.
slhck
источник
Спасибо за быстрый ответ! Однако на этот раз я получаю только вывод от dig, и я потерял счет. Желаемый результат будет: <count> <IP address> <обратный просмотр DNS>
GooDoo
Это довольно легко изменить, так whileкак ввод разделяется на основе пробелов, так что вы можете читать счетчик и IP-адрес отдельно. Смотрите мое обновление. Вы можете поиграть с digпараметрами, чтобы изменить вывод - я не использовал его на самом деле.
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, но между прочим, использование xargs («xargs - сборка и выполнение командных строк из стандартного ввода») было бы альтернативой cat file | xargs -n1 dig +noall +answer -x
циклам