How to set environment variable for everyone under my linux system?
Asked Answered
P

7

194

Can I have certain settings that are universal for all my users?

Preserve answered 29/10, 2009 at 3:35 Comment(4)
Is it EXPORT? append that and it is global?Preserve
i think it is only append on current session , when you open new session in terminal it would be disappearedLianaliane
Yes, export is only for current session, but I didn't have good results on adding my variable to /etc/environment file. That's weird the only environment variable I have there is PATH but its content is different from the PATH that I see when I list all the variables via envCaptainship
I was missing to run source /etc/environmentCaptainship
O
138

As well as /etc/profile which others have mentioned, some Linux systems now use a directory /etc/profile.d/; any .sh files in there will be sourced by /etc/profile. It's slightly neater to keep your custom environment stuff in these files than to just edit /etc/profile.

Overexcite answered 29/10, 2009 at 3:53 Comment(5)
What if some users use another shell, like zsh?Scalawag
this is not global ... it is restricted to the shell.. too bad it is the most accepted answerAmphidiploid
zsh will source .sh files in /etc/profile.d/, you can see it from /etc/zshrc @Matthieu NapoliPerspicuity
Scripts are not used for ROOT user.Cornflakes
@Bily, this is not correct for all systems. For example on my Ubuntu 21.04 there is no /etc/zshrc and the global config at /etc/zsh/zshrc does not source stuff from /etc/profile.d/Litigate
L
122

If your LinuxOS has this file:

/etc/environment

You can use it to permanently set environmental variables for all users.

Extracted from: http://www.sysadmit.com/2016/04/linux-variables-de-entorno-permanentes.html

Lousewort answered 25/4, 2016 at 10:53 Comment(1)
Works for me too on KubuntuSapphire
R
41

man 8 pam_env

man 5 pam_env.conf

If all login services use PAM, and all login services have session required pam_env.so in their respective /etc/pam.d/* configuration files, then all login sessions will have some environment variables set as specified in pam_env's configuration file.

On most modern Linux distributions, this is all there by default -- just add your desired global environment variables to /etc/security/pam_env.conf.

This works regardless of the user's shell, and works for graphical logins too (if xdm/kdm/gdm/entrance/… is set up like this).

Rochellrochella answered 29/10, 2009 at 4:7 Comment(3)
+1 you also need to reboot after adding a variable in pam_env.conf cause instantly on the fly $ echo $variablename does not showChuffy
You don't need to reboot, you need to relog-in. (No rebooting critical servers for me)Mountfort
This doesn't seem to apply to my distro, Mint 17.2. The preinstalled file is entirely commented out, and if I add something like echo foo>/home/me/bar and reboot (and log in again), that file doesn't get created. (There's probably a more elegant way to test this, but I wanted to be sure before commenting here.)Phenothiazine
S
19

Amazingly, Unix and Linux do not actually have a place to set global environment variables. The best you can do is arrange for any specific shell to have a site-specific initialization.

If you put it in /etc/profile, that will take care of things for most posix-compatible shell users. This is probably "good enough" for non-critical purposes.

But anyone with a csh or tcsh shell won't see it, and I don't believe csh has a global initialization file.

Silica answered 29/10, 2009 at 3:41 Comment(2)
/etc/environment actually seems to set environment variables at for me, even as the root user. I know that /etc/environment is on amazon linux and ubuntu. I didn't get to check if works for csh, tcsh, or zsh.Elane
it is not specific to the shell you are using, it is truly globalSapphire
A
15

Some interesting excerpts from the bash manpage:

When bash is invoked as an interactive login shell, or as a non-interactive shell with the --login option, it first reads and executes commands from the file /etc/profile, if that file exists. After reading that file, it looks for ~/.bash_profile, ~/.bash_login, and ~/.profile, in that order, and reads and executes commands from the first one that exists and is readable. The --noprofile option may be used when the shell is started to inhibit this behavior.
...
When an interactive shell that is not a login shell is started, bash reads and executes commands from /etc/bash.bashrc and ~/.bashrc, if these files exist. This may be inhibited by using the --norc option. The --rcfile file option will force bash to read and execute commands from file instead of /etc/bash.bashrc and ~/.bashrc.

So have a look at /etc/profile or /etc/bash.bashrc, these files are the right places for global settings. Put something like this in them to set up an environement variable:

export MY_VAR=xxx
Ardisardisj answered 29/10, 2009 at 3:46 Comment(3)
Note that on classic Unix systems, both Bourne shell and Korn shell also read /etc/profile - it is probably the mostly widely used location for system environment setting. Some versions of the C shell look in /etc/csh.cshrc and /etc/csh.login as well as per-user locations; others do not use any system environment setting file.Catnap
Awesome, just what I was looking for as far as setting the env for non-login shell users.Timotheus
Sorry, I seem to have accidentally downvoted this when for a while the arrows weren't visible... would you mind editing this (typo "environEment" in the second to last line, for example) so I can remove the downvote?Spleenwort
T
6

Every process running under the Linux kernel receives its own, unique environment that it inherits from its parent. In this case, the parent will be either a shell itself (spawning a sub shell), or the 'login' program (on a typical system).

As each process' environment is protected, there is no way to 'inject' an environmental variable to every running process, so even if you modify the default shell .rc / profile, it won't go into effect until each process exits and reloads its start up settings.

Look in /etc/ to modify the default start up variables for any particular shell. Just realize that users can (and often do) change them in their individual settings.

Unix is designed to obey the user, within limits.

NB: Bash is not the only shell on your system. Pay careful attention to what the /bin/sh symbolic link actually points to. On many systems, this could actually be dash which is (by default, with no special invocation) POSIXLY correct. Therefore, you should take care to modify both defaults, or scripts that start with /bin/sh will not inherit your global defaults. Similarly, take care to avoid syntax that only bash understands when editing both, aka avoiding bashisms.

Tripod answered 29/10, 2009 at 3:46 Comment(0)
C
4

Using PAM is execellent.

# 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
Chuffy answered 16/12, 2013 at 10:0 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.