如何在遠端伺服器上切換systemd使用者/shell而無需透過ssh再次登入?

如何在遠端伺服器上切換systemd使用者/shell而無需透過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 服務的 while也許使用系統匯流排也許是更好的主意。

然而,為了試驗 podman,特別是podman generate systemd還想要一個使用者級會話,也許只是有一個揮之不去user( loginctl enable-linger) 是一個有用的方法。


現在真正的問題是:如何切換到其他用戶,以便 systemd 真正知道該用戶現在已登入?我只想以不同的使用者身分「操作」(在新的 shell 中)。就像我會使用su.

請注意,我不想以其他使用者身分透過 SSH 連接到伺服器。這需要額外的 SSH 金鑰和其他不必要的東西。我想在登入時切換用戶(作為可以運行的用戶sudo,即係統管理員)。

嘗試

我有sudo machinectl login,但那是:

  • 不方便,因為我需要在那裡再次輸入用戶名(我不能這樣做sudo machinectl login my-user
  • 一個問題,因為我的用戶是 podman 的系統用戶,而且我沒有設定密碼 - 所以我無法使用密碼登入

我發現machinectl shell,這聽起來正是我想做的,但我無法讓它工作。我嘗試過machinectl shell my-usermachinectl shell my-user@localhost,但它總是告訴我:

無法取得 shell PTY:沒有已知的機器“localhost”

好吧……請注意,它還表明我沒有“機器”(無論這些是什麼?不是localhost一個嗎?):

$ machinectl list
No machines.

答案1

啊,我差一點就懂了:

請注意,無論出於何種原因,本地“機器”(即“localhost”)都machinectl被稱為:host.

此外,無論出於何種原因,它都將其隱藏在machinectl list.你需要跑machinectl list --all才能真正看到它。

現在,鑑於我們知道這一點,這實際上非常簡單:只需執行以下命令:

$ sudo machinectl shell [email protected]

現在你就在你的新 shell 中了my-user。如果您檢查環境變量$XDG_RUNTIME_DIR以及$DBUS_SESSION_BUS_ADDRESS我最初的錯誤中存在的變量,您可以(在某種程度上)驗證這一點。

另請注意,顯然還有另一種替代語法,不需要了解該“本地”機器:

$ sudo machinectl shell --uid my-user

其實文末也提到了machinectl範例部分中的手冊頁

相關內容