假设我有一个文本文件包含一堆像这样的ip范围:
x.x.x.x-y.y.y.y
x.x.x.x-y.y.y.y
x.x.x.x-y.y.y.y
x.x.x.x-y.y.y.y
x.x.x.x-y.y.y.y
x.x.x.x是起始值,y.y.y.y是范围的结束值。
如何在python中的新文本文件中将这些ip范围转换为所有可能的IP?
PS:这个问题与我以前的任何问题都不一样。在我之前的问题中,我问过“如何从cidr符号生成所有可能的ips”。但在这里我问“如何从ip范围列表生成”。这些是不同的东西。
答案 0 :(得分:9)
此函数返回所有IP地址,例如从开始到结束:
def ips(start, end):
import socket, struct
start = struct.unpack('>I', socket.inet_aton(start))[0]
end = struct.unpack('>I', socket.inet_aton(end))[0]
return [socket.inet_ntoa(struct.pack('>I', i)) for i in range(start, end)]
这些是自己构建它的构建块:
>>> import socket, struct
>>> ip = '0.0.0.5'
>>> i = struct.unpack('>I', socket.inet_aton(ip))[0]
>>> i
5
>>> i += 1
>>> socket.inet_ntoa(struct.pack('>I', i))
'0.0.0.6'
示例:
ips('1.2.3.4', '1.2.4.5')
['1.2.3.4', '1.2.3.5', '1.2.3.6', '1.2.3.7', ..., '1.2.3.253', '1.2.3.254', '1.2.3.255', '1.2.4.0', '1.2.4.1', '1.2.4.2', '1.2.4.3', '1.2.4.4']
从文件中读取
在您的情况下,您可以从以下文件中读取:
with open('file') as f:
for line in f:
start, end = line.strip().split('-')
# ....
答案 1 :(得分:2)
仅限Python 3,对于IPv4,与@User相同,但使用新的Python3标准库:ipaddress
IPv4由4个字节表示。因此,下一个IP实际上是下一个数字,一系列IP可以表示为一个整数范围。
0.0.0.1是1
0.0.0.2是2
...
0.0.0.255是255
0.0.1.0是256
0.0.1.1是257
按代码(忽略In []:和Out []:)
In [68]: from ipaddress import ip_address
In [69]: ip_address('0.0.0.1')
Out[69]: IPv4Address('0.0.0.1')
In [70]: ip_address('0.0.0.1').packed
Out[70]: b'\x00\x00\x00\x01'
In [71]: int(ip_address('0.0.0.1').packed.hex(), 16)
Out[71]: 1
In [72]: int(ip_address('0.0.1.0').packed.hex(), 16)
Out[72]: 256
In [73]: int(ip_address('0.0.1.1').packed.hex(), 16)
Out[73]: 257
ip.packed.hex()
返回4字节的十六进制形式,就像它一样
十六进制,它更短(例如:0xff十六进制== 255十进制== 0b11111111二进制),
因此,经常用于表示字节。 int(hex, 16)
返回整数值
对应于十六进制值,因为它更友好,可以用作ip_address
的输入。
from ipaddress import ip_address
def ips(start, end):
'''Return IPs in IPv4 range, inclusive.'''
start_int = int(ip_address(start).packed.hex(), 16)
end_int = int(ip_address(end).packed.hex(), 16)
return [ip_address(ip).exploded for ip in range(start_int, end_int)]
ips('192.168.1.240', '192.168.2.5')
返回:
['192.168.1.240',
'192.168.1.241',
'192.168.1.242',
'192.168.1.243',
'192.168.1.244',
'192.168.1.245',
'192.168.1.246',
'192.168.1.247',
'192.168.1.248',
'192.168.1.249',
'192.168.1.250',
'192.168.1.251',
'192.168.1.252',
'192.168.1.253',
'192.168.1.254',
'192.168.1.255',
'192.168.2.0',
'192.168.2.1',
'192.168.2.2',
'192.168.2.3',
'192.168.2.4']
答案 2 :(得分:1)
试试这个:
def ip_range(start_ip,end_ip):
start = list(map(int,start_ip.split('.')))
end = list(map(int,end_ip.split('.')))
iprange=[]
while start!=list(map(int,end_ip.split('.'))):
for i in range(len(start)-1,-1,-1):
if start[i]<255:
start[i]+=1
break
else:
start[i]=0
iprange.append('.'.join(map(str,start)))
return iprange