Как переключить пользователя/оболочку systemd на удаленном сервере без повторного входа через ssh?

Как переключить пользователя/оболочку systemd на удаленном сервере без повторного входа через ssh?

Это удаленная машина с доступом по 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страница руководства в разделе примеров.

Связанный контент