Linux基于USB端口执行脚本

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

我发现了很多关于udev规则的文章,并且我有下面的规则,如果我连接一个usb,它的工作原理。

ACTION=="add", SUBSYSTEM=="block", KERNEL=="sd[az]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-一个设备类-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 

USB连接到外部端口#2

 /: 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是总线001端口001

[186067.360139] usb 1-2: new high-speed USB device number 123 using ehci_hcd是总线001端口002

[186067.360139] usb 1-3: new high-speed USB device number 123 using ehci_hcd是总线001端口003

在你的脚本中使用dmesg | grep "usb 1" | tail -1命令来grep这一行 dmesg | grep "usb 1" | tail -1 dmesg | grep "usb 1" | tail -1 (尾巴-1 greses最后发生,见http://www.stackoverflow.com/questions/24014194/how-to-grep-the-last-occurence-of-the-line-pattern

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

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

( grep匹配之前和之后的字符 , 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/ file系统中找到USB总线树结构,即总线01端口1是/dev/bus/usb/001/001

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

有一个更好的解决方案 。 您可以使用udev根据vendorIDproductID分配特定的/dev/x设备节点,请参阅https://askubuntu.com/questions/127695/force-specific-letter-for-usb-drive-in-dev -sd (x是一个任意的名字)

通过此固定设备节点,您可以使用udevadm查询设备所连接的USB端口

udevadm info --query=all --attribute-walk --name/dev/x

并grep从它的USB端口号(见其他答案…)