1

我正在尝试编写一个 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 内部的什么来完成这个?

我四处搜索,但我很难找到任何东西,因为我不知道要查找什么(是 DNS 查询吗?还是 DNS 解析?),因为我对 DNS 和相关术语只有基本的了解给它。

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

4

1 回答 1

2

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

#!/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::Resolversystem("host $device")为每个查询重复使用相同的 Resolver 对象要快得多。以下是主机不在 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具有在后台运行查询并立即返回的功能。如果速度确实是个问题,您可以尝试像这样发送查询,并在结果准备好后立即分叉一个新流程来检查结果。或者,您可以只为对正常前台search()函数的每次调用分叉一个进程。当然,根据您要检查的主机数量,请注意,使用这种方法可能会遇到内存或进程限制。

于 2013-08-06T16:35:46.197 回答