有没有办法检查大量 IP 的反向 DNS 检查,我有一个想要检查的 IP 列表?
我知道您可以单独完成这些操作:
host <ip-address>
和
dig -x <ip-address>
另外,有没有办法导出它们?
答案1
xargs
提供了一个 optin --arg-file
。使用-L1
选项将每一行作为参数,我们可以制作的最简单的命令如下
$ xargs -L1 --arg-file=ip-addr.txt dig +short -x
google-public-dns-a.google.com.
resolver2.opendns.com.
如果需要在解析域名旁边显示IP地址,我们也可以这样做:
$ xargs -L1 --arg-file=ip-addr.txt sh -c 'printf "%s: " "$1"; dig +short -x "$1"' sh
8.8.8.8: google-public-dns-a.google.com.
208.67.220.220: resolver2.opendns.com.
当然,xargs
是一个额外的过程。如果我们只想使用 shell 和 怎么办dig
?使用 bash 版本 4 及更高版本,我们可以使用mapfile
或readarray
将文本文件的行放入数组中,然后循环处理项目:
$ mapfile -t -d $'\n' < ip-addr.txt
$ for i in "${MAPFILE[@]}" ; do printf "%s:" "$i"; dig +short -x "$i"; done
8.8.8.8:google-public-dns-a.google.com.
208.67.220.220:resolver2.opendns.com.
如果 IP 地址很少且不需要长文本文件,POSIXly,我们可以使用set
将值定义为位置参数:
$ set -- 8.8.8.8 208.67.220.220
$ for i ; do printf "%s:" "$i"; dig +short -x "$i"; done
8.8.8.8:google-public-dns-a.google.com.
208.67.220.220:resolver2.opendns.com.
我们还可以dig -x $IP_ADDRESS +short
在如下脚本中使用:
#!/bin/bash
export LC_ALL=C
# without specifying 'in' part, bourne-like shells default
# to iterating over positional parameters
for item
do
domain=$(dig -x "$item" +short)
# this logic can also be reversed with
# [ "x$domain" = "x" ] && echo "empty" || echo "$domain"
if [ -n "$domain" ] ;
then
echo "$domain"
else
echo "$item" result is NULL
fi
done
示例使用演示(所有 IP 地址均以空格分隔):
$ ./reverse_dns_lookup.sh 8.8.8.8 74.125.193.94 151.101.193.69
google-public-dns-a.google.com.
ig-in-f94.1e100.net.
151.101.193.69 result is NULL
如您所见,在上一个示例中,我们的 DNS 服务器未找到我们为其提供的 IP 地址的域名。在这种情况下,我们可以使用其他 DNS 服务器,例如 open_dnsdig @208.67.220.220 $IP_ADDRESS +short
在上面的演示中,IP 地址是在命令行上提供的,./reverse_dns_lookup.sh ADDRESS1 ADDRESS2 ADDRESS2
但是您也可以使用文件,如下所示:
$ cat ip_addresses.txt | xargs ./reverse_dns_lookup.sh <
google-public-dns-a.google.com.
resolver2.opendns.com.
192.30.253.112 result is NULL
替代脚本版本:
这是打印输出中 AUTHORITY 部分的脚本的替代版本dig's
。这可能比+short
版本更好、更可靠。注意:这使用8.8.8.8
,即 Google 的公共 DNS。如果您认为有必要,请使用其他服务器。
#!/bin/bash
export LC_ALL=C
for item
do
domain=$(dig @8.8.8.8 -x "$item" +noall +authority +answer)
if [ -n "$domain" ] ;
then
echo "$domain"
else
echo "$item" result is NULL
fi
done
演示:
$ cat ip_addresses.txt | xargs ./reverse_dns_lookup.sh
; <<>> DiG 9.10.3-P4-Ubuntu <<>> @8.8.8.8 -x 8.8.8.8 +noall +authority +answer
; (1 server found)
;; global options: +cmd
8.8.8.8.in-addr.arpa. 21390 IN PTR google-public-dns-a.google.com.
; <<>> DiG 9.10.3-P4-Ubuntu <<>> @8.8.8.8 -x 208.67.220.220 +noall +authority +answer
; (1 server found)
;; global options: +cmd
220.220.67.208.in-addr.arpa. 6674 IN PTR resolver2.opendns.com.
; <<>> DiG 9.10.3-P4-Ubuntu <<>> @8.8.8.8 -x 192.30.253.112 +noall +authority +answer
; (1 server found)
;; global options: +cmd
253.30.192.in-addr.arpa. 10 IN SOA ns1.p16.dynect.net. ops.github.com. 6 3600 600 604800 60
答案2
以下是一个快速而粗略的一行:ip-addresses.txt 的内容:
$ cat ip-addresses.txt
1.2.3.4
1.1.1.1
222.222.222.222
23.12.34.56
8.8.8.8
208.67.222.220
将 txt 替换为包含地址的文件,并以换行符分隔:
$ cat ip-addresses.txt | xargs -I % bash -c 'echo "%:$(dig -x % +short)"' >> dig-output.txt
如果你像上面一样将其附加到 dig-output.txt,则该文件的内容将如下所示,如果反向 DNS 查找成功,IP:NAME
则否则,IP:(NULL)
$ cat dig-output.txt
1.2.3.4:
1.1.1.1:
222.222.222.222:
23.12.34.56:a23-12-34-56.deploy.static.akamaitechnologies.com.
8.8.8.8:google-public-dns-a.google.com.
208.67.222.220:resolver3.opendns.com.
如果 IP 地址来自另一个进程,您可以直接通过管道传输到 xargs。
编辑:如果在查找失败的情况下必须使用诸如 null 这样的词(受@Serg 启发),则可以使用以下命令:
$ cat ip-addresses.txt | xargs -I % bash -c '{ query=$(dig -x % +short); if [ -z $query ]; then query=null;fi; echo %:$query; }'
cat ip-addresses.txt
# 将 IP 地址打印到STDOUT
。如果你不想cat
从文件中打印,你可以直接从另一个进程中传输,例如command | xargs ...
xargs -I % bash -c
# 从管道左侧取出每一行,用作%
占位符,运行bash
单引号内的命令dig
%
来自占位符的 IP 地址xargs
,分配给变量query
。如果结果恰好是null
(零长度),则将字符串“null”字分配给query
变量,然后打印为IP:result
演示:
$ cat ip-addresses.txt | xargs -I % bash -c '{ query=$(dig -x % +short); if [ -z $query ]; then query=null;fi; echo %:$query; }'
1.2.3.4:null
1.1.1.1:null
222.222.222.222:null
23.12.34.56:a23-12-34-56.deploy.static.akamaitechnologies.com.
8.8.8.8:google-public-dns-a.google.com.
208.67.222.220:resolver3.opendns.com.
答案3
网络地图
你可以
nmap -R -sL -Pn 1.2.3.0/24 | grep '('
-n/-R
从不进行 DNS 解析/始终解析 [默认值:有时]-sL
列出扫描 - 简单列出要扫描的目标-Pn
将所有主机视为在线 - 跳过主机发现。删除此项以获取对 ping 的响应。
留下grep
的只是解析的反向DNS和一些有用的行。
添加--dns-servers x.x.x.x
使用特定 DNS 服务器例如 1.1.1.1。
答案4
受到另一个答案中所示的 shell 示例的启发,我决定使用 Perl 版本更适合我,因此我创建了这个文件“batch_dns_by_ip.pl”。您将 IP 地址列表放在文本文件中,然后将其输入到程序中。
代码看起来应该像这样,并且您需要使文件可执行:
#!/usr/bin/perl
use strict;
my @domains;
my $address;
while (<>) {
chomp;
$address = $_;
$address =~ s/ *//g;
@domains = ();
@domains = `dig -x "$address" +short`;
chomp(@domains);
if ( "$domains[0]" eq "" ) {
$domains[0] = "NULL";
}
printf( "addr: %15s names: %s", $address, $domains[0] );
if ( "$domains[1]" eq "" ) {
print "\n";
}
else {
printf( ", %s\n", $domains[1] );
}
}
运行可能看起来像这样:
$ cat myips | ./batch_dns_by_ip.pl
addr: 216.58.219.238 names: lga25s41-in-f14.1e100.net., lga25s41-in-f238.1e100.net.
addr: 151.101.129.69 names: NULL
addr: 8.8.8.8 names: google-public-dns-a.google.com.
addr: 10.49.11.62 names: nyalbdnsvip01.miscny.nyenet., nyalbcwgbvip01-vlan401.miscny.nyenet.
addr: 69.172.201.153 names: NULL
我希望这能有所帮助!