Python 3:从CIDR表示法创建可能的IP地址列表

Mad*_*ist 13 python subnet cidr

我已经完成了在python(3.1)中创建一个函数的任务,该函数将采用CIDR表示法并返回可能的ip地址列表.我查看了python.org并发现了这个:http://docs.python.org/dev/py3k/library/ipaddr.html

但我还没有看到任何可以满足这种需求的东西......我会非常感激任何人都愿意帮助我的方式.提前致谢.:-)

jat*_*ism 35

如果您没有使用内置模块,那么有一个名为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
Run Code Online (Sandbox Code Playgroud)


Pet*_*rik 17

在Python 3中就像

>>> import ipaddress
>>> [str(ip) for ip in ipaddress.IPv4Network('192.0.2.0/28')]
['192.0.2.0', '192.0.2.1', '192.0.2.2',
'192.0.2.3', '192.0.2.4', '192.0.2.5',
'192.0.2.6', '192.0.2.7', '192.0.2.8',
'192.0.2.9', '192.0.2.10', '192.0.2.11',
'192.0.2.12', '192.0.2.13', '192.0.2.14',
'192.0.2.15']
Run Code Online (Sandbox Code Playgroud)

  • 请注意,此答案提供了一个地址列表,其中包括网络地址(192.0.2.0)和广播地址(192.0.2.15),这些地址不可用于分配给主机。对于 Python 来说,这是正确的行为,但如果其他利益相关者不熟悉网络,可能会导致他们感到困惑。 (3认同)

jfl*_*fly 9

我宁愿做一些数学而不是安装一个外部模块,没有人和我有同样的味道?

#!/usr/bin/env python
# python cidr.py 192.168.1.1/24

import sys, struct, socket

(ip, cidr) = sys.argv[1].split('/')
cidr = int(cidr) 
host_bits = 32 - cidr
i = struct.unpack('>I', socket.inet_aton(ip))[0] # note the endianness
start = (i >> host_bits) << host_bits # clear the host bits
end = start | ((1 << host_bits) - 1)

# excludes the first and last address in the subnet
for i in range(start, end):
    print(socket.inet_ntoa(struct.pack('>I',i)))
Run Code Online (Sandbox Code Playgroud)


Han*_*Gay 3

你退房了吗iptools?这似乎是一个相当不错的选择。

  • 我已更新 iptools 以支持 Python 2.3、2.5、2.6 和 3.1。 (2认同)