Python - Generate a list of IP addresses from user input
Question: I am trying to create a script that generates a list of IP addresses based on
a users input for a start and end IP range. For example, they could enter
192.168.1.25 & 192.168.1.50. The list would then be fed into scapy to test for
open ports. I think I have the list generated, but I am stuck on getting the
individual IP's out and into the rest of my code. I think I am trying to use
the whole list vs. an item in the list. If there is a better way of doing
this, that is fine. I am doing this mainly to improve my understanding of
Python.

Thanks!

    
    
    from scapy.all import *
    
    ip_start = raw_input('Please provide the starting IP address for your scan --> ')
    start_list = ip_start.split(".")
    ip_end = raw_input('Please provide the ending IP address for your scan --> ')
    end_list = ip_end.split(".")
    top = int(start_list[3])
    bot = int(end_list[3])
    octet_range = range(top,bot)
    #print octet_range
    for i in octet_range:
        #new_ip_start = ip_start.replace(str(top),str(i))
    
        start_list[3] = i
        #print top
        #print i
        print type(start_list)    
        src_port = RandShort()
        dst_port = 80
        scan = sr1(IP(dst=str(start_list))/TCP(sport=src_port,dport=dst_port,flags="S"),timeout=10)
    


Answer: It'd be easier to use a format like `nmap`'s:

    
    
    192.168.1.1-255
    

As now, you can do:

    
    
    octets = '192.168.1.1-255'.split('.')
    parsed_ranges = [map(int, octet.split('-')) for octet in octets]
    

`parsed_ranges` will look like `[[192], [168], [1], [1, 255]]`. From there,
generating the addresses is simple with `itertools`:

    
    
    import itertools
    
    ranges = [range(r[0], r[1] + 1) if len(r) == 2 else r for r in parsed_ranges]
    addresses = itertools.product(*ranges)
    

Here's a simple implementation:

    
    
    import itertools
    
    def ip_range(input_string):
        octets = input_string.split('.')
        chunks = [map(int, octet.split('-')) for octet in octets]
        ranges = [range(c[0], c[1] + 1) if len(c) == 2 else c for c in chunks]
    
        for address in itertools.product(*ranges):
            yield '.'.join(map(str, address))
    

And the result:

    
    
    >>> for address in ip_range('192.168.1-2.1-12'):  print(address)
    192.168.1.1
    192.168.1.2
    192.168.1.3
    192.168.1.4
    192.168.1.5
    192.168.1.6
    192.168.1.7
    192.168.1.8
    192.168.1.9
    192.168.1.10
    192.168.1.11
    192.168.1.12
    192.168.2.1
    192.168.2.2
    192.168.2.3
    192.168.2.4
    192.168.2.5
    192.168.2.6
    192.168.2.7
    192.168.2.8
    192.168.2.9
    192.168.2.10
    192.168.2.11
    192.168.2.12
    

