Linux基于usb端口执行脚本

时间:2017-02-13 20:28:01

标签: linux usb symlink udev mount-point

您好我正在研究安装在嵌入式系统上的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 ??

2 个答案:

答案 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根据标记的vendorIDproductID指定特定的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端口号(参见其他答案......)