Разрешения на службу systemd для xsecurelock

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

У меня есть таймер службы systemd, который запускает скрипт каждые 5 минут, чтобы проверить, отключен ли монитор. Если он отключен, он блокирует экран.

Но у меня возникают проблемы с пользователями и правами доступа. Похоже, что скрипт должен выполняться с правами sudo, чтобы узнать состояние питания монитора, но это приводит к тому, что xsecurelock требует пароль root для разблокировки экрана. Как я могу это исправить?

Я должен сказать: я хочу сохранить этот подход и использование xsecurelock, так как это работает на моих других ПК. Необходимость в sudo для запроса состояния питания кажется специфичной для этого ПК.

  1. Служба systemd
Description=Проверить, выключен ли монитор, и запустить xsecurelock
After=network.target

[Service]
User=dave
Environment=XAUTHORITY=/home/dave/.Xauthority
Environment=DISPLAY=:0
Type=simple
ExecStart=/home/dave/monitor_check.sh --debug
StandardOutput=journal
StandardError=journal
Restart=no
[Install]
WantedBy=multi-user.target
  1. Скрипт

XSECURELOCK_SAVER=saver_xscreensaver
export XSECURELOCK_SAVER
echo "Значение XSECURELOCK_SAVER: $XSECURELOCK_SAVER"

    state=$(ddcutil getvcp D6 2>&1)
        echo "$state"
    sleep 2

    if [[ "$state" == *"Монитор не найден"* ]]; then
        echo "Монитор выключен, выполняю команду..."
        exec xsecurelock
        break
    else
    echo "Монитор найден, ничего делать не нужно."
    fi

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

Управление разрешениями для systemd-сервиса xsecurelock

В данной статье мы рассмотрим, как правильно настроить разрешения для systemd-сервиса, который запускает скрипт проверки состояния монитора и блокирует экран с использованием xsecurelock. Проблема, с которой вы столкнулись, связана с необходимостью выполнения скрипта с правами суперпользователя (sudo) для получения информации о состоянии монитора, что в свою очередь вызывает запрос пароля root при разблокировке экрана. Мы обсудим, как можно оптимизировать этот процесс, не нарушая заданную вами логику работы.

Подход к решению проблемы

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

1. Настройка прав доступа для выполнения скрипта

Первое, что вам следует сделать, это убедиться, что ваш скрипт может выполняться без необходимости вводить пароль sudo. Для этого вы можете использовать файл /etc/sudoers, чтобы разрешить пользователю dave выполнение команды ddcutil без запроса пароля. Выполните следующую команду:

sudo visudo

Затем добавьте строку:

dave ALL=(ALL) NOPASSWD: /usr/bin/ddcutil

Эта запись позволит вашему пользователю dave запускать ddcutil без запроса пароля.

2. Оптимизация systemd-сервиса

Убедитесь, что ваш systemd-сервис настроен правильно. Ваш текущий сервис выглядит вполне приемлемо, но вам следует удостовериться, что у него есть правильные зависимости и зависимости на выполнение. Например:

[Unit]
Description=Проверка состояния монитора и запуск xsecurelock
After=graphical.target

[Service]
User=dave
Environment=XAUTHORITY=/home/dave/.Xauthority
Environment=DISPLAY=:0
Type=simple
ExecStart=/home/dave/monitor_check.sh --debug
StandardOutput=journal
StandardError=journal
Restart=no

[Install]
WantedBy=multi-user.target

Убедитесь, что After=graphical.target правильно установлен, так как это гарантирует, что служба не будет запускаться до тех пор, пока не будет доступен графический интерфейс.

3. Изменения в скрипте

Убедитесь, что скрипт monitor_check.sh также настроен правильно. Ваша логика выглядит корректно, но проверьте, что вы обрабатываете исключения:

#!/bin/bash

XSECURELOCK_SAVER=saver_xscreensaver
export XSECURELOCK_SAVER
echo "Значение XSECURELOCK_SAVER: $XSECURELOCK_SAVER"

state=$(sudo ddcutil getvcp D6 2>&1)
echo "$state"
sleep 2

if [[ "$state" == *"Не найдено дисплея"* ]]; then
    echo "Монитор выключен, выполняю команду..."
    exec xsecurelock
else
    echo "Дисплей найден, ничего не делаю."
fi

Проверьте вывод команды ddcutil, чтобы убедиться, что он обрабатывается корректно.

Заключение

Проблемы, с которыми вы столкнулись, часто требую тщательной настройки прав доступа и разрешений для взаимодействия с аппаратным обеспечением и графической средой. Настройка /etc/sudoers для вашего пользователя dave позволяет избежать вопроса пароля при разблокировке экрана. Убедитесь, что используете правильные зависимости в вашем systemd-сервисе, а также правильно обрабатываете состояния в вашем скрипте. С правильной настройкой все должно заработать стабильно, и вы сможете продолжать использовать xsecurelock в вашей системе.

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

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