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


14

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存在指向point()的目录。我很犹豫只是将其硬编码进去,.bash_profile因为当pam应该照顾它时,这似乎很麻烦(尽管可行)。

我可以,当然,加XDG_RUNTIME_DIRenv_keepsudoers,但这只是保持sudoing用户的环境,这是不是我想要的。我想要目标用户的环境。

我真正想知道的是,如何使用正确设置会话ssh,但不能使用suor 正确设置会话sudo -i

Answers:


9

我已经在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可以作出的工作,但没有人已经实现了它(仍然)。


换句话说,PAM将不设置XDG_RUNTIME_DIRsudo通过设计会议?我想那时我将其设置~/.profile为不像我想的那样难用。
mkaito

3
我不想说“按设计”,因为我无法弄清楚设计是什么。再次查找sudo,我看到至少某些构建/发行版保留了足够的环境变量,以root身份运行的程序最终会给原始用户造成权限问题。但这不是不设置与目标用户相对应的XDG_RUNTIME_DIR的原因。
sourcejedi


3

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

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

抱歉,“ su”是一种用于临时更改用户身份和很少其他进程凭证的工具。它不是用于打开全新登录会话的工具。新的登录会话具有定义良好的原始设置,不会从任何其他会话继承任何内容,但是“ su” uid更改的确不是这种情况:大多数执行环境都是在无数次且非显而易见的情况下继承的方式,例如MAC上下文,审计上下文,cgroup上下文,名称空间上下文,调度,计时器粒度等…

如果您想要一个全新的会话,请使用“ machinectl登录”或“ machinectl shell”之类的方法,它们实际上将为您提供一个完全干净,独立的分离环境,并且不会从调用它的位置泄漏任何隐藏的进程属性。

登录的会话大多受审计会话概念的约束,并且审计会话不受“ su”的影响,实际上,它们被定义为“封闭”,即,如果某个进程进入会话一次,它将始终存在使用它,它的子节点也是如此,也就是说,获得新会话的唯一方法是从PID 1(或类似的东西)中分出一个从未参与过会话的东西。

换句话说,您通过“ su”调用的内容将在“ loginctl”中很好地显示,但是,它仍然是您最初登录的原始会话的一部分。您可以通过在原始会话的ID上调用“ loginctl status”来进行验证(可以通过echo $ XDG_SESSION_ID看到)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.