(ubuntu 16.04) 如何检测与设备无关的 USB 插入事件

(ubuntu 16.04) 如何检测与设备无关的 USB 插入事件

我正在尝试检测 USB 插入,无论它是什么设备。例如:电话、电池组、生物识别系统等,Linux 可能会或可能不会识别它们(没有驱动程序或没有任何“驱动/运行”)。据推测,Linux 将检测 USB 插入(与设备无关),然后继续注册并仅对可识别的设备进行操作。例如,它将在 /dev/bus/usb/ 等中列出已识别的 USB 设备详细信息。相反,我想捕获/处理插入 USB 插槽的所有内容。这大概意味着,我不能依赖像 udevadm 这样的东西,因为它只在识别的设备上启动。这也意味着我需要在曲线的早期捕获插入事件。我该怎么做呢?

答案1

我不相信你可以使用 @meuh 评论中提到的愚蠢设备来完成此任务这里。。使用实际通信的设备udevadm monitor可以正常工作。以下是插入和拔出 Android 手机(开机)的示例:

$ udevadm monitor
monitor will print the received events for:
UDEV - the event which udev sends out after rule processing
KERNEL - the kernel uevent

KERNEL[115749.498687] add      /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.6 (usb)
KERNEL[115749.499591] add      /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.6/2-1.6:1.0 (usb)
UDEV  [115749.511659] add      /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.6 (usb)
UDEV  [115749.516846] add      /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.6/2-1.6:1.0 (usb)
KERNEL[115767.515839] remove   /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.6/2-1.6:1.0 (usb)
KERNEL[115767.516143] remove   /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.6 (usb)
UDEV  [115767.517088] remove   /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.6/2-1.6:1.0 (usb)
UDEV  [115767.522116] remove   /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.6 (usb)

闪存驱动器会产生类似但更详细的结果。如果您想利用此信息来触发某些操作,您可以将输出重定向到文件并用于tail监视该文件是否有新活动。

使用 Android 手机(关闭,但正在充电)进行的测试表明lsusb -v |grep Power输出没有任何变化,恕我直言,这证实了无法检测到仅获取或供电的哑设备。

另一种检测设备的简单方法不傻是存储基线信息并将当前信息与该信息进行比较。有很多方法可以做到这一点。udevadm我想到的一种简单的替代方法是在不插入要检测的设备的情况下简单地收集系统的基线数据。例如:收集基线数据:lsusb > baseline.txt 检查当前数据并比较:

虽然是真的;执行 lsusb > 比较.txt ; diff 比较.txt 基线.txt;睡觉1;完毕

这将每秒将当前 USB 连接与基线进行比较。

如果您的脚本在检测时更新基线数据,您还可以通过此方法检测设备删除。

答案2

捕获 USB 上所有流量的一种方法是在插入 usbmon 内核模块后使用wireshark,详细信息如下:

Wireshark USB 监控

这大约是您所能得到的“曲线的早期”。但我假设您的意图是使用某种编程触发器(例如事件)来做一些有趣的事情 - 因此,考虑到运行“lsusb -t”会为您提供插入的 USB 设备的静态列表及其各自的驱动程序(如果存在),您可以创建一个 cron 作业来运行 lsusb 并将其与以前的版本进行比较,以确定是否已插入新设备,即使它没有与之关联的驱动程序。

这个简单解决方案的缺点是 cron 在插入和检测之间产生很大的延迟。

相关内容