1

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

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

我想走更有效(更短,更具体)的路线。

对此有经验法则吗?就像在管道中一样,系统命令/unix 实用程序的输出比使用 perl 模块效率更高/更低?或者不同的 perl 模块是否不同,并且只能通过设置这些检查的多次迭代并将其与执行 unix 实用程序的系统调用所花费的时间进行比较来检查相同的模块?

4

1 回答 1

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";
于 2013-08-14T06:57:51.023 回答