12

如何执行反向 DNS 查找,即如何在 Perl 中将 IP 地址解析为其 DNS 主机名?

4

8 回答 8

21

如果您需要更详细的 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,还有更多细节。

于 2008-09-17T17:32:13.853 回答
20

gethostbyaddr 和类似的调用。看http://perldoc.perl.org/functions/gethostbyaddr.html

于 2008-09-17T17:15:58.370 回答
14
use Socket;
$iaddr = inet_aton("127.0.0.1"); # or whatever address
$name  = gethostbyaddr($iaddr, AF_INET);
于 2008-09-17T17:22:49.897 回答
4
perl -MSocket -E 'say scalar gethostbyaddr(inet_aton("69.89.27.250"), AF_INET)'

返回:在 -e 第 1 行的 EOF 之前的任何地方都找不到字符串终止符“'”。

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

返回:box250.bluehost.com

我必须更改行以使用双引号,然后转义 IP 地址周围的引号

于 2012-10-09T23:51:39.830 回答
2

单线:

perl -MSocket -E 'say scalar gethostbyaddr(inet_aton("79.81.152.79"), AF_INET)'
于 2009-09-03T13:29:46.180 回答
1

可能有更简单的方法,但是对于 IPv4,如果您可以执行普通的 DNS 查找,您总是可以自己构造反向查询。对于 IPv4 地址 ABCD,请在 DCBAin-addr.arpa 中查找任何 PTR 记录。对于 IPv6,您获取 128 个十六进制半字节并将它们翻转并附加 ipv6.arpa。并做同样的事情。

于 2008-09-17T17:17:12.470 回答
1

如果 gethostbyaddr 不能满足您的需求,Net::DNS会更灵活。

于 2008-09-17T17:22:03.377 回答
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];
于 2008-09-18T22:25:35.323 回答