2013-07-14 61 views
1

比方说,我有一个文本文件包含了这样一串IP范围:如何从Python中的IP范围列表中生成所有可能的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是范围终值。

如何将这些ip范围转换为python中新文本文件中的所有可能的IP地址?

PS:这个问题与我以前的任何问题都不一样。我在之前的问题中问过“如何从cidr符号生成所有可能的ips”。但在这里我问“如何从IP范围列表生成”。这些是不同的事情。

+0

难道只是一个'IPv4'地址的文件?或者那里还有'IPv6's? – will

+0

@只会IPv4 – Leadri

回答

8

该函数返回的所有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('-') 
     # .... 
+0

感谢您的回答,但我是新来的蟒蛇,我不明白如何使其工作。并且可以显示如何从文本文件中读取iprange list并创建一个包含所有可能的ips的新文本文件? – Leadri

+0

为什么这不被标记为接受答案?从Python中的文件中读取文本是一个基本的任务,你可以找到数百个其他职位,可以告诉你如何完成这一点。有关问题的原始问题在这里得到了明确解答,其余部分您需要使用google/duckduckgo进行处理。 – r2d2oid

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 
0

的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']