2013-08-06 3 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 следует использовать для этого?

I Googled around, но мне сложно найти что-либо, потому что я не знаю, что искать (это DNS-запрос или разрешение DNS?), Потому что у меня есть только базовое понимание DNS и относящаяся к нему терминология.

Кроме того, я передаю много имен устройств, поэтому любые советы о том, как ускорить проверку, приветствуются!

ответ

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::Resolver является быстрее, чем system("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 имеет функцию run a query in the background и немедленно возвращается. Если скорость действительно проблема, вы можете попробовать отправить ваши запросы, подобные этому, и развернуть новый процесс, чтобы проверить результаты, как только они будут готовы. В качестве альтернативы, вы можете просто разветвить процесс для каждого вызова на обычном переднем плане search(). Конечно, в зависимости от количества хостов, которые вы проверяете, имейте в виду, что при таком подходе вы могли бы работать с ограничениями памяти или процессами.

+0

Отлично! Я использовал его раньше, и он не работал. Однако ваше использование 'say' заставило меня понять, что я должен, вероятно,« chomp' мои строки, прежде чем проверять их, и теперь это работает! –

+0

Если у вас все еще есть, можете ли вы разместить свой бенчмаркинг? –

+0

@AustinMoore Смотрите мое последнее изменение. – ThisSuitIsBlackNot

Смежные вопросы