2011-10-12 100 views
4

我有我试图获得IP地址的系统列表。我已成功使用net :: DNS模块为perl执行单个主机名的IP地址查询。我有1000个系统,但是,我需要IP地址。如何在Unix/Linux上使用perl执行批量DNS查询?

有没有办法让一个查询获得所有这些ip地址?

如果不是,有没有办法让整个DNS条目列表,比如说,单个域名?如果我知道了,那么我可以简单地将它放入哈希中,并以这种方式引用IP地址。

+0

有没有你不只是在主机名环路理由吗? –

+0

表现。我只是不想在做1时做出1,000个单独的查询就足够了! – wsaxton

+2

您是否证明制作1,000个单独的查询会对您的程序或DNS服务器的性能产生不利影响?如果没有,那么你是过早优化。大多数DNS服务器每秒可以处理数以万计的查询,我不希望在循环中查询它会有问题。 –

回答

10

不需要定制Perl。这可以通过使用-f选项(的BIND工具的一部分)来完成:

$ dig -f /path/to/host-list.txt 
+0

感谢您的回复。我意识到了这个dig命令,但是与net :: DNS返回的整齐对象相比,它看起来像是一个可怕的解析。如果我没有收到“更清洁”的答案,我会认为这是被接受的答案。 – wsaxton

+1

它可以变得更加安静和简洁 - 仍然需要一些解析,但是要探索选项。 – tripleee

+1

实际上,在使用它之后,+ noall + answer选项看起来就像我要查找的内容,并且更容易解析。 – wsaxton

3

对于大型数据集的域名,这将没有真正的需要解析的结果做快;一个IP将始终在$results{$domain}[0][4]。这不是一个单一的查询,但它们将同时完成(在任何一次IIRC中最多有10个查询正在进行),因此将很快完成。只需确保DNS服务器运营商在很短的时间内就没有问题。

use AnyEvent::DNS; 
use Data::Dumper; 

my @domains = qw/google.com/; 
my $resolver = AnyEvent::DNS->new(server => '8.8.4.4'); 
my %results; 

### Set up the condvar 
my $done = AE::cv; 
$done->begin(sub { shift->send }); 

for my $domain (@domains) { 
    $done->begin; 
    $resolver->resolve($domain, 'a', sub {push @{$results{$domain}}, \@_; $done->end;}); 
} 

### Decrement the cv counter to cancel out the send declaration 
$done->end; 

### Wait for the resolver to perform all resolutions 
$done->recv; 

print Dumper \%results; 

输出:

$VAR1 = { 
      'google.com' => [ 
          [ 
           'google.com', 
           'a', 
           'in', 
           300, 
           '74.125.225.52' 
          ], 
          [ 
           'google.com', 
           'a', 
           'in', 
           300, 
           '74.125.225.50' 
          ], 
          [ 
           'google.com', 
           'a', 
           'in', 
           300, 
           '74.125.225.49' 
          ], 
          [ 
           'google.com', 
           'a', 
           'in', 
           300, 
           '74.125.225.48' 
          ], 
          [ 
           'google.com', 
           'a', 
           'in', 
           300, 
           '74.125.225.51' 
          ] 
          ] 
     }; 
+0

感谢您的回答。我们实际上可能会使用这个解决方案,即使它不是,技术上,这个问题的答案(仍然有1,000个查询正在完成)。 – wsaxton

+1

是的,我猜你试图巩固他们因为Net :: DNS是懒惰的。这是非阻塞的,可以与其他基于事件的编程一起使用,并且通常应该可以工作。您实际上无法在单个数据包中查询多个域查找;这只是协议的工作方式。在幕后,像挖掘这样的东西仍然会进行多次查找。 C/f http://groups.google.com/group/comp.protocols.dns.bind/browse_thread/thread/b8e5b13649bb0158 – Oesor