如何将USB设备UUID与MODEL和VENDOR相匹配?

如何将USB设备UUID与MODEL和VENDOR相匹配?

我正在开发一个用于管理连接到我的机器的 USB 设备的工具。

在某一时刻,我需要将 UUID 与供应商和型号相匹配,因此我使用了以下命令:

# lsblk -o UUID,MODEL,VENDOR,TRAN
5A26-0601                            USB3.0 CRW   -SD Generic- usb
                                     Voyager 3.0      Corsair  usb
7936-E126                                                      

最终它必须双向工作:有时我只有一个 UUID,我需要找到 MODEL/VENDOR,有时我有 MODEL 或 VENDOR,我需要找到所有匹配的 UUID。

对于设备来说,5A26-0601一切都是按顺序进行的 - 数据字段都在一行中,我可以随心所欲地使用grepcut等。awk

对于其他设备则不然 - 由于某种原因,UUID 位于其余信息下方一行。如果7936-E126是唯一连接的设备,则这仍然成立。 UUID的长度不可能是原因,因为它们都包含9个字符。

如果我尝试添加带有设备位置的参数,我只能获得以下有用信息5A26-0601

# lsblk -o UUID,MODEL,VENDOR,TRAN /dev/disk/by-uuid/5A26-0601
UUID                                 MODEL            VENDOR   TRAN
5A26-0601                            USB3.0 CRW   -SD Generic- usb
# lsblk -o UUID,MODEL,VENDOR,TRAN /dev/disk/by-uuid/7936-E126
UUID                                 MODEL VENDOR TRAN
7936-E126                                         

如何获取所有设备所需的全部数据?是lsblk适合这项工作的正确工具,而我只是错误地使用了它,我应该使用其他工具,还是这是我能得到的最好工具,我必须提高我的脚本技能并尝试解析我现在得到的结果?

它必须在嵌入式环境中工作,所以我更喜欢使用尽可能简单的工具。

答案1

我已经成功解决了我的问题udevadm

MODEL和VENDOR可以通过查询属性并grep相关信息来获取:

# udevadm info --query property /dev/disk/by-uuid/7936-E126 | grep "ID_VENDOR=\|ID_MODEL="
ID_MODEL=Voyager_3.0
ID_VENDOR=Corsair
# udevadm info --query property /dev/disk/by-uuid/5A26-0601 | grep "ID_VENDOR=\|ID_MODEL="
ID_MODEL=USB3.0_CRW_-SD
ID_VENDOR=Generic-

因此,现在我可以轻松、明确地访问给定 UUID 的 MODEL 和 VENDOR。

目前,逆转此过程的唯一方法是迭代所有设备,并仅选择具有属性ID_BUS=usb和匹配供应商或型号的设备,但考虑到原始问题的范围,这个答案就足够了。

相关内容