Python3:根据CIDR符号创建可能的ip地址列表
我的任务是用python(3.1)创建一个函数,该函数将采用CIDR表示法并返回可能的ip地址列表。我查看了python.org,发现了以下内容:Python3:根据CIDR符号创建可能的ip地址列表,python,subnet,cidr,Python,Subnet,Cidr,我的任务是用python(3.1)创建一个函数,该函数将采用CIDR表示法并返回可能的ip地址列表。我查看了python.org,发现了以下内容: 但我还没有看到任何能满足这种需要的东西。。。如果有人愿意为我提供帮助,我将不胜感激。提前感谢。:-) 你退房了吗?这似乎很合适。文档中没有,但浏览源代码表明ipaddr实现了\uuuu iter\uuuu和iterhosts,这正是您想要的 呃,没关系 它看起来像是在3.1beta版中将ipaddr.py添加到stdlib中,但被3.1rc删除了
但我还没有看到任何能满足这种需要的东西。。。如果有人愿意为我提供帮助,我将不胜感激。提前感谢。:-) 你退房了吗?这似乎很合适。文档中没有,但浏览源代码表明
ipaddr
实现了\uuuu iter\uuuu
和iterhosts
,这正是您想要的
呃,没关系
ipaddr.py
添加到stdlib中,但被3.1rc删除了您可以将后者捆绑起来。如果您还不习惯使用内置模块,那么有一个名为“这是我用于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
下面的代码将生成提供IP和子网的IP范围。展开CIDR表示法,如(255.255.255.0)
我宁愿做一点数学,而不是安装一个外部模块,没有人和我有同样的品味
#!/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)))
#/usr/bin/env python
#python cidr.py 192.168.1.1/24
导入系统、结构、套接字
(ip,cidr)=sys.argv[1]。拆分('/'))
cidr=int(cidr)
主机\u位=32-cidr
i=struct.unpack('>i',socket.inet_aton(ip))[0]35;注意结尾
Python 3中的start=(i>>主机\u位)与
>>> 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']
生成给定CIDR的所有公共IP地址
将生成有效IP公共地址列表,包括地址
'1.0.0.0/8'
到'191.0.0.0/8'
是有效的公用IP地址范围,不包括保留的专用IP地址
IP发生器
生成IP地址和相关地理信息的JSON转储。
请注意,有效的公共IP地址范围为
从'1.0.0.0/8'
到'191.0.0/8'
,不包括保留的
本自述文件下方显示的专用IP地址范围
docker build-t geo-ip。
docker run-e IPRANGE='54.0.0.0/30'地理ip##几个ip
docker run-e IPRANGE='54.0.0.0/26'地理ip##更多ip
docker run-e IPRANGE='54.0.0.0/16'地理ip##更多ip
docker run-e IPRANGE='0.0.0.0/0'地理ip###所有ip(SLOOOWWW)
docker run-e IPRANGE='0.0.0.0/0'geo-ip>geo-ip.json##所有ip都保存到json文件
docker运行地理ip
扫描所有有效公共地址的更快选项:
以美元表示的i的(序号191);做\
docker run-e IPRANGE=“$i.0.0.0/8”地理ip\
睡眠1;\
完成
这会将少于4228250625行JSON打印到标准输出。
以下是其中一行的示例:
{"city": "Palo Alto", "ip": "0.0.0.0", "longitude": -122.1274,
"continent": "North America", "continent_code": "NA",
"state": "California", "country": "United States", "latitude": 37.418,
"iso_code": "US", "state_code": "CA", "aso": "PubNub",
"asn": "11404", "zip_code": "94107"}
专用和保留IP范围
上面repo中的dockerfile将排除不可用的IP地址
遵循维基百科文章中的指南:
MaxMind Geo IP
dockerfile导入由提供的免费公共数据库,因为它似乎不支持Python 2.3,所以可能至少需要付出一定的努力才能支持Python 3.1。我已经更新了iptools以支持Python 2.3、2.5、,2.6和3.1.如果您的问题有帮助,我可能希望返回并接受一些答案……我已经在Python2.x上使用了IPy(),现在正在将其移植到Python3。完成后,我将发布一个链接作为答案。@AJ:IPy也是一个不错的选择,但我推荐NetAddress,因为我更喜欢它。:)更新:我已经将IPy的新版本提交给当前的维护者进行审查。考虑到假期,我不确定何时发布,但一旦发布,我将发布一个链接。请注意,这不包括广播地址,广播地址可能是您想要的,也可能不是您想要的。当计算“结束”以包含它时,删除-1
。@Peter,删除-1
仅适用于偶数IP地址(例如,第四个八位字节以偶数结尾)。在减去1后,添加end+=1
作为行。@jfky你能解释一下这个数学吗?有趣的是,映射是如何完成的?是否存在将CIDR网络映射到单个IP地址的确定性公式?或者需要一个数据库来进行映射?这直接在python3终端上工作,但在.py文件中如何?@Tony此答案的前两行可以进入.py文件,减去每行开头的>>>。在第二行中,您应该将列表分配给一个变量,然后可以查看该变量或对其执行其他操作。如果将[str(ip)for ip按原样放入ipaddress.IPv4Network('192.0.2.0/28')中的文件,然后运行它,则不会有输出。但将其分配给一个变量,如ip_list=[str(ip)for ip in ipaddress.IPv4Network('192.0.2.0/28')],然后您可以打印(ip_list)以查看列表。
{"city": "Palo Alto", "ip": "0.0.0.0", "longitude": -122.1274,
"continent": "North America", "continent_code": "NA",
"state": "California", "country": "United States", "latitude": 37.418,
"iso_code": "US", "state_code": "CA", "aso": "PubNub",
"asn": "11404", "zip_code": "94107"}