【问题标题】:Device Name DNS Test设备名称 DNS 测试
【发布时间】:2013-08-06 16:10:27
【问题描述】:

我正在尝试编写一个 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 和相关的术语。

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

【问题讨论】:

    标签: perl dns


    【解决方案1】:

    我对 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::Resolversystem("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() 函数的调用分叉一个进程。当然,根据您要检查的主机数量,请注意,使用这种方法可能会遇到内存或进程限制。

    【讨论】:

    • 太棒了!我以前用过它,但它不起作用。但是,您对say 的使用让我意识到我应该在检查字符串之前可能应该chomp,现在它可以工作了!
    猜你喜欢
    • 1970-01-01
    • 2017-01-29
    • 1970-01-01
    • 1970-01-01
    • 2018-06-30
    • 1970-01-01
    • 2015-07-14
    • 2017-07-02
    • 1970-01-01
    相关资源
    最近更新 更多