0

我正在尝试编写一个显示各种服务器的 whois 信息的 Perl 脚本。然而,whois 服务器会在回复中返回所有类型的免责声明和其他文本。Net::Whois::Raw 确实可以选择去除这些免责声明,但我无法让它发挥作用。

这是我的尝试方法:

#!/usr/bin/perl
use strict;
use warnings;

my $OMIT_MSG = 2;
my $CHECK_FAIL = 2;
my $USE_CNAMES = 1;

use Net::Whois::Raw qw(whois $OMIT_MSG $CHECK_FAIL $USE_CNAMES);

die "Incorrect arguments\n" unless (@ARGV);

for (my $i = 0; $i < @ARGV; $i++)
{
    print "\nWhois info : " . $ARGV[$i] . "\n\n\n";

    eval
    {
        my $whoisinfo = whois($ARGV[$i]);
        print $whoisinfo;
    };
    if ($@)
    {
        print "Error while retrieving whois details.";
    }
    print "\n";
}

如果这可能是一个愚蠢的问题,我很抱歉,但谁能指出我在这里做错了什么?

提前致谢。

4

3 回答 3

1

可能不是你要找的东西,但我目前正在做一些工作来解析 RAW whois 数据库文件(你可以从'ripe/database 中的ftp://ftp.ripe.net/下载它们的完整形式' 目录)

像你一样,我想过滤掉免责声明,但我有不同的需求,主要是我在将文件提供给要插入数据库的数据库脚本之前对文件进行预处理。

无论如何,我使用以下命令行来预过滤纯文本数据库文件:

cat ripe.db.as-block | grep -v '^\s*#' | grep -v '^remarks:\s*\*'

我想从那以后,您可以将输出通过管道传输到您的 perl 脚本中,或者使用 > 运算符将其写入新文件,然后使用您的 perl 脚本处理该新文件。

这也适用于使用 sourceforge 的 GnuWin32 工具集的 Windows,它为您提供与 Windows 兼容的命令行二进制文件,这些二进制文件反映了它们的 linux 对应部分,但您需要调整引号,主要是从 ' 到 "

作为它剥离的一个例子:

这个....

#
# The contents of this file are subject to
# RIPE Database Terms and Conditions
#
# http://www.ripe.net/db/support/db-terms-conditions.pdf
#

as-block:       AS1877 - AS1901
descr:          RIPE NCC ASN block
remarks:        These AS Numbers are further assigned to network
remarks:        operators in the RIPE NCC service region. AS
remarks:        assignment policy is documented in:
remarks:        <http://www.ripe.net/ripe/docs/asn-assignment.html>
remarks:        RIPE NCC members can request AS Numbers using the
remarks:        form available in the LIR Portal or at:
remarks:        <http://www.ripe.net/ripe/docs/asnrequestform.html>
org:            ORG-NCC1-RIPE
admin-c:        DUMY-RIPE
tech-c:         DUMY-RIPE
mnt-by:         RIPE-DBM-MNT
mnt-lower:      RIPE-NCC-HM-MNT
changed:        unread@ripe.net 20000101
source:         RIPE
remarks:        ****************************
remarks:        * THIS OBJECT IS MODIFIED
remarks:        * Please note that all data that is generally regarded as personal
remarks:        * data has been removed from this object.
remarks:        * To view the original object, please query the RIPE Database at:
remarks:        * http://www.ripe.net/whois
remarks:        ****************************

结局是这样的:

as-block:       AS1877 - AS1901
descr:          RIPE NCC ASN block
remarks:        These AS Numbers are further assigned to network
remarks:        operators in the RIPE NCC service region. AS
remarks:        assignment policy is documented in:
remarks:        <http://www.ripe.net/ripe/docs/asn-assignment.html>
remarks:        RIPE NCC members can request AS Numbers using the
remarks:        form available in the LIR Portal or at:
remarks:        <http://www.ripe.net/ripe/docs/asnrequestform.html>
org:            ORG-NCC1-RIPE
admin-c:        DUMY-RIPE
tech-c:         DUMY-RIPE
mnt-by:         RIPE-DBM-MNT
mnt-lower:      RIPE-NCC-HM-MNT
changed:        unread@ripe.net 20000101
source:         RIPE

过滤的技巧是使用反向 grep,即命令行中的“-v”,它本质上说的是让每一行都通过除了那些匹配模式的行,而不是正常调用,它用于选择想要的线条。

如果您有额外的标准要在处理之前过滤掉,那么您需要做的就是使用管道字符将更多反向 grep 命令传递到末尾。

于 2013-05-29T18:22:36.737 回答
1

我可能完全错了,因为我不经常使用 Perl,也不太了解 的机制use,但是由于$OMIT_MSGS是从模块中导出的,我原以为你不想预先声明它my,您想在模块加载(但在进行任何函数调用之前)分配给它:

use Net::Whois::Raw qw(whois $OMIT_MSG $CHECK_FAIL $USE_CNAMES);

$OMIT_MSG = 2;
$CHECK_FAIL = 2;
$USE_CNAMES = 1;
于 2013-05-29T18:39:13.793 回答
0
use Net::Whois::Raw;
$Net::Whois::Raw::OMIT_MSG = 1;
my $domain_info = whois('perl.com');

这行得通。它去除了 Perl.com 和 Funet.fi - 在文档中用作示例的域。但是,正如文档所说,它不适用于所有域。

于 2014-06-09T22:34:14.497 回答