4

次のような一連の 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

xxxx は範囲の開始値で、yyyy は範囲の終了値です。

これらの IP 範囲を Python の新しいテキスト ファイルで可能なすべての IP に変換するにはどうすればよいですか?

PS: この質問は、私の以前の質問と同じではありません。以前の質問で、「cidr 表記から可能なすべての IP を生成する方法」を尋ねました。しかし、ここで「IP範囲リストから生成する方法」を尋ねます。これらは別のものです。

4

4 に答える 4

12

この関数は、最初から最後まですべての 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('-')
        # ....
于 2013-07-14T17:02:21.470 に答える
2

これを試して:

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
于 2014-09-17T00:42:49.753 に答える