如何在我的linux系统下为每个人设置环境变量?


132

我可以为所有用户使用某些通用设置吗?


2
是出口吗?补充一点,这是全球性的吗?
TIMEX

我认为它只是在当前会话上追加,当您在终端机中打开新会话时它会消失
Haryono Sariputra

Answers:


103

就像/etc/profile其他人提到的那样,某些Linux系统现在使用目录/etc/profile.d/。其中的所有.sh文件都将来自/etc/profile。将自定义环境中的内容保留在这些文件中比仅进行编辑稍微整洁/etc/profile


4
如果某些用户使用其他外壳(如zsh)怎么办?
Matthieu Napoli

70
这不是全局的...它仅限于外壳..太糟糕了,它是最被接受的答案
mmm 2014年

1
zsh将在/etc/profile.d/中获取.sh文件,您可以从/ etc / zshrc @Matthieu Napoli中看到它
Bily 2014年

4
脚本不用于ROOT用户。
2014年


38

男子8 pam_env

男子5 pam_env.conf

如果所有登录服务都使用PAM,并且所有登录服务都session required pam_env.so在各自的/etc/pam.d/*配置文件中,则所有登录会话都将设置一些环境变量,如pam_env的配置文件中所指定。

在大多数现代Linux发行版中,默认情况下就全部存在-只需将所需的全局环境变量添加到中即可/etc/security/pam_env.conf

无论用户使用哪种shell,它都适用,并且也适用于图形登录(如果xdm / kdm / gdm / entrance /…如此设置)。


1
在pam_env.conf中添加变量后,您还需要+1,因此需要立即重启$ echo $ variablename不显示

9
您不需要重新启动,您需要重新登录。(无需为我重新启动关键服务器)
Lyndon White

这似乎不适用于我的发行版Mint 17.2。预安装的文件已被完全注释掉,如果我添加类似内容echo foo>/home/me/bar并重新启动(然后再次登录),则不会创建该文件。(可能有一种更优雅的测试方法,但是我想在这里发表评论之前先确定一下。)
Michael Scheper 2015年

16

令人惊讶的是,Unix和Linux实际上没有设置全局环境变量的位置。最好的办法是安排任何特定的Shell进行特定于站点的初始化。

如果放在中/etc/profile,它将为大多数posix兼容的shell用户解决问题。对于非关键目的,这可能“足够好”。

但是任何带有cshor或tcshshell的人都不会看到它,而且我不相信csh拥有全局初始化文件。


8
/etc/environment实际上似乎为我设置了环境变量,即使是root用户也是如此。我知道这/etc/environment是在Amazon Linux和Ubuntu上。我没有检查是否适用于csh,tcsh或zsh。
乔丹·斯图尔特

它不是特定于您使用的shell,而是真正的全局
Xerus

9

bash联机帮助页中的一些有趣摘录:

当bash作为交互式登录shell或带有--login选项的非交互式shell被调用时,它首先从文件/etc/profile(如果该文件存在)中读取并执行命令。读取文件后,它会查找~/.bash_profile~/.bash_login以及~/.profile以该顺序,并读取并从存在并且可读的第一个执行命令。--noprofile启动外壳程序以禁止此行为时,可以使用该选项。
...
当一个交互的shell但不是登录shell启动时,bash读取并执行命令 /etc/bash.bashrc~/.bashrc,如果这些文件存在。使用--norc选项可以禁止这种情况。的--rcfilefile选项将强制bash从文件而不是/etc/bash.bashrcand中 读取和执行命令~/.bashrc

因此,请查看/etc/profile/etc/bash.bashrc,这些文件是进行全局设置的正确位置。在它们中放入类似的内容以设置环境变量:

export MY_VAR=xxx

请注意,在经典的Unix系统上,Bourne shell和Korn shell都读取/ etc / profile-它可能是系统环境设置中使用最广泛的位置。某些版本的C Shell会在/etc/csh.cshrc和/etc/csh.login以及每个用户的位置中查找;其他人则不使用任何系统环境设置文件。
乔纳森·莱夫勒

太棒了,这正是我为非登录Shell用户设置env所要的。
大卫·曼

抱歉,在一段时间内看不见箭头的情况下,我似乎意外地对此进行了投票...您是否可以编辑此文本(例如倒数第二行中的“ typoonEment”),以便我可以删除该向下投票?
本杰明W.18年

4

非常适合使用PAM。

# modify the display PAM
$ cat /etc/security/pam_env.conf 
# BEFORE: $ export DISPLAY=:0.0 && python /var/tmp/myproject/click.py &
# AFTER : $ python $abc/click.py &
DISPLAY  DEFAULT=${REMOTEHOST}:0.0 OVERRIDE=${DISPLAY}
abc   DEFAULT=/var/tmp/myproject

2

在Linux内核下运行的每个进程都有其自己的,从其父级继承的独特环境。在这种情况下,父级要么是外壳程序本身(生成子外壳程序),要么是“登录”程序(在典型系统上)。

由于每个进程的环境都受到保护,因此无法向每个正在运行的进程“注入”环境变量,因此,即使您修改了默认的shell .rc /配置文件,它也不会生效,直到每个进程退出并重新加载它的启动设置。

在/ etc /中查找,以修改任何特定shell的默认启动变量。只需意识到用户可以(并且经常)在他们的个人设置中对其进行更改。

Unix旨在在一定范围内服从用户。

注意:Bash不是系统上唯一的 shell。请特别注意/ bin / sh符号链接实际指向的内容。在许多系统上,这实际上可能是破折号,这在默认情况下是正确的(默认情况下,没有特殊调用)。因此,您应注意同时修改两个默认值,否则以/ bin / sh开头的脚本将不会继承全局默认值。同样,请注意避免在编辑baka和bash时只有bash可以理解的语法avoiding bashisms

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.