Разрешить некорневому пользователю читать / записывать / разрабатывать файлы

8

В моей /devпапке я хотел бы, чтобы следующие файлы были доступны для чтения и записи для пользователя:

/dev/ttyUSB0
/dev/gpib0

Как мне сделать это без использования chgrp? Я могу редактировать, /etc/udev/rules.dно я не знаю синтаксис.

Комплект
источник
1
Почему вы хотите дать им права на чтение / запись?
SLM
Я использую этот ПК в качестве контроллера для нескольких устройств тестирования и измерительных приборов (осциллографы, измерители мощности и т. Д.). Все операции чтения / записи будут выполняться скриптами и библиотеками Python. Сам пользователь не будет выполнять чтение / запись на низком уровне. Давайте предположим, что система бесконечно безопасна. Я бы хотел, чтобы моим коллегам по лаборатории было удобно писать сценарии для инструментов.
Кит
3
Почему бы просто не дать коллегам доступ к sudo?
SLM

Ответы:

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 классифицирует устройства

Если вы хотите лучше контролировать, какие устройства реагируют на какие правила, вы можете узнать больше о том, как udev видит ваши устройства, просматривая / sys /. На данный момент у меня нет доступа к машине с 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положений в правилах. Так, например, чтобы изменить владельца на всех блочных устройствах, помеченных как несъемные, мы бы использовали правило:

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

С помощью информации udevadmможно разработать правила, которые могут быть нацелены конкретно на интересующие устройства.

John1024
источник
Первый пример должен иметь запятую, а не точку, перед MODE =
Джим Хунцикер
1
@JimHunziker Спасибо за это. Опечатка теперь исправлена.
John1024
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"
SLM
источник