Вопрос или проблема
Это удалённая машина с доступом по SSH и systemd.
У меня возникает эта ошибка, когда я пытаюсь выполнить команды systemd для пользователя:
$ systemctl --user status
Не удалось подключиться к шине: $DBUS_SESSION_BUS_ADDRESS и $XDG_RUNTIME_DIR не определены (рассмотрите возможность использования --machine=<user>@.host --user для подключения к шине другого пользователя)
В то время как другие ответы предлагают просто установить или “подделать” запрашиваемые переменные, по моему мнению, это не является правильным решением.
Проблема состоит в том, что я вошёл как один пользователь (я использую его как системный администратор) и я сменил пользователя через su
. Таким образом, вполне разумно, что systemd не имеет представления, какого пользователя я использую здесь…
Так что я понимаю, что он сбит с толку.
Обратите внимание, что для сервисов systemd возможно, использование системной шины является, возможно, лучшей идеей в целом.
Тем не менее, для экспериментов с podman и особенно podman generate systemd
, который также требует сеанса на уровне пользователя, возможно, просто наличие зависимого пользователя (loginctl enable-linger
) — это полезный способ.
Теперь сам вопрос: Как я могу переключиться на другого пользователя, чтобы systemd действительно знал, что этот пользователь теперь вошёл в систему? Я просто хочу “работать” как другой пользователь (в новой оболочке). Так, как если бы я использовал su
.
Обратите внимание, что я не хочу подключаться к серверу по SSH как другой пользователь. Это требует дополнительных SSH-ключей и других ненужных вещей. Я хочу сменить своего пользователя, оставаясь в системе (как пользователь, который может выполнять sudo
, т.е. системный администратор).
Попытки
Я использовал sudo machinectl login
, но это:
- неудобно, так как мне нужно снова вводить имя пользователя (я не могу сделать
sudo machinectl login my-user
). - проблема, так как мой пользователь является системным пользователем только для podman, и у меня нет установленного пароля — так что я не могу войти с паролем.
Я нашёл machinectl shell
, что звучит именно так, как я хочу, но не могу заставить это работать.
Я пробовал machinectl shell my-user
и machinectl shell my-user@localhost
, но он всегда говорит мне:
Не удалось получить оболочку PTY: Машина ‘localhost’ не известна
Что ж… обратите внимание, что он также показывает, что у меня нет “машин” (что бы это ни было? Разве localhost
не одна из них?):
$ machinectl list
Нет машин.
Ах, я почти это понял:
Имейте в виду, что по какой-то причине локальная “машина” (т.е. “localhost”) для machinectl
называется :host
.
Также по какой-то причине это скрыто в machinectl list
.
Вам нужно выполнить machinectl list --all
, чтобы действительно это увидеть.
Теперь, зная это, на самом деле всё довольно просто:
Просто выполните это:
$ sudo machinectl shell [email protected]
И вот вы… в своей новой оболочке my-user
.
Вы можете (в какой-то мере) подтвердить это, если проверите переменные окружения $XDG_RUNTIME_DIR
и $DBUS_SESSION_BUS_ADDRESS
, которые были там в моей исходной ошибке.
Также обратите внимание, что, по-видимому, существует ещё один альтернативный синтаксис, который не требует знания этой “локальной” машины:
$ sudo machinectl shell --uid my-user
На самом деле, это также упоминается в конце machinectl
man-страницы в разделе примеров.
Хотел добавить к другому ответу, что:
-
Имя локальной машины не
:host
, а.host
, как видно в настоящей команде ниже. -
и, что наиболее важно, это имя машины по умолчанию, так что нет необходимости даже указывать его.
-
Также нет необходимости в
sudo
, systemd сам запросит пароль и повысит привилегии сеанса, если пользователь находится в группе администраторов системы.
machinectl shell <user>@
Укажите пароль, когда будет запрошено, и это всё.
cc @rugk
Ответ или решение
Как переключиться на другую учётную запись пользователя в systemd без повторного подключения через SSH
Введение
Ваша задача заключается в использовании команд systemd для другого пользователя на удалённом сервере, при этом вы хотите избежать повторного подключения по SSH. Давайте детально рассмотрим эту проблему и возможные решения.
Основная проблема
Вы столкнулись с ошибкой Failed to connect to bus: $DBUS_SESSION_BUS_ADDRESS and $XDG_RUNTIME_DIR not defined
, потому что systemd не знает, что другой пользователь, переключённый с помощью su
, теперь активен в вашей сессии. И хотя существуют решения, связанные с «подделкой» переменных окружения, более правильным подходом будет использовать возможности systemd для управления сессиями пользователей.
Решение с использованием machinectl
В systemd существует команда machinectl
, которая позволяет вам переключаться на другую учётную запись пользователя в локальной среде. Этот метод является более элегантным и правильным способом переключения, поскольку он устанавливает все необходимые переменные среды для работы с systemd.
Шаги для переключения пользователя:
-
Проверьте доступные машины:
Чтобы убедиться, что локальная машина доступна, выполните команду:machinectl list --all
При этом вы должны увидеть вашу локальную машину с именем
.host
, которая представляет собой текущую локальную сессию. -
Переключитесь на нужного пользователя:
Для переключения на другого пользователя вы можете использовать следующую команду:machinectl shell <имя_пользователя>@
Эта команда создаст новую сессию оболочки для указанного пользователя. Если пользователь не имеет установленного пароля, вам может потребоваться применить дополнительные методы аутентификации, такие как
sudo
, если вы находитесь в группе администраторов.
Примечания
-
Лингеринг пользователя: Для того чтобы user-level systemd единицы могли работать даже без активной сессии пользователя, вы должны активировать linger для нужного пользователя. Это можно сделать следующей командой:
loginctl enable-linger <имя_пользователя>
-
Проверка переменных окружения: После переключения вы можете проверить установленные переменные окружения:
echo $XDG_RUNTIME_DIR echo $DBUS_SESSION_BUS_ADDRESS
Они должны соответствовать новому пользователю. Если это так, вы сможете управлять systemd user units без дополнительных ошибок.
Заключение
Используя команду machinectl shell
, вы можете легко переключиться на другую учётную запись пользователя без необходимости повторного подключения по SSH. Это решение не только избавляет от проблем с переменными окружения, но и оптимизирует процесс управления сессиями пользователей в systemd. Таким образом, вы можете продолжать работать с нужными инструментами, такими как Podman, с необходимыми правами пользователя.