您好我正在研究安装在嵌入式系统上的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 ??
答案 0 :(得分:0)
SSLHashSHA1::update(&hashCtx, &serverRandom))
输出连接设备的USB总线和USB端口。在输出中,一些USB根集线器是内部USB集线器,也附有蓝牙和网络摄像头等,请参阅https://unix.stackexchange.com/questions/144029/command-to-determine-ports-of-a-device-like-dev-tty-usb0
你应该弄清楚外部端口连接的USB总线。在我的计算机上,所有外部USB端口都链接到lsusb
执行此操作检查Bus 01
的输出,然后附加USB设备并再次检查lsusb -t
的输出。然后你知道你的三个外部usb端口在你的设备内部usb结构树中有什么“地址”:
内部USB端口:
lsusb -t
外部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
连接到外部端口#2的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端口的“地址”
在/: 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设备始终显示一条包含USB总线和端口号的行:
dmesg
是总线001端口001
[186067.360139] usb 1-1: new high-speed USB device number 123 using ehci_hcd
是总线001端口002
[186067.360139] usb 1-2: new high-speed USB device number 123 using ehci_hcd
是总线001端口003
在你的脚本中,你使用命令[186067.360139] usb 1-3: new high-speed USB device number 123 using ehci_hcd
grep这一行(尾部-1 greps最后一次出现,见http://www.stackoverflow.com/questions/24014194/how-to-grep-the-last-occurence-of-the-line-pattern)
您可以使用命令
直接获取端口号 dmesg | grep "usb 1" | tail -1
(如果所有外部端口都在dmesg | grep -o -P 'usb 1.{0,3}' | tail -1 | head -c 7 | tail -c 1
上)
(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端口号,您可以在Bus 001
脚本(udev
)中使用
您还可以在if ...
文件系统中找到USB总线树结构,即总线01端口1为/dev/bus/usb/
请参阅http://www.linuxnix.com/find-usb-device-details-in-linuxunix-using-lsusb-command/
答案 1 :(得分:0)
有一个更好的解决方案。您可以使用/dev/x
根据标记的vendorID
和productID
指定特定的udev
设备节点,请参阅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
并从中获取USB端口号(参见其他答案......)