Perl中的反向DNS查找

13

我该如何在Perl中执行反向DNS查询,也就是如何将IP地址解析为其DNS主机名?

8个回答

22
如果您需要更详细的DNS信息,请使用Net::DNS模块,这里有一个示例:
use Net::DNS;
my $res = Net::DNS::Resolver->new;

# create the reverse lookup DNS name (note that the octets in the IP address need to be reversed).
my $IP = "209.85.173.103";
my $target_IP = join('.', reverse split(/\./, $IP)).".in-addr.arpa";

my $query = $res->query("$target_IP", "PTR");

if ($query) {
  foreach my $rr ($query->answer) {
    next unless $rr->type eq "PTR";
    print $rr->rdatastr, "\n";
  }
} else {
  warn "query failed: ", $res->errorstring, "\n";
}

原始来源 EliteHackers.info,有更多详细信息。


20

17
use Socket;
$iaddr = inet_aton("127.0.0.1"); # or whatever address
$name  = gethostbyaddr($iaddr, AF_INET);

4
perl -MSocket -E 'say scalar gethostbyaddr(inet_aton("69.89.27.250"), AF_INET)'

返回结果:

错误:在第1行找不到字符串终止符“'”的位置之前就结束了EOF。

perl -MSocket -E "say scalar gethostbyaddr(inet_aton(\"69.89.27.250\"), AF_INET)"

返回:

返回:box250.bluehost.com

我需要更改该行以使用双引号,然后转义IP地址周围的引号。


1
这很可能是因为您正在 Windows 下使用 cmd.exe。 - spacebat

2

一句话概括:

perl -MSocket -E 'say scalar gethostbyaddr(inet_aton("79.81.152.79"), AF_INET)'

1

可能有更简单的方法,但对于IPv4而言,如果你可以执行普通的DNS查找,就可以始终自己构建反向查询。对于IPv4地址A.B.C.D,在D.C.B.A.in-addr.arpa上查找任何PTR记录。 对于IPv6,您需要取出128个十六进制数,并将它们翻转并附加ipv6.arpa。 然后执行相同的操作。


1
如果gethostbyaddr不符合您的需求,Net::DNS更加灵活。

0

这可能很有用...

$ip = "XXX.XXX.XXX.XXX" # IPV4 address.
my @numbers = split (/\./, $ip);
if (scalar(@numbers) != 4)
{
    print "$ip is not a valid IP address.\n";
    next;
}
my $ip_addr = pack("C4", @numbers);
# First element of the array returned by gethostbyaddr is host name.
my ($name) = (gethostbyaddr($ip_addr, 2))[0];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接