Content

Perl脚本检测一个域名是否有效(perl 文件判断)太疯狂了

文章摘要

这篇文章介绍了一个使用 Perl 编写的脚本,用于检查域名的有效性以及主机的在线状态。脚本包含两个主要功能模块: 1. **`queryDomain` 函数**:通过 DNS 库(`Net::DNS`)从多个 DNS 服务器(如 8.8.8.8 和 114.114.114.114)尝试解析目标域名,返回解析结果或错误信息。如果解析成功,返回“OK”,否则返回错误信息。 2. **`pingHost` 函数**:通过网络库(`Net::Ping`)对目标主机进行 ping 测试。根据目标主机的协议类型(默认为 TCP/SYN),分别进行 TCP/SYN 测试(仅用于 Web 服务)或 ICMP 响应测试。函数返回“OK”或“DOWN”以表示测试结果。 脚本在命令行接受目标主机和协议类型作为参数,调用上述函数进行检查,并根据结果输出目标主机是否在线的提示信息。 文章的核心内容是通过简单易用的 Perl 脚本实现对域名和主机的有效性检查,适合自动化网络状态监控和故障排查。

 file: check.host.pl #!/usr/bin/perl use strict; use Net::Ping; use Net::DNS; use Time::HiRes qw(); $|=1; my $DEFAULT_TIMEOUT=2; my $PING_TIMEOUT=2; my $DNS_TIMEOUT=3; ### 查询域名是否有效 sub queryDomain { my $domain=shift(); my $query=”; my $dns=Net::DNS::Resolver->new( tcp_timeout=> $DNS_TIMEOUT, udp_timeout=> $DNS_TIMEOUT, retry=> 1 ); my @nameservers=qw/8.8.8.8 114.114.114.114/; $dns->nameservers(@nameservers); eval { $query=$dns->search($domain,’A’); }; if ($@ or ! $query) { my $err=$dns->errorstring ; print “ERR: query $domain failed: $errn”; return if ($err=~ /NXDOMAIN/); } return ‘OK’; } ### return nothing is FAILED, other is OK sub pingHost { my $arg=shift(); return 1 if (ref $arg ne ‘HASH’); my $p; eval { $p=Net::Ping->new($arg->{‘proto’},$DEFAULT_TIMEOUT,0) }; if ($@) { warn “ERR to create Net::Ping object: $@n”; return; } $p->hires(); my ($host,$duration,$hip,$rep,$ret); ### tcp/syn ping if ($arg->{‘proto’} eq “syn”) { $p->{port_num}=$arg->{‘port’}; $p->ping($arg->{‘host’},$PING_TIMEOUT); if (($host,$duration,$hip)=$p->ack()) { printf(“ACK Reply from $arg->{‘host’}[%s] time=%.2f msn”, $hip, $duration * 1000); $ret=’OK’; } else { warn “SYN Request for $arg->{‘host’} timed out.n”; } } ### icmp ping else { ($rep,$duration,$hip)=$p->ping($arg->{‘host’},$PING_TIMEOUT); if ($rep) { printf(“Echo Reply from $arg->{‘host’}[%s] time=%.2f msn”, $hip, $duration * 1000); $ret=’OK’; } else { warn “PING Request for $arg->{‘host’} timed out.n”; } } $p->close; undef($p); return $ret; } my $ARG={ proto=> ‘syn’, port=> 80 }; my $host=$ARGV[0]; my $proto=$ARGV[1]; die “Usage: $0 [icmp]n” if (! $host); $ARG->{‘host’}=$host; $ARG->{‘proto’}=$proto if ($proto); my $code; if (&queryDomain($host) eq ‘OK’ and $code=&pingHost($ARG)) { print “$host is online !n”; } else { print “$host is DOWN !n”; }