2011-10-03 65 views
1

我想要一个小脚本来识别查询中的SNMP数据以将其存储在数据库中。但是,在使用Net::IP CPAN模块处理数据时,我卡住了。如果我定义了网络字符串没有问题,但是我将IP和掩码放在单独的字符串中,不管我如何加入它们,模块始终将网络掩码设置为/32为什么Net :: IP中的网络掩码错误?

我想它是这样的:

my $net = "${$query_snmp->{$tablekey}}{'ipRouteMask'}/${$query_snmp->{$tablekey}}{'ipRouteDest'}"; 
my $IP = new Net::IP ($net) or die (Net::IP::Error()); 

但所有的IP对象总是与/32创建不管我把掩码设置。如果我定义像192.168.0.0/20这样的字符串或任何相同的字符串,我觉得没有问题。

我错过了什么?

Network -> 192.168.65.64/255.255.255.248 

IP : 192.168.65.64 
LASTIP : 192.168.65.64 
Sho : 192.168.65.64 
Bin : 11000000101010000100000101000000 
Int : 3232252224 
*** Mask: 255.255.255.255 *** wtf ?? 
Last: 192.168.65.64 
Len : 32 
Size: 1 
Type: PRIVATE 
Rev: 64.65.168.192.in-addr.arpa. 

回答

4

manual:净:: IP对象可以从一个单一的IP地址来创建,或者从一个无阶级的前缀,...

我想你已经选择指定一个没有阶级的网络,只要你插入一个有效的网络说明符,它适用于我。

#!/usr/bin/perl -w  
use Net::IP; 
my $ip = new Net::IP('112.198.64.0/18') or die (Net::IP::Error()); 
print ("IP : ".$ip->ip()."\n"); 
print ("Sho : ".$ip->short()."\n"); 
print ("Bin : ".$ip->binip()."\n"); 
print ("Int : ".$ip->intip()."\n"); 
print ("Mask: ".$ip->mask()."\n"); 
print ("Last: ".$ip->last_ip()."\n"); 
print ("Len : ".$ip->prefixlen()."\n"); 
print ("Size: ".$ip->size()."\n"); 
print ("Type: ".$ip->iptype()."\n"); 
print ("Rev: ".$ip->reverse_ip()."\n"); 

将输出:

IP : 112.198.64.0 
Sho : 112.198.64 
Bin : 01110000110001100100000000000000 
Int : 1892040704 
Mask: 255.255.192.0 
Last: 112.198.127.255 
Len : 18 
Size: 16384 
Type: PUBLIC 
Rev: 64.198.112.in-addr.arpa. 

但是,如果你输入 “192.168.65.64/255.255.255.248”,这不是由Net :: IP接受的格式,你要改用“192.68.65.64/29”,见this table。在这种情况下,它会正常工作:

IP : 192.168.65.64 
Sho : 192.168.65.64 
Bin : 11000000101010000100000101000000 
Int : 3232252224 
Mask: 255.255.255.248 
Last: 192.168.65.71 
Len : 29 
Size: 8 
Type: PRIVATE 
Rev: 64.65.168.192.in-addr.arpa. 

当您使用的格式与全网络掩码,因为它不认可,它只是获取IP,并给你的255.255.255.255

0

感谢网络掩码你!我最终使用了一个simillar模块,它可以让请求者将ip掩码转换为十进制符号。

网::子网掩码 - >https://metacpan.org/pod/Net::Netmask

构建

Net::Netmask objects are created with an IP address and optionally a mask. There are  many forms that are recognized: 

'216.240.32.0/24' The preferred form. 

'216.240.32.0:255.255.255.0' 
'216.240.32.0-255.255.255.0' 
'216.240.32.0', '255.255.255.0' 
'216.240.32.0', '0xffffff00' 
'216.240.32.0 - 216.240.32.255' 
'216.240.32.4' 
A /32 block. 

'216.240.32' 
Always a /24 block. 

'216.240' 
Always a /16 block. 

'140' 
Always a /8 block. 

'216.240.32/24' 
'216.240/16' 
'default' or 'any' 
0.0.0.0/0 (the default route) 
'216.240.32.0#0.0.31.255' 

谢谢。