在Perl中反向DNS查找
时间:2020-03-05 18:59:27 来源:igfitidea点击:
如何执行反向DNS查找,即如何在Perl中将IP地址解析为其DNS主机名?
解决方案
回答
gethostbyaddr和类似的调用。参见http://perldoc.perl.org/functions/gethostbyaddr.html
回答
可能有一种更简单的方法,但是对于IPv4,如果可以执行普通的DNS查找,则始终可以自己构造反向查询。对于IPv4地址A.B.C.D,请在D.C.B.A.in-addr.arpa中查找所有PTR记录。对于IPv6,请采用128个十六进制半字节并将其翻转,并添加ipv6.arpa。并做同样的事情。
回答
如果gethostbyaddr不符合需求,则Net :: DNS更加灵活。
回答
use Socket; $iaddr = inet_aton("127.0.0.1"); # or whatever address $name = gethostbyaddr($iaddr, AF_INET);
回答
如果我们需要更详细的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"; }
Original Source EliteHackers.info,还有更多详细信息。
回答
这可能很有用...
$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];
回答
单线:
perl -MSocket -E 'say scalar gethostbyaddr(inet_aton("79.81.152.79"), AF_INET)'