如何检查检查端口状态的方法更有效?

时间:2013-08-14 02:15:48

标签: perl unix tcp port perl-module

我正在编写脚本来安排我的某些服务器上的端口检查,并报告状态。我计划选择以下两个选项之一:

  1. 将netcat(nc)的输出传递给perl变量,并检查返回状态

    my $rcode=`nc -z 6.6.6.6 80; echo $?`
    
  2. 使用perl模块IO :: Socket :: PortState做同样的事情。

    use IO::Socket::PortState qw(check_ports);
    my %porthash = ( ... );
    check_ports($host,$timeout,\%porthash);
    print "$proto $_ is not open ($porthash{$proto}->{$_}->{name})
        if !$porthash{$proto}->{$_}->{open};    
    
  3. 我想要更高效(更短时间,更具体)的路线。

    这有关于此的经验法则吗?在管道中,系统命令/ unix实用程序的输出比使用perl模块更有效/更低效?或者不同的perl模块是不同的,只能通过设置这些检查的多次迭代来检查它们,并比较这与执行unix实用程序的系统调用所花费的时间?

1 个答案:

答案 0 :(得分:3)

这不是一个问题的答案,而是建议的实施。

快速运行一个未经测试的使用Socket.pm的例子。

这可能是最快的perl实现。但是在你使用socket.pm的时候你也可以用socket.h在C语言中编写它。它们是接近1:1的映射。

价:

#!/usr/bin/perl -w

use Socket;

$remote  = $ARGV[0];
$port    = $ARGV[1];

print ":: Attempting to connect to - $remote.\n";
$iaddr = inet_aton($remote) or die "Error: $!";
$paddr = sockaddr_in($port, $iaddr) or die "Error: $!";
$proto = getprotobyname('tcp') or die "Error: $!";

socket(SOCK, PF_INET, SOCK_STREAM, $proto) or die "Error: $!";
connect(SOCK, $paddr) or die "Error: $!";

print ":: Connected Successfully!\n";