脚本功能:通过ICMP Ping或TCP/SYN探测指定的域名,探测前检测域名是否有效。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
|
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" ;
}
|
测试例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
# ./check.host.pl 2013.jb51.net
ERR: query 2013.jb51.net failed: NXDOMAIN
2013.jb51.net is DOWN !
# ./check.host.pl www.zzvips.com
ACK Reply from www.zzvips.com[173.255.214.254] time =307.04 ms
www.zzvips.com is online !
# ./check.host.pl jb51.net icmp
Echo Reply from jb51.net[173.255.214.254] time =205.61 ms
jb51.net is online !
# ./check.host.pl chinagfw.com icmp
PING Request for chinagfw.com timed out.
chinagfw.com is DOWN !
|