如何在远程服务器上切换systemd用户/shell而无需通过ssh再次登录?

rug*_*ugk 5 login systemd podman

这是一台具有 SSH 访问权限和 systemd 的远程计算机。

\n

当我尝试运行 systemd 用户命令时,我基本上遇到了这个错误:

\n
$ systemctl --user status\nFailed 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)\n
Run Code Online (Sandbox Code Playgroud)\n

虽然其他答案建议仅设置或“伪造”请求的变量恕我直言,但这不是一个正确的解决方案。

\n

问题基本上是我以一个用户身份登录(我用作系统管理员)并且我确实通过切换用户su。因此,这是非常可以理解的,systemd 不知道我在这里运行的用户是什么\xe2\x80\xa6\n所以我知道它很困惑。

\n

请注意,对于 systemd 服务,使用系统总线可能是更好的主意。

\n

然而,对于试验 podman,特别podman generate systemd是还想要一个用户级会话,也许只是拥有一个挥之不去的用户 ( loginctl enable-linger) 是一种有用的方法。

\n
\n

现在真正的问题是:如何切换到其他用户,以便 systemd 真正知道该用户现在已登录?我只想以不同的用户身份“操作”(在新的 shell 中)。就像我会使用su.

\n

请注意,我不想以其他用户身份通过​​ SSH 连接到服务器。这需要额外的 SSH 密钥和其他不必要的东西。我想在登录时切换用户(作为可以运行的用户sudo,即系统管理员)。

\n

尝试

\n

我已经sudo machinectl login,但那是:

\n
    \n
  • 不方便,因为我需要在那里再次输入用户名(我不能这样做sudo machinectl login my-user
  • \n
  • 一个问题,因为我的用户是 podman 的系统用户,并且我没有设置密码 \xe2\x80\x93 所以我无法使用密码登录
  • \n
\n

我发现machinectl shell,这听起来正是我想做的,但我无法让它工作。\n我尝试过machinectl shell my-usermachinectl shell my-user@localhost,但它总是告诉我:

\n
\n

无法获取 shell PTY:没有已知的机器 \'localhost\'

\n
\n

嗯\xe2\x80\xa6 请注意,它还显示我没有“机器”(无论这些是什么?不是localhost一个吗?):

\n
$ machinectl list\nNo machines.\n
Run Code Online (Sandbox Code Playgroud)\n

rug*_*ugk 6

啊,我差一点就明白了:

\n

请注意,无论出于何种原因,本地“机器”(即“localhost”)都machinectl被称为:host.

\n

此外,无论出于何种原因,它都将其隐藏在 中machinectl list。\n您需要运行machinectl list --all才能真正看到它。

\n

现在,鉴于我们知道这一点,这实际上非常简单:\n只需运行以下命令:

\n
$ sudo machinectl shell my-user@.host\n
Run Code Online (Sandbox Code Playgroud)\n

现在你已经在你的新 shell 中了 \xe2\x80\xa6 my-user。\n如果你检查环境变量$XDG_RUNTIME_DIR以及$DBUS_SESSION_BUS_ADDRESS我最初的错误中的环境变量,你可以(在某种程度上)验证这一点。

\n

另请注意,显然还有另一种替代语法,不需要了解该“本地”机器:

\n
$ sudo machinectl shell --uid my-user\n
Run Code Online (Sandbox Code Playgroud)\n

machinectl实际上,在示例部分的手册页末尾也提到了这一点。

\n