Правило udev для блокировки сессии при удалении ключа hid

401
dkbhadeshiya

Я пытаюсь заблокировать сеанс при удалении моего скрытого устройства с ключом HyperFIDO U2F. Однако после многих попыток я не добился успеха.

Я попытался создать правило udev, /etc/udev/rules.d/50-lockscreen.rulesкоторое выглядит так:

SUBSYSTEM="hid", ACTION=="remove", RUN+="/usr/local/bin/lock.sh" 

Сценарий, к которому он обращается, lock.shвыглядит так:

#!/bin/bash /usr/bin/gnome-screensaver-command --lock 

Может кто-нибудь мне помочь?

1

2 ответа на вопрос

0
rackandboneman

Наиболее вероятное объяснение состоит в том, что команда gnome-screensaver-command при запуске в контексте, который предоставляет udev, не знает, чья заставка на каком дисплее она должна командовать - она ​​не работает под вашей учетной записью пользователя и не имеет среды переменные, которые распространяются на протяжении всего сеанса пользователя X

Подход, который, вероятно, может быть реализован:

  • запустите команду gnome-screensaver-command под пользователем su
  • убедитесь, что для переменной среды DISPLAY установлено то же значение, что и для терминала в сеансе X
  • убедитесь, что права доступа к вашему сеансу X установлены - это потребует некоторых действий с xauth и / или xhost, детали очень зависят от вашей точной настройки

Чтобы объяснить проблему более подробно: X11, который gnome использует в качестве своей инфраструктуры, допускает такие сценарии, как «несколько независимых сеансов, которые могут быть все с разными учетными записями пользователей, подключенными с помощью функциональных клавиш или подключенными к разным мониторам и мышам / клавиатурам». «(« Multiseat ») и« фактический сеанс работает на другом компьютере, чем тот, к которому подключены монитор и устройства HID »(здесь ключевое слово« XDMCP »). «Один сеанс, один пользователь» на самом деле является лишь одним из возможных вариантов использования, и единственный, в котором команда, вмешивающаяся во что-либо в таком сеансе и не являющаяся его частью, может знать, как правильно реагировать, но в нее не встроены специальные положения. для этого случая.

0
dirkt

На странице написано:

 RUN ... This can only be used for very short-running foreground tasks. Running an event process for a long period of time may block all further events for this or a dependent device.  Starting daemons or other long-running processes is not appropriate for udev; the forked processes, detached or not, will be unconditionally killed after the event handling has finished. 

Так что вы не можете делать это в правилах udev. Но вы можете использовать правило udev для связи с другой программой, которую вы запускаете при входе в систему, которая затем включает заставку. Это также решает проблему предоставления этой программе правильного ОТОБРАЖЕНИЯ, авторизованных файлов cookie и т. Д.

Это также решает проблему того, что должно произойти, если несколько пользователей вошли в систему и использовали X (физически, если есть несколько экранов, или удаленно), потому что X явно написано, чтобы позволить это, даже если многие люди не знают и не используйте эту функцию.