Perl脚本检测一个域名是否有效

脚本功能:通过ICMP Ping或TCP/SYN探测指定的域名,探测前检测域名是否有效。

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";
}

测试例子:

# ./check.host.pl 2013.jb51.net
ERR: query 2013.jb51.net failed: NXDOMAIN
2013.jb51.net is DOWN !

# ./check.host.pl www.jb51.net
ACK Reply from www.jb51.net[173.255.214.254] time=307.04 ms
www.jb51.net 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 !
(0)

相关推荐

  • Perl脚本检测一个域名是否有效

    脚本功能:通过ICMP Ping或TCP/SYN探测指定的域名,探测前检测域名是否有效. 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 {

  • perl ping检测功能脚本代码

    我的第一个用于生产环境的perl脚本,虽然不是很优秀,但也迈出了扎实的一步 :)领导有任务,给一批IP列表,ping每一台机器,如果没有响应就发邮件通知,通知的邮件需要分开,不能通知一个列表,得一封一封的通知.用到email::send模块,因为需要用到Gmail 复制代码 代码如下: #!/usr/bin/perl use warnings; use strict; use Email::Send; use Email::Send::Gmail; use Email::Simple::Crea

  • Perl脚本实现检测主机心跳信号功能

    使用串口通信,在备机端使用如下脚本检测来自主机的心跳信号,一旦未接受次数超过指定记数,备机认为主机DOWN机,自动设置为主机的网络参数,顶替主机提供服务. # ! perl -w use strict; use Win32 :: SerialPort; my $port = ' COM2 ' ; # serail port name registried in OS my $count = 0 ; # count number of heartbeat-receiving failture my

  • perl脚本实现限制ssh最大登录次数(支持白名单)

    ssh limit perl脚本主要作用: 1.限制一个ssh用户的最大登录数为n,n可自定义. 2.支持白名单,如root.test登录不受限制. 如果一个ssh用户的最大登录数超过指定数字,则后登录的会把先前登录的踢掉,以此达到控制登录数的目的. 该脚本需要主机支持perl,如果没有,可yum安装. 脚本源码: #!/usr/bin/perl -w use strict; #white list my @ALLOW_USERS = qw{ test root lulu1 }; #the ma

  • FTP自动上传文件的perl脚本以及配置文件

    本应用程序设计的几个基本理念是:工具箱再利用:尽可能利用已有的工具:简化运行步骤:不引入过多的业务逻辑,满足的需求越简单越好. 所以,我们定义了本应用程序依赖于以下几个工具的运行:ActivePerl-5.8.4.810-MSWin32-x86Upload.plUpload.config 我们将主要的执行逻辑都放在Perl源文件Upload.pl中了,配置文件为Upload.config. 这个perl文件将执行的任务是, 按照指定的文件夹目录,自动将该文件夹下的所有文件上传到指定ftp站点的指

  • 详解负载均衡实现一个域名对应多个IP地址

    详解负载均衡实现一个域名对应多个IP地址 使用负载均衡实现,传统和常规做法,其他方式需要特殊处理.(dns轮询,或者自己做解析) 1.一个域名设定多个dns服务或者服务器进行解析,同一个域名的每个解析都指向不同的ip地址,这样应答快的dns优先进行解析,这样就能保证最快定向到指定的网站空间去.如果空间也存在不同地点的相同内容镜像,那么这种方式最适合,例如sohu全国都有服务器,就是这么干的,除非你指定要访问某个地方的服务器,否则默认转向最快的空间,因为内容是镜像自动同步的,内容上不存在差别,用户

  • PHP检测一个数组有没有定义的方法步骤

    php中定义数组的方法: 1.PHP定义数组的格式: 数组名=array(); 如:$aa=array();//这样就定义了一个数组, 之后给元素赋值: $aa[0]="9016"; $aa[1]="9017"; $aa[2]="9018"; 2.PHP输出数组的方法: foreach($aa as $val) { echo$val; } 也可以在定义数组时直接赋值 $aa=array(0=>"9016",1=>&

  • python 2.7 检测一个网页是否能正常访问的方法

    如下所示: #!/bin/env python #coding:utf-8 import requests import sys url = "https://mp.csdn.net/" r = requests.get(url, timeout=5) code = r.status_code if code == 200:  print "OK 网站访问正常" sys.exit(0) else: print "Error 不能访问!" sys.

  • Nginx一个域名访问多个项目的方法实例

    背景介绍 最近在个人的多个项目部署中遇到这样一个问题,一个域名如何实现多个项目的访问.因为不想自己单独去申请域名证书和域名配置,便想到了这个方案,结合Nginx的location功能实现了自己的需求,便记录下来.示例中是以PHP的项目演示,其他的语言类似同样的方式进行部署.例如node的项目,可以在location中做一个验证,然后使用porxy_pass反向代理模块实现. location模块的匹配介绍 1."="前缀指令匹配,如果匹配成功,则停止其他匹配. 2.普通字符串指令匹配,

  • JS hasOwnProperty()方法检测一个属性是否是对象的自有属性的方法

    JavaScript hasOwnProperty() 方法是 Object 的原型方法(也称实例方法),它定义在 Object.prototype 对象之上,所有 Object 的实例对象都会继承 hasOwnProperty() 方法. hasOwnProperty() 方法用来检测一个属性是否是对象的自有属性,而不是从原型链继承的.如果该属性是自有属性,那么返回 true,否则返回 false.换句话说,hasOwnProperty() 方法不会检测对象的原型链,只会检测当前对象本身,只有

随机推荐