AD

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

这篇文章主要介绍了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 ([email protected] 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 ([email protected]) {
    warn "ERR to create Net::Ping object: [email protected]";
    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**
ERR: query 2013.jb51** failed: NXDOMAIN
2013.jb51** is DOWN !

# ./check.host.pl **jb51**
ACK Reply from **jb51**[173.255.214.254] time=307.04 ms
**jb51** is online !

# ./check.host.pl jb51** icmp
Echo Reply from jb51**[173.255.214.254] time=205.61 ms
jb51** is online !

# ./check.host.pl chinagfw** icmp
PING Request for chinagfw** timed out.
chinagfw** is DOWN !
标签: perl, 脚本, 域名
分类: perl
时间: 2014-09-08

相关文章

  1. perl实现检测服务器中的服务是否正常脚本分享

    这篇文章主要介绍了perl实现检测服务器中的服务是否正常脚本分享,本文脚本用于检测Linux服务器的服务是否正常,需要的朋友可以参考下 程序调用远端服务,为了确保可用性最好在使用前进行健康检测,将异常的服务排除. #!/ ...
  2. perl ping检测功能脚本代码

    领导有任务,给一批IP列表,ping每一台机器,如果没有响应就发邮件通知,通知的邮件需要分开,不能通知一个列表,得一封一封的通知 我的第一个用于生产环境的perl脚本,虽然不是很优秀,但也迈出了扎实的一步 :) 领导有任 ...
  3. Perl脚本实现检测主机心跳信号功能

    这篇文章主要介绍了Perl脚本实现检测主机心跳信号功能,本文代码也可作为perl串口通信的实例,需要的朋友可以参考下 使用串口通信,在备机端使用如下脚本检测来自主机的心跳信号,一旦未接受次数超过指定记数,备机认为主机DO ...
  4. Perl脚本实现递归遍历目录下的文件

    这篇文章主要介绍了Perl脚本实现递归遍历目录下的文件,本文直接给出实现代码,代码中包含明细注释,需要的朋友可以参考下 #!/usr/bin/perl -w use strict; use File::Spec; loc ...
  5. fdupe 查找重复文件的Perl脚本代码

    fdupe 是一个很小的 Perl 脚本,用来检索指定目录并找出其中重复的文件,该脚本是通过文件内容来识别是否重复文件,而非文件名.fdupe 无需其他 Perl 脚本支持,运行速度非常快 图: #!/usr/bin/p ...
  6. Perl脚本的调试方法

    Q&A 什么是ActivePerl? ActivePerl是Perl语言的Windows版本,Perl是一种很自由而且功能很强大的编程语言,主要被用作 Web 编程.数据库处理.XML 处理以及系统管理,而且Pe ...
  7. Shell脚本遍历一个日期范围实例

    这篇文章主要介绍了Shell脚本遍历一个日期范围实例,本文直接给出实现代码,需要的朋友可以参考下 如果跟shell脚本打交道,遍历一个时间范围是很常见的事情,那么今天就跟大家分享一下: #!/usr/bin/env ba ...
  8. perl写的一个随机编故事的程序(rand随机函数)

    用perl写的一个随机编故事的程序,用到了rand随机函数,注释也很详细,需要的朋友可以参考下 #!/bin/perl use strict; use warnings; #定义变量 my $count; my $inp ...
  9. php中用于检测一个地理IP地址是否可用的代码

    php中用于检测一个地理IP地址是否可用的代码,需要的朋友可以参考下 /******************************************** * * 函数名:curl_string ($url,$pr ...
  10. 检测一个函数是否是JavaScript原生函数的小技巧

    这篇文章主要介绍了检测一个函数是否是JavaScript原生函数的小技巧,本文给出了两种检测方法,需要的朋友可以参考下 在我的开发工作中经常会遇到需要判断一个函数是否是JavaScript原生函数的情况,有时候这是一个很 ...
  11. php判断检测一个数组里有没有重复的值

    php判断检测一个数组里有没有重复的值 php里有一个处理数组重复值得函数array_unique,我们的思路就是用这个函数来实现的. if (count($array) != count(array_unique($a ...
  12. perl脚本学习指南--读书笔记

    最近在实习,看着公司有些脚本是perl写,久闻perl处理文本还是很强大的,趁着周末扫了一般这本书~记录下了~ undef 默认未定义字符,perl里面没有NULL,defined($x)函数:如果参数为undef返回f ...
  13. Linux操作系统下安装Perl脚本语言的方法

    Linux和perl都属于自由软件,将二者结合真是妙不可言. 遵循以下步骤一般就可安装好 perl ,perl 就能在 linux 下欢唱. 1 取得最新版本的 perl,当前版本为 5.6.0,即 stable.tar ...
  14. 一个域名引发的SNS血战 千橡版开心网正式上线!

    千橡集团与开心网的"域名门"事件再一次升温,在昨天晚些时候,千橡低调发布了该集团首个特别针对白领的垂直SNS社区--Kaixin.com. 在昨天晚些时候,千橡互动集团正式启动了旗下首款特别针对白领人 ...
  15. VBS脚本:检测计算机各硬件信息

    以前一直下载一个鲁大师去查看电脑的硬件环境信息.后来要查看的电脑多了,感觉每查看一台电脑的信息都下载一个鲁大师很不方便,所以我就写了下面这个脚本(Rhea),在Windows环境下直接运行即可将硬件信息打印到指定的txt ...
  16. PERL脚本 学习笔记

    下面主要是在学习过程中的一些常见的问题.记录下,方便大家学习. 1. chomp无参数时,使用默认参数,将对$_操作. 2. 数组@array..可用$array[number]引用.$#array..表示数组中索引数. ...
  17. JavaScript小技巧:如何检测一个函数是否是JavaScript原生函数

    在我的开发工作中经常会遇到需要判断一个函数是否是JavaScript原生函数的情况,有时候这是一个很必要的工作,你需要知道这个函数是浏览器自身提供的,还是由第三方封装.伪装成原生函数.当然,最好的方法是考察执行这个函数的 ...
  18. 今天转移了一个域名到GoDaddy

    早就说要把名下的几个域名转移到Godaddy,但是却一直没有实施,一是麻烦,二是忙,三是注册商好几个.注册商有万网.易名.商务中国的下级注册商还有两个小的注册商.像二级注册商那里更麻烦,曾经咨询过,说要把资料寄给他们,然 ...
  19. 检测一个图片是否是真实图片

    主要是判断,图片上传后的操作,判断是否真的是图片 代码: try { HttpPostedFile postfile = Request.Files["file"]; string savepath ...