使用perl和Net::DNS进行DNS检查
因此,在中,有一个小脚本(参见第173页),其目的是迭代检查DNS服务器,查看它们是否返回给定主机名的相同地址。然而,书中给出的解决方案仅在主机具有静态IP地址时有效。如果我想让它与具有多个关联地址的主机一起工作,我将如何编写此脚本 代码如下:使用perl和Net::DNS进行DNS检查,perl,dns,system-administration,Perl,Dns,System Administration,因此,在中,有一个小脚本(参见第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.22
#!/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 );
}
我遇到的问题是,在返回多个地址的主机名上调用代码时出现了此错误,例如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对象上调用address方法。在上面的代码中,我没有检查以确保我正在调用类型为“A”的对象上的地址。我添加了这行代码(下一行除外),它可以工作:
my (@results);
foreach my $rr ( $packet->answer ) {
next unless $rr->type eq "A";
push ( @results, $rr->address );
}
除非rr对象的类型是“A”,否则这行代码将跳到从$packet->answer>获取的下一个地址