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

Linux下如何获取已连接设备的仅USB ID?Python2.x脚本开发

高效获取USB设备ID并匹配的Python 2.x方案(Linux)

嘿,你说的解析lsusb输出确实挺折腾的,我给你两个更靠谱的思路,不用费劲筛选字符串,直接精准拿到USB设备ID:

方案一:用pyudev库(推荐,更简洁)

pyudev是专门和Linux udev交互的Python库,能直接获取设备的详细信息,不用调用外部命令。不过因为你用Python 2.x,得装兼容的旧版本:

pip install pyudev==0.22.0

下面是示例脚本,能获取所有USB设备的厂商ID:产品ID,并和你的已知列表对比:

import pyudev

def get_usb_device_ids():
    # 创建udev上下文
    context = pyudev.Context()
    device_ids = set()
    # 遍历所有USB设备
    for device in context.list_devices(subsystem='usb', DEVTYPE='usb_device'):
        vendor_id = device.get('ID_VENDOR_ID')
        product_id = device.get('ID_PRODUCT_ID')
        if vendor_id and product_id:
            device_id = "{0}:{1}".format(vendor_id, product_id)
            device_ids.add(device_id)
    return device_ids

if __name__ == '__main__':
    # 替换成你的已识别ID列表
    trusted_ids = {'1234:abcd', '5678:wxyz'}
    current_ids = get_usb_device_ids()
    
    # 检查不匹配的设备
    untrusted = current_ids - trusted_ids
    if untrusted:
        print("发现未授权USB设备:")
        for dev_id in untrusted:
            print("- {0}".format(dev_id))
    else:
        print("所有USB设备均已授权")

方案二:直接读取sysfs(无需额外依赖)

Linux的sysfs文件系统里直接存了USB设备的信息,你可以直接读取/sys/bus/usb/devices/下的文件,不用装任何库:

import os

def get_usb_device_ids():
    usb_path = '/sys/bus/usb/devices/'
    device_ids = set()
    # 遍历每个设备目录
    for dev_dir in os.listdir(usb_path):
        dev_path = os.path.join(usb_path, dev_dir)
        # 跳过非目录项
        if not os.path.isdir(dev_path):
            continue
        # 读取厂商和产品ID
        vendor_file = os.path.join(dev_path, 'idVendor')
        product_file = os.path.join(dev_path, 'idProduct')
        if os.path.exists(vendor_file) and os.path.exists(product_file):
            with open(vendor_file, 'r') as f:
                vendor_id = f.read().strip()
            with open(product_file, 'r') as f:
                product_id = f.read().strip()
            device_id = "{0}:{1}".format(vendor_id, product_id)
            device_ids.add(device_id)
    return device_ids

if __name__ == '__main__':
    trusted_ids = {'1234:abcd', '5678:wxyz'}
    current_ids = get_usb_device_ids()
    
    untrusted = current_ids - trusted_ids
    if untrusted:
        print("发现未授权USB设备:")
        for dev_id in untrusted:
            print("- {0}".format(dev_id))
    else:
        print("所有USB设备均已授权")

让脚本后台运行的方法

  1. 用nohup直接后台启动:
nohup python your_script.py > usb_monitor.log 2>&1 &

这样脚本会在后台运行,输出日志到usb_monitor.log里。

  1. 写成systemd服务(推荐,开机自启):
    创建/etc/systemd/system/usb-monitor.service文件,内容如下:
[Unit]
Description=USB Device Monitor
After=multi-user.target

[Service]
Type=simple
ExecStart=/usr/bin/python /path/to/your_script.py
Restart=always
User=root  # 读取sysfs或udev通常需要root权限

[Install]
WantedBy=multi-user.target

然后启用并启动服务:

sudo systemctl daemon-reload
sudo systemctl enable usb-monitor.service
sudo systemctl start usb-monitor.service

这样脚本就会一直在后台运行,就算重启系统也会自动启动。

内容的提问来源于stack exchange,提问作者Batcastle

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:02:17