2010-02-17 14 views
7

Devo generare un elenco di indirizzi IP (IPv4) in Perl. Ho gli indirizzi iniziali e finali, ad esempio 1.1.1.1 e 1.10.20.30. Come posso stampare tutti gli indirizzi tra loro?Come posso generare un intervallo di indirizzi IP in Perl?

+0

Perché avresti bisogno di una cosa del genere? – pavium

+2

Ho bisogno di automatizzare alcune attività di amministrazione del sistema. Sì, con perl – planetp

+0

Bene, cose strane sono state fatte con Perl. – pavium

risposta

4

Usa Net::IP s' caratteristica looping:

L'operatore + è sovraccarico al fine di consentire il ciclo anche se tutta una serie di indirizzi IP:

3

È tutto nella modalità di codifica. Questo è il modo più veloce che conosco.

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

Per quelli troppo pigri per google - "C'è più di un modo per farlo" –

+0

Questo metodo impedisce ai tuoi numeri di superare i 255? scusa sto facendo fatica a leggerlo, non ho familiarità con lo spacchettamento e beh per qualche motivo tutti i motori di ricerca sul mio netwok sembrano essere bassi (non riesco a raggiungere bing, yahoo o google, in nessun ordine particolare) – onaclov2000

+0

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

7

Utilizzare Net::IP. Dalla documentazione CPAN:

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

Questo approccio è più flessibile perché Net :: IP accetta la notazione CIDR, ad es. 193.0.1/24 e supporta anche IPv6.

Modifica: se si sta utilizzando specificamente netblocks, è possibile esaminare Net::Netmask.

+0

I preferirei questi URL: http://search.cpan.org/perldoc/Net::IP e http://search.cpan.org/perldoc/Net::Netmask –

+0

@Sinan Ho sentito che la mia risposta ha aggiunto abbastanza informazioni aggiuntive vale la pena postare. La domanda contraria: perché non dovrei fornire informazioni utili all'OP? Come fa a nuocere a qualcuno? – 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

Questo è per il lol di loop? Mai fare un ciclo così tanto. – TheyDontHaveIT

Problemi correlati