2014-01-14 72 views
1

我們的系統中有一個perl腳本,用於驗證我們組的IP地址。這是由以前的開發人員開發的,我不熟悉perl。我們有一組IP地址,它們在執行操作之前進行了硬編碼並進行了檢查。這裏是代碼片段(例如)perl中的IP地址條件語句

unless ($remoteip eq "some ip" || $remoteip eq "some IP" || $remoteip eq "xx.xx.xx.xx") 

現在我想補充這是在範圍內我不想其他50 IP地址(xx.xx.xx.145到xx.xx.xx.204) 在中逐一添加它們中的每一個,除非聲明因爲這將是漫長的並且不適合編程(我認爲)。有什麼辦法可以添加少於或減少IP地址的聲明?類似於除非($ remoteip < =「xx.xx.xx.204」AND $ remoteip> =「xx.xx.xx.145」)。

謝謝。

+1

不要以爲這是* *相當重複的,但你有沒有見過這個這個問題呢? [如何在Perl中生成一系列IP地址?](http://stackoverflow.com/questions/2279756/how-can-i-generate-a-range-of-ip-addresses-in-perl) – ThisSuitIsBlackNot

+1

你的問題可以改爲「地址是一個有效的IP地址,並從這三個八位字節開始,最後一個八位字節大於或等於x且小於或等於y」。正如他們所說的那樣,實現這是一個簡單的編程問題。 (一旦你想跨越一個/ 24的邊界,事情會變得更有趣。) – tripleee

回答

2

將四元組轉換爲整數,然後設置。有CPAN上一些模塊,將你做它,但它歸結爲這樣的事

sub ip2dec ($) { 
    unpack N => pack CCCC => split /\./ => shift; 
} 

if (ip2dec($remoteip) <= ip2dec('xx.xx.xx.204') && ip2dec($remoteip) >= ip2dec('xx.xx.xx.145')) { 
    # do something 
} 
+1

感謝這工作!我必須根據我的代碼做一些調整,但最終得到它。 –

0

您可以使用插座模塊與INET_ATON方法和祕密的範圍爲通過一個數組和grep。

use v5.16; 
use strict; 
use warnings; 
use Socket qw/inet_aton/; 
#using 10.210.14 as the first three octects 
#convert range into binary 
my @addressrange = map {unpack('N',inet_aton("10.210.14.$_"))} (145..204); 
#address to test 
my $address = $ARGV[0]; 
#grep for this binary in the range 
unless(grep {unpack('N',inet_aton($address)) eq $_} @addressrange) { 
    say "Address not part of the range" 
} 
else { 
    say "Address is part of the range" 
} 

然後運行

perl iphelp.pl 10.210.14.15 
Address not part of the range 

perl iphelp.pl 10.210.14.145 
Address is part of the range 
0

這不是什麼大不了的事自己處理的邏輯,但作爲已經指出的那樣,也有CPAN模塊來爲你做這個。我已經縮短了你的範圍的長度輸出的簡潔在這種情況下:

use strict; 
use warnings; 
use feature qw(say); 

use Net::Works::Address; 

my $lower = Net::Works::Address->new_from_string(string => '10.0.0.145'); 
my $upper = Net::Works::Address->new_from_string(string => '10.0.0.150'); 

foreach my $i (0 .. 255) { 
    my $ip = '10.0.0.' . $i; 
    my $auth = check_ip($ip); 
    say "$ip is OK" if $auth; 
} 

sub check_ip { 
    my $ip = shift; 
    my $address = Net::Works::Address->new_from_string(string => $ip); 
    return ($address <= $upper && $address >= $lower); 
} 

輸出是:

10.0.0.145 is ok 
10.0.0.146 is ok 
10.0.0.147 is ok 
10.0.0.148 is ok 
10.0.0.149 is ok 
10.0.0.150 is ok