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


8

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

/dev/ttyUSB0
/dev/gpib0

不使用该怎么办chgrp?我可以编辑,/etc/udev/rules.d但不知道语法。


1
您为什么要授予这些读取/写入权限?
slm

我将这台PC用作多个测试和仪器设备(示波器,功率计等)的控制器。所有读/写操作都将由Python脚本和库完成。用户自己不会进行任何低级的读/写操作。假设系统是无限安全的。我想方便实验室同事编写仪器脚本。
2014年

3
为什么不只给同事sudo访问权限呢?
slm

Answers:


11

udev规则的结构

对于属于子系统tty的设备,可以如下设置其组:

SUBSYSTEM=="tty", GROUP="dialout"

请注意,就像在普通编程中一样,==它是对相等性的测试,=而是赋值。因此,以上语句转换为“如果SUBSYSTEM=="tty"则赋值GROUP="dialout"。”一条语句可能具有多个测试,这些测试与和在一起,并且具有多个赋值。

如果要更改读写执行权限,请分配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"

为确保新文件本身具有通常的权限,请执行以下操作:

sudo chown root:root /etc/udev/rules.d/99-instruments.rules
sudo chmod 0644 /etc/udev/rules.d/99-instruments.rules

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

udevadm control --reload-rules

有关udev如何对设备进行分类的更多信息

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

udevadm info --attribute-walk --path=/sys/block/sda

这给出了很多信息,如下所示:

. . . .
KERNEL=="sda"
SUBSYSTEM=="block"
DRIVER==""
ATTR{range}=="16"
ATTR{ext_range}=="256"
ATTR{removable}=="0"
. . . .

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

SUBSYSTEM=="block", ATTR{removable}=="0", OWNER=john1024

利用的信息udevadm,可以开发出可以针对特定目标设备的规则。


第一个例子应该有一个逗号,不是句号,模式之前=
吉姆Hunziker

1
@JimHunziker谢谢你。现在纠正了错别字。
John1024 '18

4

我认为我建议使该规则比约翰的规则更具限制性。例如,创建一个文件,例如/etc/udev/rules.d/99-tty-dialout.rules

SUBSYSTEM=="tty", KERNEL=="ttyUSB0", GROUP="dialout", MODE="0660"

您可以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"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.