Python 获取局域网下所有 IP 地址
作为一名刚入行的开发者,你可能会遇到需要获取局域网下所有 IP 地址的情况。在这篇文章中,我将向你展示如何使用 Python 来实现这一功能。
1. 准备工作
在开始之前,我们需要确保你的开发环境已经安装了 Python。此外,我们还需要安装一个名为 scapy
的第三方库,它可以帮助我们发送和接收网络数据包。你可以通过以下命令安装 scapy
:
pip install scapy
2. 流程概述
下面是获取局域网下所有 IP 地址的步骤:
步骤 | 描述 |
---|---|
1 | 导入所需的库 |
2 | 设置局域网的 IP 范围 |
3 | 发送 ARP 请求 |
4 | 接收 ARP 响应 |
5 | 提取 IP 地址和 MAC 地址 |
6 | 打印结果 |
3. 编写代码
接下来,我们将按照上述步骤编写代码。
3.1 导入所需的库
from scapy.all import ARP, Ether, srp
这行代码导入了 scapy
库中的 ARP
、Ether
和 srp
函数。
3.2 设置局域网的 IP 范围
ip_range = ["192.168.1.1", "192.168.1.254"]
这里我们假设局域网的 IP 范围是从 192.168.1.1
到 192.168.1.254
。你可以根据实际情况修改这个范围。
3.3 发送 ARP 请求
arp_request = ARP(pdst=ip)
ether_request = Ether(dst="ff:ff:ff:ff:ff:ff")
packet = ether_request / arp_request
这段代码创建了一个 ARP 请求,其中 pdst
参数指定了目标 IP 地址。Ether
函数用于设置以太网帧的目的地地址,这里我们使用广播地址 ff:ff:ff:ff:ff:ff
。
3.4 接收 ARP 响应
answered, _ = srp(packet, timeout=1, verbose=0)
srp
函数用于发送和接收数据包。timeout
参数指定了等待响应的时间,verbose
参数用于控制输出信息的详细程度。
3.5 提取 IP 地址和 MAC 地址
for sent, received in answered:
print(f"IP: {received.psrc} - MAC: {received.hwsrc}")
这行代码遍历收到的 ARP 响应,提取并打印每个设备的 IP 地址和 MAC 地址。
3.6 完整代码
from scapy.all import ARP, Ether, srp
def get_lan_ips():
ip_range = ["192.168.1.1", "192.168.1.254"]
arp_request = ARP(pdst=ip_range[1])
ether_request = Ether(dst="ff:ff:ff:ff:ff:ff")
packet = ether_request / arp_request
answered, _ = srp(packet, timeout=1, verbose=0)
for sent, received in answered:
print(f"IP: {received.psrc} - MAC: {received.hwsrc}")
get_lan_ips()
4. 类图
下面是使用 Mermaid 语法绘制的类图:
classDiagram
class ARPRequest {
+pdst: str
}
class EtherRequest {
+dst: str
}
class Packet {
+ether_request: EtherRequest
+arp_request: ARPRequest
}
ARPRequest --|> EtherRequest: contains
EtherRequest --|> Packet: contains
5. 结果展示
假设我们运行上述代码,可能会得到如下结果:
IP: 192.168.1.2 - MAC: 00:1A:2B:3C:4D:5E
IP: 192.168.1.3 - MAC: 6E:7F:8G:9H:0I:1J
...
6. 结语
通过这篇文章,你应该已经学会了如何使用 Python 获取局域网下的所有 IP 地址。这个过程涉及到网络编程的基本概念,如 ARP 请求和响应。希望这篇文章能帮助你更好地理解网络编程,并为你的项目提供一些启示。
如果你有任何问题或需要进一步的帮助,请随时联系我。祝你编程愉快!