依赖python库:
pip install socket
pip install scapy
运行代码:
import socket
from scapy.layers.l2 import ARP, Ether, srp
def get_hostname(ip_address):
try:
return socket.gethostbyaddr(ip_address)[0]
except socket.herror:
# 未能解析主机名
return None
def 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_request
answered_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}") # DEBUG
return devices_list
# 请替换成你的实际IP范围
network_devices = scan_network('192.168.1.1/24')
raspberry_pis = [device for device in network_devices if
device['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 subprocess
def get_hostname(ip_address):
try:
return socket.gethostbyaddr(ip_address)[0]
except socket.herror:
# 未能解析主机名
return None
def ping_host(hostname):
try:
subprocess.check_output(['ping', '-4', hostname])
return True
except subprocess.CalledProcessError:
return False
def get_ip_from_hostname(hostname):
try:
return socket.gethostbyname(hostname)
except socket.error:
return None
def 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_request
answered_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}") # DEBUG
return devices_list
def 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 device
return 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~
如果还有什么问题,欢迎留言~