我正在尝试编写一个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有基本的了解与之相关的术语。
另外,我传递了很多设备名称,所以欢迎任何关于如何加快检查的提示!
答案 0 :(得分: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
就速度而言,我做了一个简单的基准测试,如果为每个查询重复使用相同的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()
函数分叉一个进程。当然,根据您正在检查的主机数量,请注意使用此方法可能会遇到内存或进程限制。