脚本功能:通过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 ! |