2013-08-06 162 views
1

我正在嘗試編寫一個Perl腳本,用於檢查設備的名稱是否存在於DNS中,如果不存在,則會打印該設備的名稱。目前,這是我該怎麼辦:設備名稱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有一個基本的瞭解和與之相關的術語。

此外,我傳遞了很多設備名稱,因此歡迎任何關於如何加快檢查的提示!

回答

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 

在速度方面,我做了一個簡單的基準和Net::DNS::Resolver是如果您爲每個查詢重複使用相同的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()函數。當然,根據您檢查的主機數量,請注意您可以使用此方法運行內存或處理限制。

+0

太棒了!我之前使用過它,但它不工作。然而,你使用'say'讓我意識到,我應該在檢查它們之前''chomp'我的字符串,現在它可以工作! –

+0

如果你仍然擁有它,你可以發佈你的基準代碼嗎? –

+0

@AustinMoore查看我的最新編輯。 – ThisSuitIsBlackNot