为什么 sudo -i 没有为目标用户设置 XDG_RUNTIME_DIR?

mka*_*ito 21 ssh pam sudo systemd

XDG_RUNTIME_DIRsystemctl --user工作所必需的。

我已经设置了 ubuntu 服务器 16.04 来运行 systemd 用户会话。现在,在尝试管理它们时,我发现当通过sudo -u $user -i甚至更改用户时su - $user,环境没有XDG_RUNTIME_DIR设置,从而systemctl --user无法工作。但是,当我ssh直接进入该用户时,它设置正确。

如果我正确理解了文档,则应libpam-systemd在创建用户会话时进行设置。用户切片正确启动,因为XDG_RUNTIME_DIR应该指向( /run/users/$uid)的目录存在。我很犹豫是否只是硬编码它,比如,.bash_profile因为这看起来很笨拙(尽管有效),当 pam 应该照顾它时。

我当然可以添加XDG_RUNTIME_DIRenv_keepin sudoers,但这只会保留 sudoing 用户的环境,这不是我想要的。我想要目标用户的环境。

不过,我真正想知道的是,会话如何正确设置为ssh,而不是susudo -i

sou*_*edi 12

我已经在我的 Fedora 25 系统上复制了这个问题。

我在源代码中发现了一个非常可疑的情况。 https://github.com/systemd/systemd/blob/f97b34a/src/login/pam_systemd.c#L439 看起来好像是用正常的方式编写的,sudo但不是sudo -u non-root-user

machinectl shell --uid=non-root-user 按照您的要求工作。

systemd-run 尽管在 machinectl 文档中提到了它,但似乎没有按预期工作。

如果您此时启用了 SELinux,某些 machinectl 命令将不起作用,并且在我启用之前,这些特定命令对我不起作用setenforce 0。但是,我正在尝试各种变通方法以使 machinectl 正常工作,因为我希望它可以写入 SELinux,因此我的摆弄可能是导致例如machinectl shell超时的原因。

编辑:我认为此代码是在此讨论之后引入的。显然su -/sudo -i可以工作,但没有人实施它(仍然)。

  • 我不想说“按设计”,因为我无法弄清楚设计是什么。再次查找 sudo,我看到至少一些构建/分发保留了足够的环境变量,以 root 身份运行的程序最终可能会给原始用户带来权限问题。然而,这并不是不设置对应于 _target_ 用户的 XDG_RUNTIME_DIR 的原因。 (3认同)

sou*_*edi 8

不过,我真正想知道的是,如何使用 ssh 正确设置会话,而不是使用 su 或 sudo -i 设置?

https://github.com/systemd/systemd/issues/7451#issuecomment-346787237

抱歉,“su”是一种用于临时更改用户身份和很少其他进程凭据的工具。它不是用于打开全新登录会话的工具。一个新的登录会话有一个非常明确的、原始的设置,没有从任何其他会话继承任何东西,但对于“su”uid 更改来说,情况确实不是这样:大部分执行环境都被继承了,在许多且不明显的情况下方式,例如 MAC 上下文、审计上下文、cgroup 上下文、命名空间上下文、调度、计时器粒度……

如果您想要一个全新的会话,请使用诸如“machinectl login”或“machinectl shell”之类的东西,这实际上将为您提供一个完全干净、独立、分离的环境,并且不会从您调用它的地方泄漏隐藏的进程属性。

logind session 多是绑定到审计会话的概念,审计会话不受“su”的影响,实际上它们被定义为“密封的”,即一个进程一旦进入一个会话,它就会一直停留有了它,它的孩子也将如此,即获得新会话的唯一方法是从从未参与过会话的 PID 1(或类似的东西)中分出一些东西。

或者换一种说法:您通过“su”调用的内容将在“loginctl”中正常显示,但是,它仍然是您最初登录的原始会话的一部分。您可以通过在原始会话的 ID(您可以通过 echo $XDG_SESSION_ID 看到)上调用“loginctl status”来验证这一点

  • 简而言之,解决 sudo 未为目标用户设置正常环境的方法是运行“sudo machinectl shell [user]@.host”。 (2认同)