Comment définir une variable d'environnement pour tout le monde sous mon système Linux?

133

Puis-je avoir certains paramètres universels pour tous mes utilisateurs?

TIMEX
la source
2
Est-ce EXPORT? ajouter ça et c'est global?
TIMEX
Je pense que ce n'est ajouté qu'à la session en cours, lorsque vous ouvrez une nouvelle session dans le terminal, elle disparaîtrait
Haryono Sariputra

Réponses:

104

En plus de /etc/profilece que d'autres ont mentionné, certains systèmes Linux utilisent maintenant un répertoire /etc/profile.d/; tous les .shfichiers qu'il contient proviendront de /etc/profile. Il est légèrement plus simple de conserver vos éléments d'environnement personnalisés dans ces fichiers que de simplement les modifier /etc/profile.

Kieron
la source
4
Et si certains utilisateurs utilisent un autre shell, comme zsh?
Matthieu Napoli
70
ce n'est pas global ... il est limité au shell .. dommage que c'est la réponse la plus acceptée
mmm
1
zsh va chercher les fichiers .sh dans /etc/profile.d/, vous pouvez le voir à partir de / etc / zshrc @Matthieu Napoli
Bily
4
Les scripts ne sont pas utilisés pour l'utilisateur ROOT.
Val
38

homme 8 pam_env

homme 5 pam_env.conf

Si tous les services de connexion utilisent PAM et que tous les services de connexion ont session required pam_env.sodans leurs /etc/pam.d/*fichiers de configuration respectifs , alors toutes les sessions de connexion auront des variables d'environnement définies comme spécifié dans pam_envle fichier de configuration de.

Sur la plupart des distributions Linux modernes, tout est là par défaut - ajoutez simplement les variables d'environnement globales souhaitées à /etc/security/pam_env.conf.

Cela fonctionne quel que soit le shell de l'utilisateur, et fonctionne également pour les connexions graphiques (si xdm / kdm / gdm / entrée /… est configuré comme ceci).

éphémère
la source
1
+1, vous devez également redémarrer après avoir ajouté une variable dans pam_env.conf car instantanément à la volée $ echo $
9
Vous n'avez pas besoin de redémarrer, vous devez vous reconnecter. (Pas de redémarrage des serveurs critiques pour moi)
Lyndon White
Cela ne semble pas s'appliquer à ma distribution, Mint 17.2. Le fichier préinstallé est entièrement commenté, et si j'ajoute quelque chose comme et que je echo foo>/home/me/barredémarre (et me reconnecte ), ce fichier n'est pas créé. (Il y a probablement une façon plus élégante de tester cela, mais je voulais être sûr avant de commenter ici.)
Michael Scheper
16

Étonnamment, Unix et Linux n'ont pas vraiment de place pour définir les variables d'environnement globales. Le mieux que vous puissiez faire est de faire en sorte qu'un shell spécifique ait une initialisation spécifique au site.

Si vous le mettez /etc/profile, cela réglera les choses pour la plupart des utilisateurs de shell compatibles posix. C'est probablement "assez bon" pour des fins non critiques.

Mais quiconque avec un shell cshou tcshne le verra pas, et je ne pense pas qu'il cshait un fichier d'initialisation global.

DigitalRoss
la source
8
/etc/environmentsemble en fait définir les variables d'environnement à pour moi, même en tant qu'utilisateur root. Je sais que /etc/environmentc'est sur Amazon Linux et Ubuntu. Je n'ai pas pu vérifier si cela fonctionne pour csh, tcsh ou zsh.
Jordan Stewart
il n'est pas spécifique au shell que vous utilisez, il est vraiment mondial
Xerus
9

Quelques extraits intéressants de la page de manuel bash:

Lorsque bash est appelé en tant que shell de connexion interactif, ou en tant que shell non interactif avec l' --loginoption, il lit et exécute d'abord les commandes du fichier /etc/profile, si ce fichier existe. Après avoir lu ce fichier, il recherche ~/.bash_profile, ~/.bash_loginet ~/.profile, dans cet ordre, et lit et exécute les commandes de la première qui existe et est lisible. L' --noprofileoption peut être utilisée lorsque le shell est lancé pour empêcher ce comportement.
...
Lorsqu'un shell interactif qui n'est pas un shell de connexion est démarré, bash lit et exécute les commandes depuis /etc/bash.bashrcet ~/.bashrc, si ces fichiers existent. Cela peut être inhibé en utilisant l' --norcoption. le--rcfileL'option file forcera bash à lire et à exécuter des commandes à partir de fichier au lieu de /etc/bash.bashrcet ~/.bashrc.

Alors jetez un œil à /etc/profileou /etc/bash.bashrc, ces fichiers sont les bons endroits pour les paramètres globaux. Mettez quelque chose comme ceci en eux pour configurer une variable d'environnement:

export MY_VAR=xxx
Pascal Thivent
la source
Notez que sur les systèmes Unix classiques, le shell Bourne et le shell Korn lisent également / etc / profile - c'est probablement l'emplacement le plus largement utilisé pour la configuration de l'environnement système. Certaines versions du shell C regardent dans /etc/csh.cshrc et /etc/csh.login ainsi que dans les emplacements par utilisateur; d'autres n'utilisent aucun fichier de configuration d'environnement système.
Jonathan Leffler
Génial, exactement ce que je recherchais en ce qui concerne la configuration de l'environnement pour les utilisateurs de shell non connectés.
David Mann
Désolé, il me semble avoir accidentellement voté contre cela alors que pendant un certain temps les flèches n'étaient pas visibles ... cela vous dérangerait-il de le modifier (faute de frappe "environEment" dans l'avant-dernière ligne, par exemple) pour que je puisse supprimer le vote défavorable?
Benjamin W.
4

Utiliser PAM est excellent.

# 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

la source
2

Chaque processus exécuté sous le noyau Linux reçoit son propre environnement unique qu'il hérite de son parent. Dans ce cas, le parent sera soit un shell lui-même (engendrant un sous-shell), soit le programme 'login' (sur un système typique).

Comme chaque environnement de processus est protégé, il n'y a aucun moyen d'injecter une variable d'environnement à chaque processus en cours d'exécution, donc même si vous modifiez le shell par défaut .rc / profile, il n'entrera en vigueur que lorsque chaque processus se termine et se recharge. ses paramètres de démarrage.

Regardez dans / etc / pour modifier les variables de démarrage par défaut pour un shell particulier. Sachez simplement que les utilisateurs peuvent (et le font souvent) les modifier dans leurs paramètres individuels.

Unix est conçu pour obéir à l'utilisateur, dans des limites.

NB : Bash n'est pas le seul shell de votre système. Faites très attention à ce que le lien symbolique / bin / sh pointe réellement. Sur de nombreux systèmes, cela pourrait en fait être un tiret qui est (par défaut, sans appel spécial) POSIXLEMENT correct. Par conséquent, vous devez prendre soin de modifier les deux valeurs par défaut, sinon les scripts commençant par / bin / sh n'hériteront pas de vos valeurs par défaut globales. De même, veillez à éviter la syntaxe que seul bash comprend lors de l'édition des deux, aka avoiding bashisms.

Tim Post
la source