Вопрос или проблема
Как запустить графическое приложение от имени другого пользователя из фонового скрипта?
Чтобы быть более конкретным: я использую ноутбук в разных средах, некоторые из которых требуют прокси для сетевого подключения. Чтобы автоматически настроить всех клиентов (apt, snap, gsettings, nextcloud-desktop), я использую триггерный скрипт в /etc/NetworkManager/dispatcher.d/. Для запуска приложений в контексте пользователя я нашел скрипт на stackexchange:
DISPLAY_ID=":$(find /tmp/.X11-unix/* \! -user gdm | sed 's#/tmp/.X11-unix/X##' | head -n 1)"
USER=$(who | grep tty | awk '{print $1}')
USER_ID=$(id -u "$USER")
function user-session() {
_environment=("DISPLAY=$DISPLAY_ID" "DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$USER_ID/bus")
sudo -Hu "$USER" env "${_environment[@]}" "$@"
}
# используйте это, например, так:
user-session gsettings set org.gnome.system.proxy mode none
Это больше не работает для графических приложений, таких как клиент nextcloud (из-за wayland?). Этот клиент nextcloud использует статический конфигурационный файл для сетевой настройки, поэтому мне нужно убить клиента, переписать конфигурацию и, наконец, перезапустить клиента. Последнее должно быть сделано в контексте текущего вошедшего пользователя, но триггерный скрипт работает от имени root.
Так как же мне запустить клиент nextcloud для текущего графического пользователя из скрипта, выполняющегося от имени root, вызванного фоновым заданием на текущем (24.04) ubuntu?
Я использую эту процедуру уже несколько лет. Может быть, существует более простое решение?
Маттиас
Ответ или решение
Запуск GUI-приложения от имени другого пользователя в Ubuntu 24.04
Здравствуйте, Mathias!
Для решения вашей задачи запуска GUI-приложения от имени другого пользователя, когда скрипт выполняется с правами root, нужно учесть несколько моментов. Как вы правильно заметили, с переходом на Wayland, возникают сложности, связанные с управлением сеансами, доступом к интерфейсу и переменными окружения.
Вот краткое руководство, как начать GUI-приложение, такое как клиент Nextcloud, от имени текущего пользователя, при этом оставаясь в контексте скрипта, работающего от root.
Шаг 1: Определите текущего пользователя
В вашей системе вы должны определить, кто в данный момент активен. Вы можете использовать следующие команды:
USER=$(who | grep tty | awk '{print $1}')
USER_ID=$(id -u "$USER")
Здесь мы собираем имя пользователя и его ID.
Шаг 2: Настройка окружения
Для запуска GUI-приложения важно корректно настроить переменные окружения, такие как DISPLAY
и DBUS_SESSION_BUS_ADDRESS
. Вы можете сделать это следующим образом:
DISPLAY_ID=":$(find /tmp/.X11-unix/* \! -user gdm | sed 's#/tmp/.X11-unix/X##' | head -n 1)"
_environment=("DISPLAY=$DISPLAY_ID" "DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$USER_ID/bus")
Этот фрагмент кода находит доступный DISPLAY
и настраивает окружение.
Шаг 3: Запуск приложения от имени пользователя
Чтобы запустить приложение от имени другого пользователя, используйте следующую команду:
sudo -Hu "$USER" env "${_environment[@]}" nextcloud
Таким образом, вы сможете запустить клиент Nextcloud от имени пользователя, который активно работает в графической сессии.
Шаг 4: Убить и перезапустить клиент Nextcloud
Если вашей целью является перезапуск Nextcloud после изменения конфигурационного файла, вы можете объединить команды. Например:
sudo -Hu "$USER" env "${_environment[@]}" pkill nextcloud
# Ждем немного, чтобы убедиться, что клиент завершился
sleep 1
sudo -Hu "$USER" env "${_environment[@]}" nextcloud &
Примечание о безопасности
Запуск GUI-приложений от имени другого пользователя имеет свои риски, и важно следовать рекомендациям по безопасности. Убедитесь, что скрипт, который вы используете, защищен и не может быть explotación, так как выполнение команд от имени другого пользователя потенциально может открыть двери для злоумышленников.
Альтернативный подход
Если ваш сценарий позволяет, возможно, стоит рассмотреть использование системных служб или использование cron
для управления этим процессом в рамках вашей сессии пользователя, что может упростить конфигурацию.
Надеюсь, эти шаги помогут вам успешно запустить Nextcloud в нужном контексте. Если у вас есть дополнительные вопросы или нужна дальнейшая поддержка, не стесняйтесь обращаться!
С уважением,
Ваш IT-эксперт