【问题标题】:perl - Net::Whois::Raw not stripping whois disclaimersperl - Net::Whois::Raw 不剥离 whois 免责声明
【发布时间】:2013-05-06 07:32:35
【问题描述】:

我正在尝试编写一个显示各种服务器的 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";
}

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

提前致谢。

【问题讨论】:

  • “不工作”是什么意思?
  • 你从哪里得到use Net::Whois::Raw qw(whois $OMIT_MSG $CHECK_FAIL $USE_CNAMES);?!在docs 中没有任何类似的东西。
  • “不工作”我的意思是免责声明没有被剥夺。 $OMIT_MSG 在这里:search.cpan.org/~corris/Net-Whois-Raw-0.23/lib/Net/Whois/Raw.pm
  • 我必须承认我以前没有见过 perl 模块失败,如果你需要在你的脚本中添加任何东西,那么在你的外部 for 循环中你可能想要把一些正则表达式过滤不需要的行,这表示我非常相信将 unix 工具串在一起(就像设计一样)“请参阅下面的答案”,如果我很想将“whois”的输出提供给 grep,然后进入你的 perlscript 进行显示。
  • 附带说明一下,看看 Net::DRI(我是它的开发者),它采用了不同的方法,但其中一部分让您可以访问作为 Perl 对象的 whois 数据。它当然需要针对一堆新 gTLD 进行更新。

标签: perl whois


【解决方案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 命令通过管道传输到末尾。

【讨论】:

    【解决方案2】:

    我可能完全错了,因为我不经常使用 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;
    

    【讨论】:

      【解决方案3】:
      use Net::Whois::Raw;
      $Net::Whois::Raw::OMIT_MSG = 1;
      my $domain_info = whois('perl.com');
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-05-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多