Запустите блокировку экрана в пользовательской сессии из системного сервиса systemd.

Вопрос или проблема

Я видел этот вопрос, но сложность ответа заставляет меня сомневаться, на правильном ли я пути.

Я хочу настроить Ubuntu так, чтобы экран блокировался при приостановлении работы. Я также хочу сделать это правильно, даже если мой фактический случай использования этого не требует, ради получения опыта.

Что я хочу достичь:

  • Системная настройка для запуска блокировщика экрана для любого пользователя, вошедшего в систему на компьютере, при закрытой крышке
  • Каждый пользователь может использовать переменные окружения для указания директории с изображениями, которые будут использоваться блокировщиком экрана.

Что у меня есть на данный момент:

  • скрипт в /usr/local/bin для запуска блокировки экрана. Это использует xsecurelock
  • установлен xsecurelock
  • сервис в /etc/systemd/system, который вызывает скрипт с помощью ExecStart

Моя проблема заключается в том, чтобы позволить systemd запустить скрипт запуска в текущей активной сессии.

Я мог бы получить активную сессию с помощью этого:

for session_id in $(loginctl list-sessions --no-legend | awk '{ print $1 }') ; do
    state=$(loginctl show-session -p State --value $session_id)
    if [[ "$state" == "active" ]] ; then
        active_session_id=$session_id
        active_user=$(loginctl show-session -p User --value $session_id)
    fi
done

, но я не знаю, как вызвать скрипт в этой существующей сессии.

Мне кажется, что может быть более простой способ сделать это. Должен ли я создать сервис пользователя systemd? В этом случае, как я могу убедиться, что у всех пользователей есть такой сервис?

Ответ или решение

Как запустить экранный замок в сеансе пользователя с помощью системного сервиса systemd

Для настройки автоматического запуска экранного замка при переходе системы в спящий режим с использованием systemd, вам необходимо учесть несколько ключевых аспектов. Ваша цель заключается в том, чтобы обеспечить, чтобы любой пользователь, который вошел в систему, получал экранный замок при закрытии крышки. Давайте проанализируем, как это можно реализовать на Ubuntu.

Шаг 1: Подготовка скрипта для запуска экранного замка

Вы уже упомянули наличие скрипта в /usr/local/bin, который запускает xsecurelock. Убедитесь, что ваш скрипт корректно работает независимо от того, откуда он вызывается. Пример простого скрипта:

#!/bin/bash
export DISPLAY=:0
export XAUTHORITY=/home/<имя_пользователя>/.Xauthority
exec xsecurelock

Замените <имя_пользователя> на имя пользователя, чей сеанс вы хотите управлять. Этот скрипт должен иметь права на выполнение:

sudo chmod +x /usr/local/bin/your-lock-script.sh

Шаг 2: Создание системного сервиса systemd

Теперь создайте системный сервис в /etc/systemd/system, например, screenlocker.service:

[Unit]
Description=Screen Locker on Suspend
After=suspend.target

[Service]
Type=oneshot
ExecStart=/usr/local/bin/your-lock-script.sh
User=<имя_пользователя>
Environment=DISPLAY=:0
Environment=XAUTHORITY=/home/<имя_пользователя>/.Xauthority

[Install]
WantedBy=suspend.target

Не забудьте заменить <имя_пользователя> на актуальное имя пользователя.

Шаг 3: Активировать и протестировать сервис

После создания сервиса активируйте его:

sudo systemctl enable screenlocker.service

Теперь протестируйте его, сработает ли замок, когда вы переводите систему в спящий режим:

sudo systemctl suspend

Шаг 4: Использование переменных окружения для пользовательских настроек

Чтобы каждый пользователь мог настраивать свою переменную окружения, вы можете добавить в скрипт проверки на наличие настроек в домашней директории пользователя. Например:

#!/bin/bash
USER_IMAGES_DIR="${HOME}/.screenlocker/images"
if [ -d "$USER_IMAGES_DIR" ]; then
    export SCREENLOCK_IMAGES="$USER_IMAGES_DIR"
fi
export DISPLAY=:0
export XAUTHORITY=${HOME}/.Xauthority
exec xsecurelock

Шаг 5: Рассмотрение возможности создания юзер-сервиса systemd

Как альтернатива, вы можете создать юзер-сервис systemd, чтобы управлять экранным замком для каждого пользователя индивидуально. Это позволит каждому пользователю иметь свою настройку, и сервис будет работать только в контексте його сессии. Однако это потребует, чтобы каждый пользователь сам создавал и активировал свой сервис.

Пример для создания юзер-сервиса:

  1. Перейдите в директорию юзер-сервисов:
mkdir -p ~/.config/systemd/user
  1. Создайте файл в этой директории, например, screenlocker.service:
[Unit]
Description=Screen Locker on Suspend
After=suspend.target

[Service]
ExecStart=/usr/local/bin/your-lock-script.sh

[Install]
WantedBy=suspend.target
  1. Затем активируйте сервис для текущего пользователя:
systemctl --user enable screenlocker.service

Заключение

Настройка автоматического запуска экранного замка при переходе в спящий режим — это полезное и практическое решение для повышения безопасности вашей системы. Ваша реализация может варьироваться от системного сервиса, обслуживающего всех пользователей, до индивидуального юзер-сервиса, который дает каждому пользователю гибкость в настройках. Какой бы путь вы ни выбрали, данная настройка значительно улучшит вашу работу с системой Ubuntu.

Оцените материал
Добавить комментарий

Капча загружается...