uinput и установка прав доступа к файлам с помощью chmod или правил

Я пишу псевдокорпированный переназначение клавиатуры здесь, используя evdev и uinput. Я не хочу давать своему обычному пользователю разрешение на чтение и запись в / dev / input / event * и / dev / uinput, поэтому я создал нового пользователя (hopr) с единственной целью - запустить программу. Пытаясь заставить это работать, я заметил очень странное поведение с uinput, которое, я надеюсь, кто-то может объяснить.

Чтобы убедиться, что речь идет об uinput и ничего более, я написал простой тестовый скрипт с использованием python-evdev:

from evdev import UInput, ecodes
KEY_RELEASE = 0L
KEY_PRESS = 1L

ui = UInput()
ui.write(ecodes.EV_KEY, ecodes.KEY_A, KEY_PRESS)
ui.write(ecodes.EV_KEY, ecodes.KEY_A, KEY_RELEASE)
ui.syn()
ui.close()

Я также создал нового пользователя с именем hopr и новую группу с именем uinput и добавил hopr в группу uinput и input (для чтения событий). План состоит в том, чтобы изменить группу / dev / uinput на uinput и иметь только разрешение rw для группы. Группы для двух пользователей:

user: user adm cdrom sudo dip plugdev lpadmin sambashare 
hopr: hopr input uinput

Для начала я просто попытался запустить скрипт без изменения группы и без дополнительных правил в /etc/udev/rules.d. По умолчанию права доступа к / dev / uinput в XUbuntu 16.04 равны rw для пользователя root и группы root.

crw-rw----+ 1 root root 10, 223 mar 23 09:36 /dev/uinput
user> python test.py # OK
hopr> python test.py # evdev.uinput.UInputError: "/dev/uinput" cannot be opened for writing

Я был немного удивлен, увидев, что мой обычный пользователь смог запустить скрипт, но новый пользователь не смог. Далее я добавил разрешение rw для всех, кто использует chmod:

crw-rw-rw-+ 1 root root 10, 223 mar 23 09:36 /dev/uinput
user> python test.py # OK
hopr> python test.py # OK

ОК, это было, как и ожидалось. Затем я снова удалил rw для всех и изменил группу на uinput с помощью chown:

crw-rw----+ 1 root uinput 10, 223 mar 23 09:36 /dev/uinput
user> python test.py # OK
hopr> python test.py # evdev.uinput.UInputError: "/dev/uinput" cannot be opened for writing

Опять же, это было неожиданно, но стало еще хуже. Затем я снова добавил разрешения rw для всех, но оставил группу uinput

crw-rw-rw-+ 1 root uinput 10, 223 mar 23 09:36 /dev/uinput
user> python test.py # OK
hopr> python test.py # evdev.uinput.UInputError: "/dev/uinput" cannot be opened for writing

Теперь я в замешательстве, но при смене группы на root с помощью chown она снова работает

crw-rw-rw-+ 1 root root 10, 223 mar 23 09:36 /dev/uinput
user> python test.py # OK
hopr> python test.py # OK

Ясно, что здесь есть вещи, которые я не понимаю, поэтому я также попытался правильно их настроить с помощью правила в /dev/udev/rules.d:

KERNEL=="uinput*", GROUP="uinput", MODE="0660"

К моему большому удивлению, все работает (почти), как и ожидалось! Пользователь с ограниченными правами может запускать программу без прав доступа для всех. Единственный вопрос, почему мой обычный пользователь также может запустить его.

crw-rw----+ 1 root uinput 10, 223 mar 23 09:58 /dev/uinput
user> python test.py # OK
hopr> python test.py # OK

Итак, мои вопросы:

  1. Почему мой пользователь по умолчанию может использовать / dev / uinput, несмотря на то, что права доступа к файлам говорят, что я не должен этого делать? Как мне его выключить?
  2. Почему я не могу просто отбить группу? Почему я должен использовать правила в /etc/udev/rules.d?
  3. Что на самом деле происходит с chmod / chown, rules и uinput? Почему пользователь с ограниченными правами не может использовать uinput несмотря на rw для всех, когда группа прерывается на uinput, но МОЖЕТ, когда группа является root?
  4. Является ли использование правила в /etc/udev/rules.d правильным способом для его настройки? Могу ли я ожидать, что такая установка будет работать на всех версиях Linux? Я заметил, что Ubuntu 15.04 имеет разные разрешения по умолчанию для /dev/uinput.

0 ответов

Другие вопросы по тегам