views:

60

answers:

3

Hi Alls,

I'm trying to figure out how can I scan a class C ip range; For example a user provide by cmd line to my script : python script.py 192.168.0.0/24 (OR 192.168.0.1-255)

Let's figure my script does only a tcp connect action:

import socket, sys

host = sys.argv[1],65535

s = socket(AF_INET, SOCK_STREAM)

s.connect(host)

s.send("helloworld")

Do i really need to do a "for x in ip range" ?!? Or a build in module can do that ?

Thanks !

A: 

Have a look at http://stackoverflow.com/questions/207234/list-of-ip-addresses-hostnames-from-local-network-in-python.

There's no built-in way to do this; you can either use an external module or call some other program from Python.

katrielalex
+1  A: 

ipaddr-py is a really handy module for handling IP addresses and subnets.

>>> from ipaddr import IPv4Network
>>> net = IPv4Network('192.168.0.0/24')
>>> for host in net.iterhosts():
...     print repr(host)
...
IPv4Address('192.168.0.1')
IPv4Address('192.168.0.2')
IPv4Address('192.168.0.3')
IPv4Address('192.168.0.4')
..... and the rest
MattH
+1  A: 

It doesn't take too much code it you want to do it in pure python

import socket, struct

def atod(a): # ascii_to_decimal
    return struct.unpack("!L",socket.inet_aton(a))[0]

def dtoa(d): # decimal_to_ascii
    return socket.inet_ntoa(struct.pack("!L", d))

net,_,mask = sys.argv[1].partition('/')
mask = int(mask)
net = atod(net)

for host in (dtoa(net+n) for n in range(0, 1<<32-mask)):
    print host
gnibbler