Permitir que o usuário não raiz leia / grave / arquivos dev

8

Na minha /devpasta, gostaria que os seguintes arquivos fossem legíveis e graváveis ​​pelo usuário:

/dev/ttyUSB0
/dev/gpib0

Como faço isso sem usar chgrp? Eu posso editar, /etc/udev/rules.dmas não conheço a sintaxe.

Kit
fonte
1
Por que você deseja conceder permissões de leitura / gravação a eles?
slm
Estou usando este PC como um controlador para vários dispositivos de teste e instrumentação (osciloscópios, medidores de energia, etc.) Todas as leituras / gravações serão feitas por scripts e bibliotecas Python. Nenhuma leitura / gravação de baixo nível será feita pelo próprio usuário. Vamos supor que o sistema seja infinitamente seguro. Gostaria de tornar conveniente para meus colegas de laboratório a escrita de scripts para os instrumentos.
Kit
3
Por que não apenas dar aos colegas acesso ao sudo?
slm

Respostas:

11

Como as regras do udev são estruturadas

Para dispositivos que se enquadram no subsistema tty, você pode definir o grupo deles da seguinte maneira:

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

Observe que, assim como na programação comum, ==é um teste de igualdade enquanto =é uma atribuição. Portanto, a instrução acima se traduz em "se for SUBSYSTEM=="tty"atribuída GROUP="dialout". Uma instrução pode ter vários testes, que são editados juntos e várias atribuições.

Se você quiser alterar as permissões de leitura-gravação-execução, atribua MODE em vez de GROUP, onde MODE segue a notação octal usual do Unix, por exemplo, MODE="0660"concede permissões de leitura e gravação ao proprietário e ao grupo. man udevtem todos os detalhes.

Você pode encontrar muitos exemplos dessas regras em /lib/udev/rules.d/91-permissions.rules

Como adicionar uma regra udev ao seu sistema

Depois de decidir o que você deseja que sua regra seja, é simples o suficiente adicioná-la. Em um sistema derivado do debian, vá para o diretório /etc/udev/rules.de crie um arquivo. Os arquivos são executados em ordem de classificação. Portanto, para tornar seu arquivo de regras o último a ser lido, substituindo os anteriores, tente um nome como 99-instruments.rules. Em seguida, coloque suas regras nesse arquivo, uma por linha. (Se necessário, as linhas podem ser estendidas colocando uma barra invertida no final da linha, como no shell.)

Portanto, se você deseja alterar o grupo e as permissões em dispositivos tty, seu arquivo /etc/udev/rules.d/99-instruments.rulespode consistir na única linha:

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

Para garantir que seu novo arquivo tenha as permissões usuais:

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

Depois de criar seu arquivo, o udevd poderá lê-lo automaticamente. Caso contrário, você pode forçá-lo a reler seus arquivos com:

udevadm control --reload-rules

Mais sobre como o udev classifica os dispositivos

Se você deseja obter um controle mais preciso sobre quais dispositivos respondem a quais regras, pode aprender mais sobre como o udev vê seus dispositivos lendo / sys /. No momento, não tenho acesso a uma máquina com um ttyUSB ou um HPIB, então vamos fazer um exemplo de sda ​​de disco. Corre:

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

Isso fornece muitas informações parecidas com:

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

Essas linhas estão todas na forma adequada para usar como ifcláusulas nas regras. Portanto, por exemplo, para alterar a propriedade em todos os dispositivos de bloco marcados como não removíveis, usaríamos a regra:

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

Com as informações de udevadm, é possível desenvolver regras que podem direcionar especificamente os dispositivos de interesse.

John1024
fonte
O primeiro exemplo deve ter uma vírgula, e não um ponto, antes de MODE =
913 Jim Hunziker
1
@ JimHunziker Obrigado por isso. O erro de digitação está agora corrigido.
precisa saber é o seguinte
4

Acho que sugiro tornar a regra um pouco mais restritiva que a de John. Por exemplo, crie um arquivo como /etc/udev/rules.d/99-tty-dialout.rules:

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

Você pode usar udevadmpara determinar dispositivos SUBSYSTEM==e KERNEL==valores. Por exemplo:

$ 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
fonte