【问题标题】:DNS checking using perl and Net::DNS使用 perl 和 Net::DNS 检查 DNS
【发布时间】:2023-03-10 10:04:01
【问题描述】:

因此,在otter book 中有一个小脚本(参见第 173 页),其目的是反复检查 DNS 服务器,以查看它们是否为给定的主机名返回相同的地址。但是,书中给出的解决方案仅在主机具有静态 IP 地址时才有效。如果我希望它与具有多个关联地址的主机一起使用,我将如何编写此脚本?

代码如下:

#!/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 );
}

【问题讨论】:

    标签: perl dns system-administration


    【解决方案1】:

    我遇到的问题是我在调用返回多个地址的主机名上的代码时遇到此错误,例如 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 对象上调用 address 方法。我只想在类型为“A”的 rr 对象上调用地址方法。在上面的代码中,我没有检查以确保我在“A”类型的对象上调用地址。我添加了这行代码(除非是下一个),它可以工作:

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

    这行代码跳到从$packet->answer 获得的下一个地址,除非 rr 对象的类型是“A”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多