在我的 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)
您可以使用能力lsusb
CAP_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。