2010-02-17 8 views
7

Potrzebuję wygenerować listę adresów IP (IPv4) w Perlu. Mam adresy początkowy i końcowy, na przykład 1.1.1.1 i 1.10.20.30. Jak mogę wydrukować wszystkie adresy między nimi?Jak mogę wygenerować zakres adresów IP w Perlu?

+0

Dlaczego potrzebujesz czegoś takiego? – pavium

+2

Potrzebuję zautomatyzować niektóre zadania administracyjne systemu. Tak, z perl – planetp

+0

Cóż, dziwniejsze rzeczy zostały zrobione z Perlem. – pavium

Odpowiedz

4

Zastosowanie Net::IP „s zapętlenie cecha:

Operator + jest przeciążone w celu umożliwienia zapętlenie choć cały zakres adresów IP:

3

Wszystko to w jaki sposób to kodujesz. To najszybszy sposób, jaki znam.

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

Dla tych zbyt leniwych, aby google to - "Tam jest więcej niż jeden sposób to zrobić" –

+0

Czy ta metoda zapobiega przekroczeniu 255 liczb? przepraszam, że trudno mi go czytać, nie jestem zaznajomiony z rozpakowywaniem iz jakiegoś powodu wszystkie wyszukiwarki w moim netwoku wydają się być wyłączone (nie mogą dostać się do bing, yahoo lub google, w żadnej konkretnej kolejności) – onaclov2000

+0

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

7

Użyj Net::IP. Z dokumentacji CPAN:

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

Takie podejście jest bardziej elastyczne, ponieważ Net :: IP akceptuje notację CIDR, np. 193.0.1/24, a także obsługuje IPv6.

Edycja: jeśli pracujesz z blokami prostymi, możesz sprawdzić Net::Netmask.

+0

I wolałby te adresy URL: http://search.cpan.org/perldoc/Net::IP i http://search.cpan.org/perldoc/Net::NetMask –

+0

@Sanan Czułem, że moja odpowiedź zawiera wystarczająco dużo dodatkowych informacji być wartym opublikowania. Kwestionariusz: dlaczego - nie powinienem - udzielam PO przydatnych informacji? Jak to krzywdzi kogokolwiek? – 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

Czy to jest dla pętli? Nigdy nie przepuszczaj za dużo. – TheyDontHaveIT

Powiązane problemy