Search code examples
pythonipconvertersgeneratorcidr

How can I generate all possible IPs from a list of ip ranges in Python?


Let's say I have a text file contains a bunch of ip ranges like this:

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 is start value and y.y.y.y is end value of range.

How can I convert these ip ranges to all possible IPs in a new text file in python?

PS: This question is not same as any of my previous questions. I asked "how to generate all possible ips from cidr notations" in my previous question. But in here I ask "how to generate from ip range list". These are different things.


Solution

  • This function returns all ip addresses like from start to end:

    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)]
    

    These are the building blocks to build it on your own:

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

    Example:

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

    Read from file

    In your case you can read from a file like this:

    with open('file') as f:
        for line in f:
            start, end = line.strip().split('-')
            # ....