扫描C类网络的Python代码

0 投票
4 回答
4255 浏览
提问于 2025-04-16 02:51

我正在尝试弄清楚如何扫描一个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

撰写回答