2013-08-06 81 views
1

我正在尝试编写一个Perl脚本,用于检查设备的名称是否存在于DNS中,如果不存在,则会打印该设备的名称。目前,这是我该怎么办:设备名称DNS测试

my $host_result = `host $device`; 
my @host_result = split(/ /, $host_result); 
my $dns = $host_result[0]; 

# host normally puts out something like this if there is an error: 
# Host blah not found: 3(NXDOMAIN) 
# So I check to see if the first word is 'Host' 
if ($dns eq "Host") { 
    print $device; 
} 

正如你所看到的,我用的是系统的host命令来做到这一点。更具体地说,我检查host是否可以找到设备的名称。

我知道这不是host的目的,我不想使用系统调用,除非我真的需要,所以我希望有人能指向我的Perl模块,允许我检查这些设备对DNS的名称。我猜Net::DNS,但是我应该使用Net :: DNS来实现这个功能吗?

我谷歌搜索,但我很难找到任何东西,因为我不知道该找什么(是DNS查询?还是DNS解析?),因为我只对DNS有一个基本的了解和与之相关的术语。

此外,我传递了很多设备名称,因此欢迎任何关于如何加快检查的提示!

回答

2

我不会DNS很懂行下去,但我认为这将使用Net::DNS::Resolver是一个粗略等同于host方法:

#!/usr/bin/perl 

use strict; 
use warnings; 
use feature 'say'; 

use Net::DNS::Resolver; 

my $device = shift; 
my $res = Net::DNS::Resolver->new; 
say $device unless $res->search($device); # Returns undef if not found 

在速度方面,我做了一个简单的基准和Net::DNS::Resolver是如果您为每个查询重复使用相同的Resolver对象,则会比system("host $device")更快。这里是我的计时结果,当主机不在DNS:

  Rate system Net::DNS 
system 233/s  --  -60% 
Net::DNS 578/s  148%  -- 

有更大的差异,当主机是DNS

  Rate system Net::DNS 
system 232/s  --  -69% 
Net::DNS 758/s  227%  -- 

下面是我用的基准码:

#!/usr/bin/perl 

use strict; 
use warnings; 
use feature 'say'; 

use Benchmark qw(cmpthese); 
use Net::DNS::Resolver; 

our $device = shift; 
our $res = Net::DNS::Resolver->new; 

cmpthese(1000, { 
    system  => sub { system("host $device > /dev/null 2>&1"); }, 
    'Net::DNS' => sub { $res->search($device); } 
}); 

我也看到Net::DNS::Resolver具有run a query in the background的功能,并立即返回。如果速度确实是一个问题,您可以尝试发送像这样的查询,并分配新的流程,以便在准备就绪后立即检查结果。或者,您可以将每个调用的进程分叉到普通前景search()函数。当然,根据您检查的主机数量,请注意您可以使用此方法运行内存或处理限制。

+0

太棒了!我之前使用过它,但它不工作。然而,你使用'say'让我意识到,我应该在检查它们之前''chomp'我的字符串,现在它可以工作! –

+0

如果你仍然拥有它,你可以发布你的基准代码吗? –

+0

@AustinMoore查看我的最新编辑。 – ThisSuitIsBlackNot