Подтвердить что ты не робот

Могу ли я управлять пользовательской системой с помощью "systemctl --user" после sudo su - myuser?

У меня есть служба, которую я хочу начать с запуска системы. Я создал определение ap @.service для него как шаблона, потому что может быть много экземпляров.

Определяется в корневой системе d, это хорошо работает и запускает и останавливает службу в системе. Экземпляр службы устанавливается с systemctl enable [email protected], как и следовало ожидать. Root также может запускать и останавливать обслуживание без проблем. Служба работает в своей учетной записи (myuser), а не в корне, управляемой пользователем = myuser в шаблоне ap @.service.

Но я хочу, чтобы пользователь "myuser" мог запускать и останавливать свой собственный сервис без ущерба для безопасности системы.

Я переключился на использование пользовательской системы d и включил затяжку с помощью loginctl enable-linger myuser. Затем я включаю службу, определенную в каталоге ~ myuser/.config/systemd/user. Служба теперь запускается и полностью останавливается с системой, как и было предусмотрено. Если я вхожу в терминал в качестве "myuser", systemctl --user start [email protected] и systemctl --user stop [email protected] работают отлично.

Однако, если я вхожу в систему как другой пользователь (user2) и выполняю sudo su - myuser в терминале, тогда команды systemctl --user теперь терпят неудачу с сообщением об ошибке "Не удалось получить соединение D-Bus: нет такого файла или каталога".

Как включить systemctl --user для работы после команды sudo su - myuser для переключения пользователя?

4b9b3361

Ответ 1

Я нашел ответ на другом сайте с дальнейшим поиском с использованием разных терминов.

Необходимыми решениями были предоставление оболочке информации для получения правильного DBUS для пользователя.

Добавляя следующие переменные среды в оболочку перед запуском systemctl --user, проблема DBUS устраняется, а systemctl работает правильно.

export XDG_RUNTIME_DIR="/run/user/$UID"
export DBUS_SESSION_BUS_ADDRESS="unix:path=${XDG_RUNTIME_DIR}/bus"

Чтобы гарантировать, что DBUS_SESSION_BUS_ADDRESS доступен в оболочке sudo, я добавил переменные среды в ~/.bash_profile целевого идентификатора пользователя. Для этого необходимо создать оболочку входа (sudo su - myuser или sudo -l myuser), чтобы создать правильную среду.

В качестве альтернативы добавьте создание переменных среды в ~/.bashrc(или эквивалент для других оболочек). Затем среда будет создана заново для всех созданий оболочки.