设备名称DNS测试

时间:2013-08-06 16:10:27

标签: perl dns

我正在尝试编写一个Perl脚本来检查设备的名称是否存在于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来实现这个目标吗?

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

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

1 个答案:

答案 0 :(得分:2)

我对DNS也不是很了解,但我认为这与使用Net::DNS::Resolverhost方法大致相当:

#!/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

就速度而言,我做了一个简单的基准测试,如果为每个查询重复使用相同的Resolver对象,Net::DNS::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()函数分叉一个进程。当然,根据您正在检查的主机数量,请注意使用此方法可能会遇到内存或进程限制。