Perl Scripting – Rango de IPs a CIDR – IP Range to CIDR – range2cidr.pl
Posted in HelpDesk, Internet, Networking, Scripting, Sistemas, soporte, Utilidades on Jul 25th, 2011
Vía: ftp://ftp.ripe.net/ripe/stats/issued/range2cidr.pl
ref: Utilidad online para convertir rangos de IPs a formato CIDR: http://www.webboar.com/tools/ip2cidr/
He encontrado un estupendo script en Perl, para convertir un bloque o rango de IPs a su forma CIDR
Por ejemplo: El rango de IPs 192.168.0.0 – 192.168.255.255, en formato CIDR, seria: 192.168.0.0/16
Y el rango: 192.88.99.1 – 192.88.100.255, sería:
192.88.99.1/32
192.88.99.2/31
192.88.99.4/30
192.88.99.8/29
192.88.99.16/28
192.88.99.32/27
192.88.99.64/26
192.88.99.128/25
192.88.100.0/24
Uso en la shell:
usuario@maquina$ echo ‘192.88.99.1 – 192.88.100.255‘ | perl range2cidr.pl
El script range2cidr.pl, cortesía del site: ftp://ftp.ripe.net/ripe/stats/issued/range2cidr.pl
#! /usr/bin/perl -w
# vía ftp://ftp.ripe.net/ripe/stats/issued/range2cidr.pl
# Description: Take a list of ranges and convert to CIDR.
#
# Execution:
#
# perl range2cidr.pl
#
# Input format: list of ranges, one per line (other lines are ignored)
#
# Example:
#
# echo '10.0.0.1 - 10.16.255.253' | perl range2cidr.pl
# echo '192.88.99.1 - 192.88.100.255' | perl range2cidr.pl
# Details:
#
# Each range is converted to the minimal list of CIDR blocks.
use strict;
use English;
use IO::Socket;
# convert from IP to number
sub ip2num {
my ($ip) = @_;
return unpack("N", inet_aton($ip));
}
# convert from number to IP
sub num2ip {
my ($num) = @_;
return inet_ntoa(pack("N", $num));
}
# convert a range to prefixes
sub find_prefixes
{
my ($lo, $hi) = @_;
my @prefixes;
if (($lo == 0) && ($hi == 0xFFFFFFFF)) {
# 0.0.0.0/0 is a special-case, as the loop never exits for it
push(@prefixes, [ 0, 0 ]);
} else {
# extract the prefixes out one at a time
my $addr = $lo;
my $bit = 0;
my $mask = 0;
while ($addr <= $hi) {
$mask |= (1 << $bit);
if (($addr & $mask) || (($addr | $mask) > $hi)) {
push(@prefixes, [ $addr, (32 - $bit) ]);
$addr += (1 << $bit);
$bit = 0;
$mask = 0;
} else {
$bit++;
}
}
}
return @prefixes;
}
##
## main program begins here
##
while (<>) {
my ($lo, $hi);
if (/^\s*(\d+\.\d+\.\d+\.\d+)\s*-\s*(\d+\.\d+\.\d+\.\d+)\s*$/) {
($lo, $hi) = (ip2num($1), ip2num($2));
if (defined($lo) && defined($hi)) {
foreach my $prefix (find_prefixes($lo, $hi)) {
print num2ip($prefix->[0]), "/", $prefix->[1], "\n";
}
}
}
unless (defined($lo) && defined($hi)) {
print;
}
}



















Información Bitacoras.com…
Valora en Bitacoras.com: Nuevo post: Perl Scripting – Rango de IPs a CIDR – IP Range to CIDR – range2cidr.pl (http://wp.me/pLnOv-1Yn)1 minute ago via ftp://ftp.ripe.net/ripe/stats/issued……