2016-12-29 5 views
1

モジュールに組み込まれたのPython 2.7を使用して、サブネット内のすべてのIPを計算します。は、私はこのようなCIDR表記を取るスクリプトを作成する方法を疑問に思っのみ

204.15.20.0 
... 
... 
204.15.23.255 

私は最後にこれの背後にある数学を知っています。私はこのようなモジュールをどのようにしてPythonで作ることができるのだろうかと思っていました。

は、私はそのようなnetaddr.IPNetwork(としてすぐ利用可能なモジュール)を認識していますが、私はPythonで2.7

感謝:)

+0

このアドレスを整数に変更し、そこから「範囲」を使用できます。 – tdelaney

+0

1オクテットは255の最大値しか持てないので(b11111111) – Snowlav

+0

@UrielEliは重複していないので、私はそれがどのように動作するのかとは思いません。私は、組み込みのモジュールを使用してPythonでそれを行う方法が不思議です。 – Snowlav

答えて

3

のみ組み込みモジュールを使用して、これを行うだろうか疑問に思ってsocketstructモジュールを組み合わせてIPv4アドレスと整数を変換できます。その後、整数アドレスをマスキングし、cidr値からサブネット内の値の範囲を調べるという質問をします。

import re 
import socket 
import struct 

def inet_atoi(ipv4_str): 
    """Convert dotted ipv4 string to int""" 
    # note: use socket for packed binary then struct to unpack 
    return struct.unpack("!I", socket.inet_aton(ipv4_str))[0] 

def inet_itoa(ipv4_int): 
    """Convert int to dotted ipv4 string""" 
    # note: use struct to pack then socket to string 
    return socket.inet_ntoa(struct.pack("!I", ipv4_int)) 

def ipv4_range(ipaddr): 
    """Return a list of IPv4 address contianed in a cidr address range""" 
    # split out for example 192.168.1.1:22/24 
    ipv4_str, port_str, cidr_str = re.match(
     r'([\d\.]+)(:\d+)?(/\d+)?', ipaddr).groups() 

    # convert as needed 
    ipv4_int = inet_atoi(ipv4_str) 
    port_str = port_str or '' 
    cidr_str = cidr_str or '' 
    cidr_int = int(cidr_str[1:]) if cidr_str else 0 

    # mask ipv4 
    ipv4_base = ipv4_int & (0xffffffff << (32 - cidr_int)) 

    # generate list 
    addrs = [inet_itoa(ipv4_base + val) 
     for val in range(1 << (32 - cidr_int) + 2)] 
    return addrs 

print(ipv4_range('204.15.20.0/22')) 
関連する問題