gpt4 book ai didi

Linux根据usb口执行脚本

转载 作者:太空狗 更新时间:2023-10-29 11:21:20 27 4
gpt4 key购买 nike

您好,我正在研究安装在嵌入式系统上的 debian 系统。 PC 有 3 个 USB 端口,我们称之为 A、B、C。我想根据 USB 端口执行不同的脚本。我怎样才能做到这一点?

我找到了很多关于 udev 规则的文章,我有以下规则,如果我连接一个 usb,它就可以工作。

ACTION=="add", SUBSYSTEM=="block", KERNEL=="sd[a-z]1", SYMLINK+="usb_to_check", RUN+="/usr/local/bin/check-usb1.sh"

如何扩展此规则,使其仅在连接设备(比方说连接到 USB A)时才起作用?

最佳答案

lsusb 输出连接设备的 USB 总线和 USB 端口。在输出中,一些 USB 根集线器是内部 USB 集线器,还连接了蓝牙和网络摄像头等,请参阅 https://unix.stackexchange.com/questions/144029/command-to-determine-ports-of-a-device-like-dev-tty-usb0

您应该弄清楚您的外部端口连接在哪条 USB 总线上。在我的电脑上,所有外部 USB 端口都链接到 Bus 01

要执行此操作,请检查 lsusb -t 的输出,然后连接一个 USB 设备并再次检查 lsusb -t 的输出。然后你知道你的三个外部 USB 端口在你的设备内部 USB 结构树中有什么“地址”:

内部 USB 端口:

/:  Bus 04.Port 1: Dev 1, Class=root_hub, Driver=ohci_hcd/5p, 12M
/: Bus 03.Port 1: Dev 1, Class=root_hub, Driver=ohci_hcd/5p, 12M
/: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=ehci_hcd/5p, 480M
|__ Port 1: Dev 64, If 0, Class='bInterfaceClass 0x0e not yet handled', Driver=uvcvideo, 480M
|__ Port 1: Dev 64, If 1, Class='bInterfaceClass 0x0e not yet handled', Driver=uvcvideo, 480M

外部 USB 端口:

/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=ehci_hcd/5p, 480M
|__ Port 3: Dev 116, If 0, Class='bInterfaceClass 0xe0 not yet handled', Driver=rndis_host, 480M
|__ Port 3: Dev 116, If 1, Class=data, Driver=rndis_host, 480M

连接到外部端口 #2 的 USB 内存棒

/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=ehci_hcd/5p, 480M
|__ Port 2: Dev 119, If 0, Class=stor., Driver=usb-storage, 480M
|__ Port 3: Dev 116, If 0, Class='bInterfaceClass 0xe0 not yet handled', Driver=rndis_host, 480M
|__ Port 3: Dev 116, If 1, Class=data, Driver=rndis_host, 480M

完成此过程后,您将获得外部 USB 端口的“地址”

dmesg 中,连接的 USB 设备总是出现一行,其中包含 USB 总线和端口号:

[186067.360139] usb 1-1: new high-speed USB device number 123 using ehci_hcd is bus 001 port 001

[186067.360139] usb 1-2: new high-speed USB device number 123 using ehci_hcd is bus 001 port 002

[186067.360139] usb 1-3: new high-speed USB device number 123 using ehci_hcd is bus 001 port 003

在您的脚本中,您使用命令 dmesg | grep 这一行grep“USB 1” | tail -1 (tail -1 greps 最后一次出现,参见 http://www.stackoverflow.com/questions/24014194/how-to-grep-the-last-occurence-of-the-line-pattern )

可以直接使用命令获取端口号

dmesg | grep -o -P 'usb 1.{0,3}' |尾-1 |头-c 7 | tail -c 1(如果所有外部端口都在 Bus 001 上)

( Grep characters before and after match? , http://www.unix.com/unix-for-dummies-questions-and-answers/28542-how-do-i-get-nth-character-string.html )

这样你就可以得到最新的 USB 设备(你的设备)所连接的 USB 端口号,你可以在你的 udev 脚本中使用它(if ...)


您还可以在 /dev/bus/usb/ 文件系统中找到 USB 总线树结构,即 Bus 01 Port 1 是 /dev/bus/usb/001/001

参见 http://www.linuxnix.com/find-usb-device-details-in-linuxunix-using-lsusb-command/

关于Linux根据usb口执行脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42212938/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com