You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自制Python网络扫描器OUI厂商信息仅显示8字符,求问题排查

问题原因与修复方案

你遇到的OUI厂商信息仅显示8个字符,核心原因是manuf库的get_manuf方法默认返回短厂商名称(最多8字符),该方法的full_manuf参数默认值为False,会自动截断厂商名称。

修复步骤

  1. 获取完整厂商名称
    修改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"
  1. 优化性能(可选但推荐)
    将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"
  1. 调整打印格式
    使用格式化字符串的对齐语法,确保各列内容完整显示,避免因长度差异导致的视觉截断:
    将循环内的打印语句修改为:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 18:42:54