我必须设置一个名为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 中为每个用户设置环境变量。但尚未向上游提出请求。或者任何选项只有管理员权限才可编辑。