尽管斯特罗德希望转向环境变量的“现代”解决方案,但他显然感受到了来自损坏系统的更广泛暴露的压力。因此,截至撰写本文时,他对该错误的最新评论是:“是的,我正在考虑放弃这一点。”因此Fedora 25很可能会看到一个更新,将登录shell恢复到登录过程中; “适当的修复”将等待稍后。
现在是 Fedora 28...我们在“正确修复”方面处于什么位置?是否有一种前瞻性的方法让用户为其会话设置环境变量?
即可以在 Fedora 上工作的替代品~/.bash_profile
,希望在其他地方也可以工作。
答案1
对于 GNOME 3.24,Strode恢复的 gnome 会话通过运行登录 shell 加载环境变量。
在同一条评论中,他们包含了 gnome-session 的补丁,以将这些会话环境变量推送到 systemd 用户服务。这些包括gnome-terminal
,所以它相当重要:)。
GDM 会话启动器已经修补过的在 3.22 中,从 导入环境systemd --user
。因此systemd环境被导入到会话中,然后由登录shell修改,结果也被复制回systemd --user
.
应该可以正常工作...除了在 Fedora 28 上进行测试之外,它不能正常工作,例如 PATH,因为 gdm 会话启动器不允许 systemd 环境变量覆盖预先存在的环境。我已在 GNOME 问题跟踪器上报告了该问题。
它是同意(login
对于文本控制台)可以在启动用户 shell 之前接受一些补丁来加载环境配置,但到目前为止没有任何变化实用程序Linux v2.32。
我什至没有费心去寻找 ssh 补丁:)。
systemd 环境已在 中可配置user.conf
。作为这项工作的一部分,systemd v233获得一种格式,现在支持在现有或搜索列表environment.d/
中添加额外的目录。PATH
LD_LIBRARY_PATH
我认为为用户登录设置环境变量的最佳位置是在 PAM 模块中 - 我们甚至已经这样做了pam_env
。 逻辑是
要求登录、gdm、sshd(这永远不会发生)等来做到这一点确实是一个糟糕的解决方案。
不幸的是,发行版之间的配置pam_env
令人烦恼地不一致......而且似乎有一个很好的理由。特点~/.pam_environment
被认为是安全的大“枪”。也可以看看CVE-2010-4708。
看看
pam_exec
例如。您可以想象系统管理员使用它来进行一些登录后配置或其他操作,但用户可以通过设置 LD_PRELOAD 来获得 root 权限。或者 pam_selinux 实际上直接使用 pam_getenv,因此用户可能会搞砸它。但我的观点并不是这些具体的例子,它只是为了说明以 root 身份执行此操作存在风险,并且我们可以完全绕过这些风险,消除一整类潜在的安全错误,方法是稍后再执行此操作。登录过程。作为一般规则,如果您不需要代码以 root 身份运行,则它不应该以 root 身份运行!当然,我仍然很困惑,因为从逻辑上讲,稍后再做会更尴尬,但毫无疑问,以 root 身份执行此操作比以用户身份执行此操作风险更大。pam_exec 手册明确指出:“pam_exec 调用的命令需要知道用户可以控制[原文如此]环境。”
关于。 pam_env,注意 fedora 将其置于 pam 堆栈顶部并默认禁用 ~/.pam_environment。
将其放在堆栈顶部是一个错误,并且违反了不要这样做的明确警告:“由于 PAM 环境变量的设置可能会对其他模块产生副作用,因此该模块应该是堆栈上的最后一个。”
[...]考虑到这里的混乱,这显然是一把步枪
使用 shell 配置的总体思路似乎也适用于 Ubuntu Desktop 16.04 图形登录。然而,有一点不同。 Fedora~/.bash_profile
默认创建,这(对于 bash)会~/.profile
被忽略。 Ubuntu 和其他基于 Debian 的发行版~/.profile
是默认创建的。 (即,当您创建新用户时,会从 中提供这些文件/etc/skel
)。
(我最近在 Ubuntu 上使用过这个。Ubuntu 似乎随着时间的推移而发生了变化,不再运行 GUI 会话的登录 shell。例如参见https://superuser.com/questions/183870/difference- Between-bashrc-and-bash-profile/183980#183980,https://askubuntu.com/questions/40287/etc-profile-not-being-sourced,“为什么 gnome-terminal 不是登录 shell”, 和“shell 登录意味着什么('bash -l')”)。