允许非 root 用户读/写 /dev 文件

Kit*_*Kit 10 permissions udev devices

在我的/dev文件夹中,我希望以下文件是用户可读和可写的:

/dev/ttyUSB0
/dev/gpib0
Run Code Online (Sandbox Code Playgroud)

我如何在不使用的情况下做到这一点chgrp?我可以编辑,/etc/udev/rules.d但我不知道语法。

Joh*_*024 12

udev 规则的结构

对于属于子系统 tty 的设备,您可以按如下方式设置它们的组:

SUBSYSTEM=="tty", GROUP="dialout"
Run Code Online (Sandbox Code Playgroud)

请注意,就像在普通编程中一样,==是对相等性的测试,而=是赋值。所以,上面的语句翻译成“if SUBSYSTEM=="tty"then assign GROUP="dialout"。一个语句可能有多个测试,它们是and-ed在一起,还有多个赋值。

如果您想更改读写执行权限,则分配 MODE 而不是 GROUP,其中 MODE 遵循通常的 Unix 八进制表示法,例如MODE="0660"赋予所有者和组读写权限。 man udev有所有的细节。

您可以在以下位置找到许多此类规则的示例 /lib/udev/rules.d/91-permissions.rules

如何向系统添加 udev 规则

一旦你确定了你想要的规则,添加它就很简单了。在 debian 派生系统上,转到该目录/etc/udev/rules.d并创建一个文件。文件按排序顺序运行。因此,要使您的规则文件最后被读取,覆盖较早的文件,请尝试使用类似99-instruments.rules. 然后将您的规则放在该文件中,每行一个。(如果需要,可以通过在行尾添加反斜杠来扩展行,就像在 shell 中一样。)

因此,如果您想更改 tty 设备上的组和权限,您的文件/etc/udev/rules.d/99-instruments.rules可以由单行组成:

SUBSYSTEM=="tty", GROUP="dialout", MODE="0660"
Run Code Online (Sandbox Code Playgroud)

为了确保您的新文件本身具有通常的权限:

sudo chown root:root /etc/udev/rules.d/99-instruments.rules
sudo chmod 0644 /etc/udev/rules.d/99-instruments.rules
Run Code Online (Sandbox Code Playgroud)

创建文件后,udevd 可能会自动读取它。如果没有,您可以强制它重新读取其文件:

udevadm control --reload-rules
Run Code Online (Sandbox Code Playgroud)

详细了解 udev 如何对设备进行分类

如果您想更好地控制哪些设备响应哪些规则,您可以通过仔细阅读 /sys/ 来了解有关 udev 如何查看您的设备的更多信息。目前,我无法访问带有 ttyUSB 或 HPIB 的机器,所以让我们以磁盘 sda 为例。跑:

udevadm info --attribute-walk --path=/sys/block/sda
Run Code Online (Sandbox Code Playgroud)

这提供了很多信息,如下所示:

. . . .
KERNEL=="sda"
SUBSYSTEM=="block"
DRIVER==""
ATTR{range}=="16"
ATTR{ext_range}=="256"
ATTR{removable}=="0"
. . . .
Run Code Online (Sandbox Code Playgroud)

这些行都是适合if在规则中用作子句的形式。因此,例如,要更改标记为不可移动的所有块设备的所有权,我们将使用以下规则:

SUBSYSTEM=="block", ATTR{removable}=="0", OWNER=john1024
Run Code Online (Sandbox Code Playgroud)

利用来自 的信息udevadm,人们可以制定可以专门针对感兴趣的设备的规则。


slm*_*slm 5

我想我会建议让规则比约翰的规则更严格一些。例如创建一个文件,如/etc/udev/rules.d/99-tty-dialout.rules

SUBSYSTEM=="tty", KERNEL=="ttyUSB0", GROUP="dialout", MODE="0660"
Run Code Online (Sandbox Code Playgroud)

您可以使用udevadm来确定设备SUBSYSTEM==KERNEL==值。例如:

$ udevadm info -a -n /dev/tty0

Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

  looking at device '/devices/virtual/tty/tty0':
    KERNEL=="tty0"
    SUBSYSTEM=="tty"
    DRIVER==""
    ATTR{active}=="tty1"
Run Code Online (Sandbox Code Playgroud)