如何在远程服务器上切换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示例部分中的手册页

相关内容