27

CIDR表記を取り、可能なIPアドレスのリストを返す関数をpython(3.1)で作成するタスクを渡されました。私はpython.orgを見回して、これを見つけました: http://docs.python.org/dev/py3k/library/ipaddr.html

しかし、私はこの必要性を満たすものを見たことがありません...誰かが私の道を蹴りたいと思っているのを助けてくれることにとても感謝しています. 前もって感謝します。:-)

4

8 に答える 8

51

組み込みモジュールの使用に慣れていない場合は、 netaddrというプロジェクトがあります。これは、私が IP ネットワークでの作業に使用した中で最高のモジュールです。

ネットワークでの作業と IP の識別がいかに簡単かを示すIP チュートリアルをご覧ください。簡単な例:

>>> from netaddr import IPNetwork
>>> for ip in IPNetwork('192.0.2.0/23'):
...    print '%s' % ip
...
192.0.2.0
192.0.2.1
192.0.2.2
192.0.2.3
...
192.0.3.252
192.0.3.253
192.0.3.254
192.0.3.255
于 2009-12-21T21:50:12.343 に答える
2

チェックアウトしましたiptoolsか?かなりフィット感が良さそうです。

于 2009-12-21T19:43:28.390 に答える
1

ドキュメントにはありませんが、ソースを閲覧すると、 and がipaddr実装されていることが示唆されます。これはまさにあなたが望むものです。__iter__iterhosts


エラー、気にしないでください。

  1. 3.1 ベータ版で stdlib に追加されたようですipaddr.pyが、3.1 rc で削除されました。
  2. 元のipaddr.pyのソースを見ていましたが、これは python.org のコピーとは別に進化したようです。

後者をバンドルするだけです。

于 2009-12-21T20:06:42.243 に答える
0

以下のコードは、IP とサブネットを提供する上で IP の範囲を生成します。(255.255.255.0) のように CIDR 表記を展開します。

from netaddr import *

def getFirstIp(ipAddress,subnet):
  ipBin = IPNetwork(ipAddress).ip.bits().split('.')
  subBin = IPNetwork(subnet).ip.bits().split('.')
  zipped = zip(ipBin,subBin)
  netIdList = []
  for octets in zipped:
    netIdList.append(''.join(str(b) for b in (map((lambda x: int(x[0])*int(x[1])),zip(list(octets[0]),list(octets[1]))))))
  firstIp = ''
  firstIp = '.'.join(str(int(oct,2)) for oct in netIdList)
  return firstIp


def getLastIp(ipAddress,subnet):
  ipBin = IPNetwork(ipAddress).ip.bits().split('.')
  subBin = IPNetwork(subnet).ip.bits().split('.')
  #print ipBin
  #print subBin
  revsubBin = []
  for octets in subBin:
    revB = ''.join('1' if(b == '0') else '0' for b in octets)
    revsubBin.append(revB)
  zipped = zip(ipBin,revsubBin)
  netIdList = []
  for octets in zipped:
    netIdList.append(''.join(str(b) for b in (map((lambda x: 0 if(int(x[0]) == 0 and int(x[1]) == 0) else 1),zip(list(octets[0]),list(octets[1]))))))
  #print netIdList
  lastIp = ''
  lastIp = '.'.join(str(int(oct,2)) for oct in netIdList)
  return lastIp

def getRangeOfIps(firstIp,lastIp):
  start= int(IPAddress(firstIp))
  end = int(IPAddress(lastIp))
  ipList = []
  for ip in range(start,end+1):
    ipList.append(str(IPAddress(ip)))
  return ipList

def manipulateIP():
 firstIp = getFirstIp(ipAddress,subnet)
 lastIp = getLastIp(ipAddress,subnet)
 ipList = getRangeOfIps(firstIp,lastIp)  
 print ipList 
于 2016-09-23T06:06:35.823 に答える