所以这个问题已经有人问过,但那里的答案并没有解决环境变量的问题。有没有一种方法可以完全切换用户,以便调用pam-systemd
并设置每个自动 XDG 环境变量?
比较以下内容
以下选项首先打开已关闭电源的计算机。
选项1以 root 身份登录。在 shell 中输入以下内容:
su -l username
echo $XDG_RUNTIME_ENV
选项2以用户名登录。在 shell 中输入以下内容:
echo $XDG_RUNTIME_ENV
你会发现这是有区别的。/run/user/0
尽管使用的用户发生了变化su
(切换用户),选项 1 仍会产生,因为pam_systemd
在切换期间未调用该模块。选项 2 的收益率/run/user/$(id -u)
符合预期。现在,我只需键入即可注销,exit
直到机器提示我再次登录并以所需用户身份登录。还有其他方法吗?使用sudo
代替su
没有帮助。
这是正确的做法吗echo "XDG_RUNTIME_DIR=$(id -u) >> .bash_profile"
,因为.bash_profile
被执行了su
?
答案1
我认为答案可能是只使用login
而不是su
确保pam_systemd
模块被执行并设置变量,并且正如 Giacomo 指出的那样,确保只有一个用户(如生成的su
子进程场景中的多个用户)可以更改文件那个环境之内。
可以使用如下方式su
在系统上直观地表示危险:systemd
使用su
root -systemd
root -login # calls pam_systemd and sets XDG_RUNTIME_DIR among others
user1 -bash
user1 -su
user2 -bash # user1 has access to spawned subprocesses?
使用login
root -systemd
root -login # calls pam_systemd and sets XDG_RUNTIME_DIR among others
user2 -bash
也loginctl
不会注册子进程封装的用户su/bash
,因为用户从未注册过systemd-logind.service
by pam_systemd.mod
。
答案2
如果您拥有 root/sudo 访问权限并且需要在不知道或更改密码的情况下完全模拟另一个用户,如果您的 Linux 发行版足够现代以支持它,您应该使用:
sudo machinectl shell --uid usernameGoesHere
这实际上创建了一个会话,并为您提供了一个具有用户正常环境(包括以 开头的变量$XDG_
)的登录 shell,因此一切的外观和工作方式都应该与用户正常登录时完全相同。这优于我在复制常规用户登录的所有方面但没有登录凭据时看到的任何咒语su
。sudo
不用说,作为系统管理员,这对于解决用户遇到的问题或代表另一个用户运行依赖于环境(例如podman
.