2012-02-11 7 views
3

otter bookには、特定のホスト名に対して同じアドレスを返すかどうかを繰り返し確認するための小さなスクリプト(173ページ)があります。ただし、本書に記載されているソリューションは、ホストが静的IPアドレスを持っている場合にのみ機能します。複数のアドレスが関連付けられたホストで動作させたい場合は、このスクリプトをどのように書くのですか?ここでperlとNet :: DNSを使用したDNSチェック

は、コードは次のとおりです。

#!/usr/bin/perl 
use Data::Dumper; 
use Net::DNS; 

my $hostname = $ARGV[0]; 
# servers to check 
my @servers = qw(8.8.8.8 208.67.220.220 8.8.4.4); 

my %results; 
foreach my $server (@servers) { 
    $results{$server} 
     = lookup($hostname, $server); 
} 

my %inv = reverse %results; # invert results - it should have one key if all 
          # are the same 
if (scalar keys %inv > 1) { # if it has more than one key 
    print "The results are different:\n"; 
    print Data::Dumper->Dump([ \%results ], ['results']), "\n"; 
} 

sub lookup { 
    my ($hostname, $server) = @_; 

    my $res = new Net::DNS::Resolver; 
    $res->nameservers($server); 
    my $packet = $res->query($hostname); 

    if (!$packet) { 
     warn "$server not returning any data for $hostname!\n"; 
     return; 
    } 
    my (@results); 
    foreach my $rr ($packet->answer) { 
     push (@results, $rr->address); 
    } 
    return join(', ', sort @results); 
} 

答えて

0

私が持っていた問題は、私は、このようなwww.google.comなど複数のアドレスを、返されたホスト名上のコードを呼び出して、このエラーを得ていたということでした。

*** WARNING!!! The program has attempted to call the method 
*** "address" for the following RR object: 
*** 
*** www.google.com. 86399 IN CNAME www.l.google.com. 
*** 
*** This object does not have a method "address". THIS IS A BUG 
*** IN THE CALLING SOFTWARE, which has incorrectly assumed that 
*** the object would be of a particular type. The calling 
*** software should check the type of each RR object before 
*** calling any of its methods. 
*** 
*** Net::DNS has returned undef to the caller. 

このエラーは、CNAMEタイプのrrオブジェクトでアドレスメソッドを呼び出そうとしていることを意味しています。私はタイプ 'A'のrrオブジェクトに対してのみアドレスメソッドを呼び出したい。上記のコードでは、タイプ 'A'のオブジェクトに対してアドレスを呼び出すことを確認するチェックはありません。私はこのコード行(1ない限り次)を加え、そしてそれが動作します:

my (@results); 
foreach my $rr ($packet->answer) { 
    next unless $rr->type eq "A"; 
    push (@results, $rr->address); 
} 

RRオブジェクトのタイプが「A」でない限り、このコード行は$packet->answerから得次のアドレスにスキップします。

関連する問題