依赖python库:
pip install socket
pip install scapy
运行代码:
import socket
from scapy.layers.l2 import ARP, Ether, srpdef get_hostname(ip_address):try:return socket.gethostbyaddr(ip_address)[0]except socket.herror:# 未能解析主机名return Nonedef scan_network(ip_range):"""扫描指定 IP 范围内的局域网,返回找到的 IP 和 MAC 地址列表"""arp_request = ARP(pdst=ip_range)broadcast = Ether(dst="ff:ff:ff:ff:ff:ff")arp_request_broadcast = broadcast / arp_requestanswered_list = srp(arp_request_broadcast, timeout=1, verbose=False)[0]devices_list = []for sent, received in answered_list:hostname = get_hostname(received.psrc)devices_list.append({'ip': received.psrc, 'mac': received.hwsrc, 'hostname': hostname})print(f"IP: {received.psrc}, MAC: {received.hwsrc}, Hostname: {hostname}") # DEBUGreturn devices_list# 请替换成你的实际IP范围
network_devices = scan_network('192.168.1.1/24')raspberry_pis = [device for device in network_devices ifdevice['hostname'] and 'raspberrypi' in device['hostname'].lower()]for pi in raspberry_pis:print(f"Found Raspberry Pi! Hostname: {pi['hostname']}, IP: {pi['ip']}, MAC: {pi['mac']}")
以上代码的运行有个工具的依赖
-
Npcap来源github
Npcap来自官网 -
Bonjour来自github(这个通常Windows会自带,如果没有就下载安装一下)
通常,上面这个代码可能无法正常显示raspberry的主机名,那就要结合ping -4 raspberrypi.local指令了,代码如下:
import socket
from scapy.layers.l2 import ARP, Ether, srp
import subprocessdef get_hostname(ip_address):try:return socket.gethostbyaddr(ip_address)[0]except socket.herror:# 未能解析主机名return Nonedef ping_host(hostname):try:subprocess.check_output(['ping', '-4', hostname])return Trueexcept subprocess.CalledProcessError:return Falsedef get_ip_from_hostname(hostname):try:return socket.gethostbyname(hostname)except socket.error:return Nonedef scan_network(ip_range):"""扫描指定 IP 范围内的局域网,返回找到的 IP 和 MAC 地址列表"""arp_request = ARP(pdst=ip_range)broadcast = Ether(dst="ff:ff:ff:ff:ff:ff")arp_request_broadcast = broadcast / arp_requestanswered_list = srp(arp_request_broadcast, timeout=1, verbose=False)[0]devices_list = []for sent, received in answered_list:hostname = get_hostname(received.psrc)devices_list.append({'ip': received.psrc, 'mac': received.hwsrc, 'hostname': hostname})print(f"IP: {received.psrc}, MAC: {received.hwsrc}, Hostname: {hostname}") # DEBUGreturn devices_listdef find_raspberry_pi(devices_list):raspberry_pi_hostname = 'raspberrypi.local'if ping_host(raspberry_pi_hostname):raspberry_pi_ip = get_ip_from_hostname(raspberry_pi_hostname)for device in devices_list:if device['ip'] == raspberry_pi_ip:return devicereturn None# 请替换成你的实际IP范围
network_devices = scan_network('192.168.1.1/24')
raspberry_pi = find_raspberry_pi(network_devices)if raspberry_pi:print(f"Found Raspberry Pi! Hostname: {raspberry_pi['hostname']}, IP: {raspberry_pi['ip']}, MAC: {raspberry_pi['mac']}")
else:print("Raspberry Pi not found on the network.")
看看运行结果:
已经顺利找到了局域网树莓派的ip~
如果还有什么问题,欢迎留言~