in reply to Retrieving all hostnames for an IP address...

Look at Net::DNS as that should have less overhead than using system or backticks, but keep in mind that your problem (at least as phrased) is unsolvable.

There is one and only one PTR record for a given IP; there can be an unlimited number of A records which all resolve to the same IP (not to mention CNAME aliases). There's no way to get anything other than the PTR address from DNS. If you've got a list of hostnames you could build a mapping on your own, but it's only going to be complete as your list of hostnames.

  • Comment on Re: Retrieving all hostnames for an IP address...

Replies are listed 'Best First'.
Re^2: Retrieving all hostnames for an IP address...
by grinder (Bishop) on Dec 13, 2006 at 18:00 UTC
    There is one and only one PTR record for a given IP

    Not on this planet.

    use strict; use Socket; my $addr = shift || '172.17.0.1'; my ($name,$aliases) = gethostbyaddr(inet_aton($addr), AF_INET); print "address $addr has the following names:\n"; print "\t$_\n" for ($name, split / /, $aliases);

    When run against my DNS server, produces:

    address 172.17.0.1 has the following names: host1.example.com host2.example.com host3.example.com host4.example.com host5.example.com

    In other words, a PTR lookup can return a result set of more than one record. Many buggy applications make the invalid assumption that no more than one result will be returned. But of course, no Perlmonk ever would :)

    gethostbyaddr is a bit naughty by referring to one as the name, and the others, aliases. According the the RFC (if I remember correctly, it's been a while), they are all equally "at the same level". It's up to the application to sift through them and find the one that suits its needs.

    • another intruder with the mooring in the heart of the Perl

      Technically yes DNS allows multiple PTR RRs to be returned for a single query. However the General Consensus from the DNS types (search an archive of comp.protocols.dns.bind, for example here or here; look enough and you'll see threats to put together a "Best Practices" comdemnation of it) is still that you shouldn't do that because pretty much everything is written with the expectation that PTRs map to a single A record. There's also the problem that it's possible (with a sufficiently hostname-ful IP) to have more PTR RRs than can be returned in a single UDP packet. And I can't say that I've personally ever seen it happen in the wild in 15+ years of varying degrees of sysadmining.

      Sure, you can do it; you can also use a pickaxe to poke speed holes in your car's hood. Neither of them really are going to be of much practical benefit.

Re^2: Retrieving all hostnames for an IP address...
by jettero (Monsignor) on Dec 13, 2006 at 18:54 UTC

    I agree with you that Net::DNS is the way to go, but I also agree with the poster above that there's, many times, more than one PTR. Also, it would seem the parent poster is looking for PTR records, not A records. I sometimes lookup the A records for a PTR to see if they match...

    UPDATE: After reading the update to the question I deleted much of this post and put this instead. It might even be what the asker wants, or close to it...

    use strict; use Net::DNS; my $res = new Net::DNS::Resolver; for my $rr ($res->axfr('domain.name')) { next unless $rr->type eq "A"; my $host = $rr->name; my $ip = $rr->address; next unless $ip eq "ip.ip.ip.ip"; print "$host\n"; }