配置 udev 以更改 USB HID 设备的权限?

erj*_*ang 25 input-devices usb udev

我有一个 USB 秤,一个 USB HID。目前,当它插入时,权限只允许超级用户访问它。如何配置 udev 以允许任何人访问此设备?我有供应商和产品 ID,但我想根据 HID 类型来匹配它。

现在,我很难找到任何适用于此的现有规则(我在/lib/udev/rules.d和 中搜索了“hidraw” /etc/udev/rules.d,等等)。

Kee*_*ook 27

通常,这是通过添加到/etc/udev/rules.d可能以如下50-usb-scale.conf内容命名的文件来完成的:

SUBSYSTEM=="usb", ATTR{idVendor}=="HEX1", ATTR{idProduct}=="HEX2", MODE="0666"
Run Code Online (Sandbox Code Playgroud)

其中HEX1HEX2分别替换为供应商和产品 ID。

要匹配的接口类型,而不是,你可以尝试更换ATTR{idVendor}=="HEX1", ATTR{idProduct}=="HEX2"一个匹配的bInterfaceClass03(HID):

SUBSYSTEM=="usb", ATTR{bInterfaceClass}=="03", MODE="0666"
Run Code Online (Sandbox Code Playgroud)

但请注意,这也会抓住鼠标和键盘。

  • 在 ubuntu 14.04 上你必须使用 MODE:="0666",没有冒号,规则什么都不做。 (5认同)
  • 在 14.04 这个文件必须有一个 `.rules` 扩展名。带有`.conf` 扩展名的文件将不起作用。 (2认同)
  • 使用 `lsusb -vvv` 获取 idProduct 和 idVendor (2认同)
  • 由于这个问题在谷歌输出中非常流行......我认为它应该是ATTRS,而不是ATTR - 至少这个变化为我修复了它。 (2认同)
  • 在 14.04.5 LTS 上,我发现:`lsusb` 是查看连接和 ID 的良好开端。`idVendor` 和 `idProduct` 匹配似乎*区分大小写*,所以 ID `DA77` 对我不起作用,但 `da77` 可以。(方便的诊断:`udevadm info --attribute-walk /dev/bus/usb/008/023`,bus 008 device 023 我的例子;`lsusb` 为你的。)添加规则后,`sudo udevadm control --reload -rules` 然后是 `sudo udevadm trigger` 避免重启:更改是*之后*秒。ATTR 对 ATTRS 没有胜算。我的 .rules 文件显示:`SUBSYSTEM=="usb", ATTR{idVendor}=="da77", ATTR{idProduct}=="d12e", GROUP="users", MODE="0666"`。 (2认同)

run*_*gel 7

仅作总结:

您可以过滤:

  • 供应商
  • id产品
  • 连续剧

并使用:

== 比较是否相等。

!= 比较不平等。

= 为键分配一个值。表示列表的键被重置,并且只分配这个单个值。

+= 将值添加到包含条目列表的键。

:= 最后给一个键赋值;禁止任何以后的更改。

您可以在 /dev/... 中为特定设备提供特定的新路径。
例如:

KERNEL=="hiddev*", ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="05df", ATTRS{serial}=="1234567", GROUP="cdrom", OWNER="user28", MODE="0640", SYMLINK+="myhid"
Run Code Online (Sandbox Code Playgroud)

结果是:

您可以通过“/dev/hiddevx”或“/dev/myhid”轻松访问设备,“cdrom”组中的每个用户都可以从设备中读取。所有者“user28”可以读写。

或最简单的:

KERNEL=="hiddev*", ATTRS{idVendor}=="16c0", MODE="0666"
Run Code Online (Sandbox Code Playgroud)

结果:每个用户都可以从供应商 0x16c0 访问每个 hiddevice

详情见:文档

  • `:=` 不用于比较。[文档](https://www.freedesktop.org/software/systemd/man/udev.html#:=) 说“最后为键分配一个值;不允许以后进行任何更改。” (3认同)

小智 5

如果您需要更改(像我一样)ttyACM0权限,这是我的设置:

KERNEL=="ttyACM0", MODE="0777"
Run Code Online (Sandbox Code Playgroud)

当我尝试指定供应商和产品 ID 时它失败了。我不知道为什么。


小智 5

Ubuntu 18.04 更新/说明:

Kees Cook 的答案很接近,但需要进行 2 处更改才能在 18.04 中工作(当前版本,也是我测试过的唯一一个版本)。

  1. 使用lsusb查找您的 idVendor 和 idProduct 。
    • 这将是“ID”之后的 2 个十六进制值,以冒号分隔。我正在添加扫描仪。lsusb 给了我:
      总线 001 设备 011:ID 04b8:014a 精工爱普生公司
  2. root身份将文件添加到/etc/udev/rules.d
    • 类似于50-usb-epsonscanner.rules
    • 扩展名必须是“.rules”  
  3. 在该文件中添加:
    子系统==“usb”,ATTRS {idVendor}==“04b8”,ATTR {idProduct}==“014a”,MODE =“0666”
    但使用您的 idVendor 和 idProduct 十六进制值。
    • 请注意,它是“ATTRS”而不是“ATTR”。
  4. 重新登录。无需重新启动。