Blog de Javier Castañón – JavCastaPosts RSS Comments RSS


Nuevo post: Perl Scripting - Rango de IPs a CIDR - IP Range to CIDR - range2cidr.pl (http://wp.me/pLnOv-1Yn)
@javcasta
Javier Castañón


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$ echo192.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;
    }
}

Share
Clika en el altavoz para oir el postAltavoz


One Response to “Perl Scripting – Rango de IPs a CIDR – IP Range to CIDR – range2cidr.pl”

  1. on 26 Jul 2011 at 19:29Bitacoras.com

    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……

Leave a Reply

Los enlaces en los comentarios pueden encontrarse libres de nofollow.

?>