2010-02-17 2 views
7

Ich muss eine Liste von IP-Adressen (IPv4) in Perl generieren. Ich habe Start- und Endadressen, zum Beispiel 1.1.1.1 und 1.10.20.30. Wie kann ich alle Adressen dazwischen drucken?Wie kann ich eine Reihe von IP-Adressen in Perl generieren?

+0

Warum brauchen Sie so etwas? – pavium

+2

Ich muss einige Systemadministrationsaufgaben automatisieren. Ja, mit Perl – planetp

+0

Nun, Fremde Dinge sind mit Perl gemacht worden. – pavium

Antwort

4

Verwenden Net::IP ‚s Looping Funktion:

Der + Operator ist, um überladene Looping zu ermöglichen, obwohl eine ganze Reihe von IP-Adressen:

3

Es ist alles in, wie Sie es codieren. Das ist der schnellste Weg, den ich kenne.

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

Für diejenigen, die zu faul sind, um es zu googeln - "Es gibt mehr als eine Möglichkeit, es zu tun" –

+0

Verhindert diese Methode, dass Ihre Zahlen 255 überschreiten? Entschuldigung ich habe eine harte Zeit es zu lesen, ich bin nicht vertraut mit dem Auspacken und gut aus irgendeinem Grund scheinen alle Suchmaschinen auf meinem Netwok zu sein (kann nicht zu Bing, Yahoo oder Google, in keiner bestimmten Reihenfolge – onaclov2000

+0

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

7

Verwenden Sie Net::IP. Aus der CPAN-Dokumentation:

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

Dieser Ansatz ist flexibler, da Net :: IP CIDR-Notation akzeptiert, z. 193.0.1/24 und unterstützt auch IPv6.

Edit: Wenn Sie speziell mit netblocks arbeiten, könnten Sie Net::Netmask untersuchen.

+0

I würde diese URLs bevorzugen: http://search.cpan.org/perldoc/Net::IP und http://search.cpan.org/perldoc/Net::Netmask –

+0

@Sinan Ich fühlte, dass meine Antwort genug zusätzliche Informationen hinzugefügt lohnt sich zu posten. Die Gegenfrage: Warum - sollte ich nicht - Ich gebe dem OP hilfreiche Informationen? Wie schadet es jemandem? – 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

Ist das für die lol of loops? Nie so viel for-Schleife. – TheyDontHaveIT

Verwandte Themen