2010-02-17 17 views
7

Necesito generar una lista de direcciones IP (IPv4) en Perl. Tengo direcciones de inicio y final, por ejemplo 1.1.1.1 y 1.10.20.30. ¿Cómo puedo imprimir todas las direcciones entremedio?¿Cómo puedo generar un rango de direcciones IP en Perl?

+0

¿Por qué necesitarías tal cosa? – pavium

+2

Necesito automatizar algunas tareas de administración del sistema. Sí, con perl – planetp

+0

Bueno, se han hecho cosas extrañas con Perl. – pavium

Respuesta

4

Uso Net::IP 's función de bucle:

El operador + está sobrecargado con el fin de permitir el bucle si toda una gama de direcciones IP:

3

Todo está en cómo lo codifica. Esta es la forma más rápida que conozco.

my $start = 0x010101; # 1.1.1 
my $end = 0x0a141e; # 10.20.30 

for my $ip ($start..$end) { 
    my @ip = ($ip >> 16 & 0xff 
      , $ip >> 8 & 0xff 
      , $ip  & 0xff 
      ); 
    print join('.', 1, @ip), "\n"; 
} 
2

TMTOWTDI:

sub inc_ip { $_[0] = pack "N", 1 + unpack "N", $_[0] } 
my $start = 1.1.1.1; 
my $end = 1.10.20.30; 
for ($ip = $start; $ip le $end; inc_ip($ip)) { 
    printf "%vd\n", $ip; 
} 
+0

Para aquellos demasiado perezosos para googlearlo: "Hay más de una forma de hacerlo" –

+0

¿Este método evita que sus números excedan 255? lo siento, estoy teniendo dificultades para leerlo, no estoy familiarizado con desempaquetar y, por alguna razón, todos los motores de búsqueda en mi red parecen estar inactivos (no puedo acceder a Bing, Yahoo o Google, sin un orden en particular) – onaclov2000

+0

@ onaclov2000 http://p3rl.org/pack –

7

Use Net::IP. De la documentación de CPAN:

my $ip = new Net::IP ('195.45.6.7 - 195.45.6.19') || die; 
# Loop 
do { 
    print $ip->ip(), "\n"; 
} while (++$ip); 

Este enfoque es más flexible porque Net :: IP acepta la notación CIDR, p. 193.0.1/24 y también es compatible con IPv6.

Editar: si está trabajando específicamente con netblocks, puede investigar Net::Netmask.

+0

preferiría estas URL: http://search.cpan.org/perldoc/Net::IP y http://search.cpan.org/perldoc/Net::Netmask –

+0

@Sinan. Sentí que mi respuesta agregaba suficiente información adicional. para valer la pena publicar La pregunta contraria: ¿por qué no debería proporcionar información útil al OP? ¿Cómo hace daño a alguien? – rjh

0
# We can use below code to generate IP range 

use warnings; 
use strict; 
my $startIp = $ARGV[0]; 
my $endIp = $ARGV[1]; 
sub range { 
my (@ip,@newIp,$i,$newIp,$j,$k,$l,$fh); 
my ($j1,$k1,$l1); 
open($fh,">","ip.txt") or die "could not open the file $!"; 
@ip = split(/\./,$startIp); 
for($i=$ip[0];$i<=255;$i++) { 
    for($j=$ip[1];$j<=255;$j++) { 
    $ip[1]=0 if($j == 255); 
    for($k=$ip[2];$k<=255;$k++) { 
     $ip[2]=0 if($k == 255); 
     for($l=$ip[3];$l<=255;$l++) { 
      $ip[3]=0 if($l == 255); 
      @newIp = $newIp = join('.',$i,$j,$k,$l); 
      print $fh "$newIp \n"; 
      exit if ($newIp eq $endIp); 
     } 
     } 
    } 
    } 
} 
range ($startIp, $endIp); 
+0

¿Esto es para la jajaja de los bucles? Nunca for-loop tanto. – TheyDontHaveIT

Cuestiones relacionadas