Вопрос или проблема
У меня есть таймер службы systemd, который запускает скрипт каждые 5 минут, чтобы проверить, отключен ли монитор. Если он отключен, он блокирует экран.
Но у меня возникают проблемы с пользователями и правами доступа. Похоже, что скрипт должен выполняться с правами sudo, чтобы узнать состояние питания монитора, но это приводит к тому, что xsecurelock требует пароль root для разблокировки экрана. Как я могу это исправить?
Я должен сказать: я хочу сохранить этот подход и использование xsecurelock, так как это работает на моих других ПК. Необходимость в sudo для запроса состояния питания кажется специфичной для этого ПК.
- Служба 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
- Скрипт
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 в вашей системе.