为什么我的环境变量没有设置?

为什么我的环境变量没有设置?

我必须设置一个名为GDK_NATIVE_WINDOWS“修复”的环境变量Ubuntu 中 Eclipse 按钮​​的问题。为了设置环境变量,我在中添加了以下行~/.pam_environment

GDK_NATIVE_WINDOWS DEFAULT=true

echo $GDK_NATIVE_WINDOWS令人惊讶的是,当我在终端中时,环境变量没有被设置。但是,我在 中列出的所有其他环境变量~/.pam_environment都设置正确。此外,当我切换到 tty(例如 )时Alt+Ctrl+F1,环境变量会正确设置。在 中设置此环境变量有什么问题~/.pam_environment

答案1

在 ~/.pam_environment 文件中坚持使用简单的“key=value”语法。没有 DEFAULT、OVERRIDE、${HOME},什么都没有。只有 key=value。您链接到的手册页仅适用于 pam_env.conf。请参阅“man 8 pam_env”,它没有承诺任何其他内容“此模块还可以解析在单独行上使用简单 KEY=VAL 对的文件。”。

顺便说一下,在 ./pam_environment 中输入类似 PATH=${PATH}:more/paths 的内容是中断几乎所有登录尝试的好方法,因为 PATH 被设置为 ${PATH}:more/paths字面上地(那里找不到太多东西)。要救援,“/bin/mv .pam_environment out_of_the_way”并重新登录。

答案2

~/.pam_environment正如您所确定的,您的环境变量应该按照建议设置https://help.ubuntu.com/community/EnvironmentVariables。说起来容易做起来难 ;)

您可能遇到了与我相同的配置漏洞。请参阅下面加密主页的解决方法。

我的~/.pam_environment

PATH            DEFAULT=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:${HOME}/bin
IDEA_JDK        DEFAULT=${HOME}/Applications/jdk

为什么丑陋的静态路径?${PATH}对我来说不起作用。我尝试解决这个问题,但登录失败了好几次,所以我坚持使用丑陋的静态默认副本 :)

加密主文件夹的解决方法

在 Ubuntu 14.04 及更高版本中Ubuntu 12.04(Precise Pangolin)Beta 2,如果您使用加密主目录,则需要进行修改/etc/pam.d/common-session才能加载~/.pam_environment。此解决方案显然适用于早期版本,但我尚未测试过。

Guenther Montag (g-montag) 于 2010-08-19 写道:

这似乎是加密主目录的问题。我添加了

会话需要 pam_env.so

在 /etc/pam.d/common-session 的末尾,现在 ~/.pam_environment 被读取了。在另一个没有加密主目录的系统上(也是 10.04),不需要解决这个问题。也许在我的情况下,系统在解密之前尝试读取 ~/.pam_environment。

答案3

GDK_NATIVE_WINDOWS 和 DEFAULT=true 之间有一个空格。这与您链接的示例不同。

尝试:

GDK_NATIVE_WINDOWS=true

答案4

在 Debian bullseye(可能可以追溯到 2013 年左右)和至少 14.04 版的 ubuntu(在 docker 容器中测试)中,不会按 user_endir 读取 ~/.pam_environment,pam_env 默认为关闭(请参阅man 7 pam_env)。如果您想重新启用它:

echo 'session optional pam_env.so user_readenv=1' >> /etc/pam.d/common-session

也就是说,为交互式会话(CLI 或图形登录,如 su)设置 pam_env 并将 user_reader 设置为 1。

我认为它在上游被禁用的原因是:

https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2010-4708“Linux-PAM(又名 pam)1.1.2 及更早版本中的 pam_env 模块会读取用户主目录中的 .pam_environment 文件,这可能会允许本地用户通过执行依赖于 pam_env PAM 检查的程序来运行具有非预期环境的程序。”

我觉得上面的描述不太清楚。如果这意味着 ~/.pam_environment 允许在用户不知情的情况下更改程序环境,那么主文件夹中的任何选项都是相同的(即 ~/.profile、~/.zprofile)。请记住 ~/.profile 被要求由图形登录管理器读取... 那么为什么要删除 ~/.pam_environment 并保留 ~/.profile?

正确的方法是能够在 /etc/security/pam_env.conf 中为每个用户设置环境变量。但尚未向上游提出请求。或者任何选项只有管理员权限才可编辑。

相关内容