[精讚] [會員登入]
173

[PERL] 檢查IP是否在某個網段內:matchcidr

檢查IP是否在某個網段內 matchcidr in perl

此文完整連結 http://n.sfs.tw/10672

複製連結 [PERL] 檢查IP是否在某個網段內:matchcidr@新精讚
(文章歡迎轉載,務必尊重版權註明連結來源)
2018-10-12 01:56:19 最後編修
2017-01-24 08:28:17 By 張○○
 

在PERL中有沒有像PHP matchcidr的函式?沒有所以自己寫:

下面的程式檢查你的$ip=163.17.147.1有沒有在你指定的陣列@mysch_ips中

#!/usr/bin/perl -w
use strict;
use Net::IPv4Addr qw( :all );
my( @mysch_ips)= ("163.17.32.0/19","163.17.88.0/21","163.17.96.0/22","163.17.108.0/22",
"163.17.112.0/20","163.17.128.0/23","163.17.130.0/24","163.17.146.0/23",
"163.17.148.0/22","163.17.152.0/21","163.17.160.0/19","163.17.192.0/18");

my $ip="163.17.147.1";
foreach(@mysch_ips){
    if (ipv4_in_network( $_, $ip ) ) {
        print "Welcome !";
    }
}

--
不使用模組的方法來解決這個問題

sub matchcidr{
    local $addr= shift;
    local $cidr= shift;
    local ($ip, $prefix) = split('/', $cidr);
    $prefix= 32 if !$prefix;
    local $mask = '1' x $prefix . '0' x (32-$prefix);
    foreach(@seg){
      $ipbin .= &dec2bin($_);
    }
    if( (&ip2bin($addr)& $mask) eq  (&ip2bin($ip)& $mask) ){
      return 1;
    }else {
      return 0;
    }
}

sub ip2bin {
  local $ip=shift;
  local @seg = split('\.',$ip);
  local $ipbin ="";
  foreach(@seg){
      $ipbin .= &dec2bin($_);
  }
  return $ipbin;
}


sub dec2bin {
    my $str = unpack("B32", pack("N", shift));
    return  sprintf("%08d",$str);
}

叫用

matchcidr( IP, CIDR);

回傳

   在CIDR範圍中回傳1,否則回傳0

叫用範例

print &matchcidr('1.2.4.4','1.2.3.0/25'); # 0

print &matchcidr('1.2.3.4','1.2.3.0/25'); # 1

print &matchcidr('1.2.3.4','1.2.3.0'); # 0 未指定 prefix,則比對IP本身是否相同

說明

第6行 把CIDR位址中的prefix轉成二進位的字串,作為遮罩,這裡使用PERL獨有的重覆運算子 'x'
第10行 將轉成二進位字串的兩個位址進行 and 運算,兩者相符就表示同一個網段
第17~25行 把ip變成二進位的字串
第28~31行 把10進位數值變成二進位的字串

 

相關連結

[PHP] IPv6檢查IP是否在某個網段內 mtachcidr6

[PHP] 檢查IP是否在某個網段內 mtachcidr


原文 2009-12-24 22:53:29  2018.1.6 重寫不用模組方法
此函式我重新整理 2007.10.25 日寫的一段程式作為當時初學perl的紀念,那時為了判斷IP是否為中縣網的IP,中縣網的IP非常散,我寫成一個陣列@mysch_ips,利用一個很棒的函式庫 Net::IPv4Addr ,裡面有一個函式 ipv4_in_network() 來解決這個問題。

你可能感興趣的文章

[PERL] 05-運算子 #1 PERL的運算子介紹,總共有21種

自行撰寫syslog server建立資訊安全控管中心#2 -- 架構和作法 利用PERL將syslog收攏到資料庫的程式,架構和作法

Perl 的列舉寫法(map list) 使用列舉的寫法來設定陣列,非常的強大

[PERL] 可用中文取名的中文名函式和package 原來perl 也可以用中文當函式、類別、方法的名稱啊

[PERL] 14-進階比對 #1--取回比對內容 perl的正規表達式進階比對

[PERL] 檢查IP是否在某個網段內:matchcidr 檢查IP是否在某個網段內 matchcidr in perl

[PERL] 22-日期和時間 Perl 取得日期時間的方法整理,使用 localtime等多種函數

自行撰寫syslog server建立資訊安全控管中心#1 -- 前言及syslog介紹 利用PERL將syslog收攏到資料庫的程式

[PERL] 04-基本比對 perl的正規表達示基本比對

[PERL] 18-套件及模組 套件和模組入門

我有話要說


限制:留言最高字數1000字,超過部分會被截掉。請注意:留言不可帶有網址,會被濾掉。 限制:未登入訪客,每則留言間隔需超過10分鐘,每日最多5則留言。

訪客留言

[無留言]

隨機好文

沒有非誰做不可的事,也沒有不可被取代的人 沒有非誰做不可的事,也沒有不可被取代的人

[jQuery] select 元件的取值及給值 html中的元件select,在jquery中要如何使用?

PHP for sphinx 函式庫安裝 PECL/sphinx PHP>= 5.2.2 已經能原生支援 sphinx,可是預設的沒有裝,我們得自己裝才能用

[Windows7] 移除IE10及移除IE11 Windows7 不得已的情況要移除IE11或IE10怎麼做?

設計的工作絕不接受比價 拿買陽春麵的價格想買牛肉麵,寧願倒掉也不賣