使用 lsusb 获取 iSerial,无需 sudo

使用 lsusb 获取 iSerial,无需 sudo

在我的 sudoer 用户(非 root)下,我可以看到我的设备带有lsusb.但是,要查看 iSerial 号,我需要发出lsusb -v,我确实打印了很多信息,但消息“无法打开设备,某些信息将丢失”也会出现在输出中。 iSerial 是缺失的信息之一。使用sudo lsusb -v效果很好。

我尝试过sudo chmod -R o+rw /dev/bus/usb,之后我可以在没有 sudo 的情况下检查 iSerial。但重启后就不行了。当新设备插入时也没有帮助。

有没有更好的方法来做到这一点?

答案1

如果 udev 注意到了该设备,您也许能够从 udev 获取信息。例如我有一个 UPS 设备

$ lsusb | grep UPS
Bus 004 Device 041: ID 0463:ffff MGE UPS Systems UPS

使用总线和设备号 (004/041),我无需成为 root 即可从 udevadm 获取信息。这包括与 iSerial 值相同的 ID_SERIAL_SHORT 值。

$ udevadm info -p $(udevadm info -q path -n /dev/bus/usb/004/041)
P: /devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.4/4-1.4.2
N: bus/usb/004/041
E: DEVNAME=/dev/bus/usb/004/041
E: DEVPATH=/devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.4/4-1.4.2
E: DEVTYPE=usb_device
E: DRIVER=usb
E: ID_BUS=usb
...
E: ID_SERIAL=EATON_ELLIPSE_BX9M050Z1
E: ID_SERIAL_SHORT=BX9M050Z1
...

$ sudo lsusb -v -s 004:041 | grep iSerial
iSerial                 4 BX9M050Z1

答案2

根据stracelsof打开具有读写权限的设备文件:

open("/dev/bus/usb/003/001", O_RDWR)    = -1 EACCES (Permission denied)

您可以使用能力lsusbCAP_DAC_OVERRIDE 赋予 root 权限,仅向特定用户运行的实用程序读写系统中的任何文件。

这个答案提供如何设置功能的一般说明。在你的情况下/etc/security/capabilities.conf应该是这样的:

CAP_DAC_OVERRIDE        your_username
none    *

更改将在下次登录时发生。重新启动是最简单的选择。检查用户能力:

$ capsh --print
Current: = cap_dac_override+i
...

实用程序设置功能lsusb

$ setcap CAP_DAC_OVERRIDE+ie /bin/lsusb
$ getcap /bin/lsusb
/bin/lsusb = cap_dac_override+ie

答案3

您还可以专门为此设备编写 udev 规则。

纳米 /etc/udev/rules.d/NN-Your_set_of_rules.rules

# My Device which should not have admin rights
ATTRS{idVendor}=="1234", ATTRS{idProduct}=="0042", MODE="664", GROUP="plugdev"

vid/pid: 1234/0042 的设备仍将由 root 拥有,但将被分配到组“plugdev”。如果您的用户是该组的成员,您将拥有该组的访问权限。您可以选择您想要的任何其他组。模式是设备权限的二进制代码。所有者和组可以写入和读取其他人只能读取设备。

之后您可以运行lsusb -v检索 iSerial。

相关内容