我正在开发一个用于管理连接到我的机器的 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
一切都是按顺序进行的 - 数据字段都在一行中,我可以随心所欲地使用grep
、cut
等。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
和匹配供应商或型号的设备,但考虑到原始问题的范围,这个答案就足够了。