Правило udev для блокировки сессии при удалении ключа hid
Я пытаюсь заблокировать сеанс при удалении моего скрытого устройства с ключом 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
Может кто-нибудь мне помочь?
3 ответа
Предположим, вы используете дистрибутив, использующий systemd. Если так ...
Посмотрите на эту страницу , чтобы получить информацию о том, как получить ключевую информацию об устройстве для включения в правило, чтобы она соответствовала конкретному событию, связанному с удалением (их будет несколько), а затем в части RUN правила поместите/usr/bin/loginctl lock-sessions
. Перезагрузите правила udev, вытащите ключ, и ваш экран заблокируется, как и все сеансы на этом компьютере.
Чтобы заблокировать один сеанс, вам нужно будет найти идентификатор вашего конкретного сеанса и заблокировать только его, но если у вас есть root, вы, вероятно, будете иметь всю эту машину в своем распоряжении. Блокировка всех сеансов в большинстве случаев не является проблемой.
И все готово.
Наиболее вероятное объяснение состоит в том, что команда gnome-screensaver-command при запуске в контексте, который предоставляет udev, не имеет представления, чья заставка на каком дисплее она должна командовать - она не работает под вашей учетной записью пользователя и не имеет среды переменные, которые распространяются на протяжении всего сеанса пользователя X
Подход, который, вероятно, может быть реализован:
- запустите команду gnome-screensaver-command под пользователем su
- убедитесь, что для переменной среды DISPLAY установлено то же значение, что и для терминала в сеансе X
- убедитесь, что права доступа к вашему сеансу X установлены - это потребует некоторых действий с xauth и / или xhost, детали очень зависят от вашей точной настройки
Чтобы объяснить проблему более подробно: X11, который gnome использует в качестве своей инфраструктуры, допускает такие сценарии, как "несколько независимых сеансов, которые могут быть все с разными учетными записями пользователей, подключенными с помощью функциональных клавиш или подключенными к разным мониторам и мышам / клавиатурам". " ("Multiseat") и" фактический сеанс выполняется на другом компьютере, чем тот, к которому подключены монитор и устройства HID "(здесь ключевое слово"XDMCP"). "Один сеанс, один пользователь" на самом деле является лишь одним из возможных вариантов использования, и единственный, в котором команда, вмешивающаяся во что-либо в таком сеансе, но не являющаяся его частью, может знать, как правильно реагировать, но в нее не встроено никаких специальных положений. для этого случая.
На странице написано:
RUN{type} ... 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 явно написано, чтобы позволить это, даже если многие люди не знают и не используйте эту функцию.