Это удаленная машина с доступом по SSH и systemd.
По сути, у меня возникает следующая ошибка, когда я пытаюсь запустить пользовательские команды systemd:
$ systemctl --user status
Failed to connect to bus: $DBUS_SESSION_BUS_ADDRESS and $XDG_RUNTIME_DIR not defined (consider using --machine=<user>@.host --user to connect to bus of other user)
Покадругие ответы предлагают просто установить или «подделать» запрошенные переменныеИМХО, это не совсем правильное решение.
Проблема в том, что я вошел в систему как один пользователь (я использую права системного администратора)и я переключил пользователя черезsu
. Таким образом, вполне понятно, что systemd не имеет ни малейшего понятия, под каким пользователем я здесь работаю... Поэтому я понимаю, что он запутался.
Примечание для служб systemdвозможно, используя системную шинувозможно, это вообще лучшая идея.
Однако для экспериментов с Podman и особенно podman generate systemd
для сеанса на уровне пользователя, возможно, простозатяжнойuser ( 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
No machines.
решение1
Ага, я почти понял:
Обратите внимание, что по какой-то причине локальная «машина» (т. е. «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
страница руководства в разделе примеров.