扫描C类网络的Python代码
我正在尝试弄清楚如何扫描一个C类IP范围;
比如用户通过命令行给我的脚本提供了一个地址:
python script.py 192.168.0.0/24(或者 192.168.0.1-255)
假设我的脚本只执行一个TCP连接的操作:
import socket, sys
host = sys.argv[1],65535
s = socket(AF_INET, SOCK_STREAM)
s.connect(host)
s.send("helloworld")
我真的需要用“for x in ip range”这样的方式吗!? 还是说有内置的模块可以做到这一点?
谢谢!
4 个回答
1
这里有一个小工具叫做scanip,它可以帮助你获取网络中所有的IP地址和对应的MAC地址(适用于Linux系统)。这是用Python写的scanip(IP和MAC扫描器)的链接:https://pypi.python.org/pypi/scanip/1.0
你也可以在Linux上通过命令pip install scanip来下载它。使用方法是,先在Python中创建一个测试文件,然后像这样使用它:
import scanip.scanip
scanip.scanip.start_scan()
运行这个程序后,局域网中所有的IP地址及其对应的MAC地址都会在终端显示出来。
2
ipaddr-py 是一个非常实用的模块,用来处理IP地址和子网。
>>> 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
3
如果你想用纯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