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设备均已授权")
让脚本后台运行的方法
- 用nohup直接后台启动:
nohup python your_script.py > usb_monitor.log 2>&1 &
这样脚本会在后台运行,输出日志到usb_monitor.log里。
- 写成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
相关产品推荐
相关产品推荐

