在Python中,要查找本地网络中所有的IP地址,我们可以使用一些网络库如 socket
和 scapy
。下面我将分步骤介绍如何使用这些工具来发现本地网络的活跃IP地址。
使用 socket
库获取本地IP地址
首先,我们可以使用 socket
库获取本地机器的IP地址。这是发现网络中其他设备的起点。
pythonimport socket def get_local_ip(): s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) try: # doesn't have to be reachable s.connect(('10.254.254.254', 1)) IP = s.getsockname()[0] except Exception: IP = '127.0.0.1' finally: s.close() return IP
使用 scapy
库扫描本地网络
接下来,我们可以使用 scapy
库来扫描整个子网。scapy
是一个强大的Python库,用于网络包处理。
首先,你需要安装 scapy
:
bashpip install scapy
然后,我们可以编写一个函数来扫描网络上的IP:
pythonfrom scapy.all import ARP, Ether, srp def scan_ip(local_ip): prefix = local_ip.rsplit('.', 1)[0] # 获取IP地址前缀 # IP地址范围,例如 192.168.1.1/24 target_ip = f"{prefix}.1/24" # 创建ARP请求包 (who has) arp = ARP(pdst=target_ip) ether = Ether(dst="ff:ff:ff:ff:ff:ff") # Ethernet frame packet = ether/arp result = srp(packet, timeout=3, verbose=0)[0] # 发送包并接收响应 # 提取响应包中的IP地址 live_hosts = [] for sent, received in result: live_hosts.append({'ip': received.psrc, 'mac': received.hwsrc}) return live_hosts # 主函数 if __name__ == "__main__": local_ip = get_local_ip() print(f"Your local IP address: {local_ip}") hosts = scan_ip(local_ip) print("Live hosts on the network:") for host in hosts: print(f"IP: {host['ip']}, MAC: {host['mac']}")
解释
- 获取本地IP: 我们首先确定本机的IP地址,这对于定义要扫描的IP范围很重要。
- 定义IP范围:我们通过简单地更改最后一个八位字节来生成同一子网内的所有IP地址。
- 发送ARP请求:我们为每个IP地址发送ARP请求来查看哪些地址有响应。
- 收集和打印结果: 对于响应ARP请求的设备,我们记录下它们的IP和MAC地址,并将它们打印出来。
这个方法可以有效地帮助你找到同一局域网内的所有活跃设备。
2024年8月21日 01:34 回复