Bash:活动 IP 地址的反向 DNS 查找

Goo*_*Doo 11 networking linux dns bash

我有一个单行命令,可以从 Web 服务器访问日志中列出前 10 个最活跃的 IP 地址:

cat access.log | awk '{print $1}' | sort | uniq -c | sort -n | tail -n10
Run Code Online (Sandbox Code Playgroud)

示例结果集(为简单起见只有 3 个条目)将是:

20 12.34.56.7
22 3.67.89.201
29 9.0.203.255
Run Code Online (Sandbox Code Playgroud)

如您所见,计数在 IP 地址之前,两者由空格分隔。计数前实际上也有空格,但我无法在此处显示它们。

我喜欢对 IP 地址进行反向 DNS 查找,使其看起来像这样:

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)
Run Code Online (Sandbox Code Playgroud)

如何在不求助于脚本的情况下执行此操作(即坚持使用单行命令)?非常感谢任何建议。

slh*_*hck 16

您可以使用它dig +noall +answer -x <IP>来查找 IP 地址。

简单地循环包含 IP 地址列表的文件:

while read ip; do dig +noall +answer -x $ip; done < ips.txt
Run Code Online (Sandbox Code Playgroud)

或者,通过管道传输计数命令的输出。这次我们分别获取计数和 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
Run Code Online (Sandbox Code Playgroud)

示例(对不起 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.
Run Code Online (Sandbox Code Playgroud)

您可以进一步将 pipedig的输出输入 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.
Run Code Online (Sandbox Code Playgroud)