我正在尝试编写一个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及其相关术语只有一个基本的理解。
此外,我正在传递许多设备名称,所以任何关于如何加快检查的提示都是受欢迎的!
发布于 2013-08-06 16:35:46
我对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就速度而言,我做了一个简单的基准测试,如果您对每个查询重用相同的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有一个函数到在后台运行查询并立即返回。如果速度确实是一个问题,您可以尝试发送这样的查询,并分叉一个新的进程,以检查结果,一旦他们准备好了。或者,您可以为每个对普通前台search()函数的调用发送一个进程。当然,根据您正在检查的主机数量,请注意,使用这种方法可能会遇到内存或进程限制。
https://stackoverflow.com/questions/18085255
复制相似问题