虚拟主机在更换IP时需要对域名做解析,前提是区分哪些域名属于自己的DNS。
下面用perl来实现对域名的ns记录查询。
通过实际检验效果很好,
1500个域名全部查询完成需要40分钟左右。
程序功能:
1.对列表中的域名,做ns记录查询。
2.判断ns是否属于制定的DNS。
3.保存查询结果和错误记录。
复制内容到剪贴板
代码:
#!/usr/bin/perl
######################################################
# QueryDomainNS.pl
#
# 查询域名的NS记录,是否属于xxDNS;
#
# zack@wuhuren.com
#
# builddate 2007-7-26
#
##############################################
#
# 需要下载如下两个模块
# http://search.cpan.org/CPAN/authors/id/M/MA/MANU/Net-IP-1.25.tar.gz
# http://www.net-dns.org/download/Net-DNS-0.60.tar.gz
#
# INSTALL: perl Makefile.PL && make && make install
#
use strict;
use Net:NS;
my $res = Net:NS::Resolver->new;
if ( @ARGV != 1 ) {
print "Usage:$0 /full_path/filename\n";
exit(1);
}elsif(! -e "$ARGV[0]" ){
print "$ARGV[0] no found!\n";
exit(1);
}
my $file = $ARGV[0];
`true > $file.QueryResult `;
`true > $file.QueryErrLog `;
`date >> $file.QueryResult `; #写入开始时间
open (FH,$file) || die ("open $file failed!\n");
while (my $domain = <FH> ) {
chomp $domain;
my @ns = '';
my $query = $res->query($domain,"NS");
my $rr;
if ($query) {
foreach $rr ( grep { $_->type eq 'NS'} $query->answer ) {
push(@ns,$rr->nsdname);
}
}else{
QueryErrLog($domain,$res->errorstring);
}
if ( @ns[1] =~ /dns1.wuhuren.com/ && @ns[2] =~ /dns2.wuhuren.com/ ) {
QueryResult($domain,"YES",@ns[1],@ns[2]);
}else{
QueryResult($domain,"NO",@ns[1],@ns[2]);
}
}
close(FH);
`date >> $file.QueryResult`; #写入结束时间
# 保存查询失败结果
sub QueryErrLog {
open( FDEF, ">>$file.QueryErrLog" ) || die "$!\n";
flock( FDEF, 2 );
print FDEF "$_[0]\tquery failed:$_[1]\n";
close( FDEF );
}
# 保存查询正确结果
sub QueryResult {
open( FDRES, ">>$file.QueryResult" ) || die "$!\n";
flock( FDRES, 2 );
print FDRES "$_[0]\t$_[1]\t$_[2]\t$_[3]\n";
close( FDRES );
}
# lastupdate 2007-7-26