自制Python网络扫描器OUI厂商信息仅显示8字符,求问题排查
问题原因与修复方案
你遇到的OUI厂商信息仅显示8个字符,核心原因是manuf库的get_manuf方法默认返回短厂商名称(最多8字符),该方法的full_manuf参数默认值为False,会自动截断厂商名称。
修复步骤
- 获取完整厂商名称
修改get_device_type函数,调用get_manuf时传入full_manuf=True参数,即可获取完整的厂商名称:
def get_device_type(mac_address): p = manuf.MacParser() manufacturer = p.get_manuf(mac_address, full_manuf=True) return manufacturer or "Unknown"
- 优化性能(可选但推荐)
将MacParser实例移到函数外部,避免每次调用get_device_type都重复加载数据库,提升扫描效率:
# 全局初始化一次MacParser p = manuf.MacParser() def get_device_type(mac_address): manufacturer = p.get_manuf(mac_address, full_manuf=True) return manufacturer or "Unknown"
- 调整打印格式
使用格式化字符串的对齐语法,确保各列内容完整显示,避免因长度差异导致的视觉截断:
将循环内的打印语句修改为:
print(f"{ip:<16} {mac:<18} {device_type:<30} {os_info}")
完整修改后的代码
import scapy.all as scapy import manuf # 全局初始化MacParser,避免重复加载数据库 p = manuf.MacParser() def get_device_type(mac_address): # 获取完整厂商名称 manufacturer = p.get_manuf(mac_address, full_manuf=True) return manufacturer or "Unknown" def scan(ip): print("Sending ARP requests...") arp_request = scapy.ARP(pdst=ip) broadcast = scapy.Ether(dst="ff:ff:ff:ff:ff:ff") arp_request_broadcast = broadcast / arp_request answered_list = scapy.srp(arp_request_broadcast, timeout=1, verbose=False)[0] print("\nIP Address\tMAC Address\t\tManufacturer\t\t\t\tOS\n---------------------------------------------------------------------------------------------------------------") for element in answered_list: ip = element[1].psrc mac = element[1].hwsrc device_type = get_device_type(mac) os_info = "Unknown" try: syn_packet = scapy.IP(dst=ip) / scapy.TCP(dport=80, flags="S") response = scapy.sr1(syn_packet, timeout=1, verbose=False) if response and response.haslayer(scapy.TCP): tcp_flags = response.getlayer(scapy.TCP).flags os_info = "Linux/Unix" if tcp_flags == 0x12 else "Windows" if tcp_flags == 0x14 else "Unknown" except Exception: os_info = "Error" # 格式化对齐列,确保内容完整显示 print(f"{ip:<16} {mac:<18} {device_type:<30} {os_info}") print("\nDone\n---------------------------------------------------------------------------------------------------------------") scan("192.168.42.1/24")
内容的提问来源于stack exchange,提问作者Lardsonian
相关产品推荐
相关产品推荐

