你好,我正在安装在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
根据vendorID
和productID
分配特定的/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端口号(见其他答案…)