我正在尝试编写一个显示各种服务器的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";
}
如果这可能是一个愚蠢的问题,我很抱歉,但有人能指出我在这里做错了吗?
提前致谢。
答案 0 :(得分:1)
可能不是您正在寻找的,但我目前正在做一些解析RAW whois数据库文件的工作(您可以从'complete / database'目录中的ftp://ftp.ripe.net/以完整的形式下载)
和我一样,我想过滤掉免责声明,但我有不同的需求,主要是我在将文件提供给数据库脚本并将其插入数据库之前对文件进行预处理。
无论如何,我使用以下命令行来预过滤纯文本数据库文件:
cat ripe.db.as-block | grep -v '^\s*#' | grep -v '^remarks:\s*\*'
我想从中可以看出,您可以将输出传输到perl脚本中,或者使用&gt;将其写入新文件。运算符,然后使用perl脚本处理该新文件。
这也可以在windows上使用来自sourceforge的GnuWin32工具集,它为你提供了windows兼容的命令行二进制文件,它们反映了他们的linux计数器部分,但你需要调整引号,主要来自'to'
作为剥离内容的一个例子:
此....
#
# 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',它本质上是说让每一行都为那些匹配模式的行传递EXCEPT,而不是它的正常调用,它是用于选择想要的行。
如果你有额外的标准想要在处理之前过滤掉,那么你需要做的就是使用管道字符将更多反向grep命令输送到最后。
答案 1 :(得分: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;
答案 2 :(得分:0)
use Net::Whois::Raw;
$Net::Whois::Raw::OMIT_MSG = 1;
my $domain_info = whois('perl.com');
这很有效。它剥离了Perl.com和Funet.fi - 在文档中用作示例的域。但是,正如文档所说,它不适用于所有领域。