web-dev-qa-db-fra.com

Définition de la variable d'environnement global pour tout le monde

Si je définis une variable dans /etc/environment, elle semble ne s'appliquer qu'aux administrateurs alors qu'elle est dans Sudo su.

Comment puis-je obtenir les variables à appliquer à tout le monde? Surtout quand ils sont en terminal? Les paramètres de /etc/enviroment ne s'appliquent-ils pas à bash?

14
Mick.D

La mise à jour /etc/environment ne fonctionnera que lors de la prochaine session, elle ne sera pas rechargée automatiquement.

Ce qui signifie que vous ne pouvez pas le changer pour des sessions qui ont déjà commencé pour d'autres utilisateurs.

Si vous voulez "recharger" tout ce qui se trouve dans le /etc/environment, vous avez besoin de la commande suivante:

source /etc/environment

Mais encore une fois, cela ne fonctionnera que pour votre propre session en cours, les autres utilisateurs ne seront pas affectés avant de démarrer une nouvelle session ou d’exécuter la commande ci-dessus dans leur propre session.

11
Panthro

TL; DR

Ces fichiers de configuration, qu'ils soient globaux (/etc/environment, /etc/profile) ou spécifiques à l'utilisateur (~/.profile, ~/.bashrc) ne sont traités que lors de la prochaine connexion/session.

Les fichiers globaux s'appliquent à tous les utilisateurs (non seulement root) ... mais vous devez redémarrer votre session de connexion pour voir les modifications reflétées dans l'environnement. Cela peut arriver en appelant su comme vous l'avez observé ... ou en vous connectant/déconnectant ou en redémarrant. Vous pouvez su à un utilisateur non root et vous verrez qu'il subit également les modifications de l'environnement.

La raison pour laquelle vous devez redémarrer ou vous reconnecter pour que l'environnement global soit sélectionné est parce que cet environnement est hérité des processus parents et que le processus racine de tout ce que vous exécutez est votre shell de connexion ... si votre shell de connexion n'a pas l'environnement ... les processus démarrés dans le shell de connexion ne le sont pas non plus. Vous pouvez bien sûr définir/mettre à jour l'environnement pour des processus individuels lors de leur démarrage, mais vous devrez définir l'environnement pour le shell de connexion et redémarrer tous les sous-processus pour qu'ils puissent voir la modification.

Environnement global

Comme quelqu'un d'autre l'a mentionné, vous devez redémarrer ou vous déconnecter/vous connecter pour que les modifications apportées à /etc/profile, /etc/profile.d/*.sh et /etc/environment soient prises en compte.

En effet, bien que ces fichiers spécifient un environnement global, ils ne sont exécutés qu’une fois lors de la connexion. Par conséquent, les connexions/sessions existantes ne reflètent pas les modifications apportées à ces fichiers. Un redémarrage "réinitialise" tous les identifiants de connexion, les obligeant à récupérer le nouvel environnement.

Dans votre propre session de connexion, vous pouvez source /etc/profile afin de prendre en compte les modifications sans redémarrage, déconnexion/connexion ... mais cela n'affectera que votre propre session et les nouveaux processus en cours d'exécution dans votre session.

Remarque De plus, il n'y a pas d'interpolation de variable dans /etc/environment (ce n'est pas un script), vous ne pouvez donc pas faire de choses comme PATH="$PATH:/my/custom/path".

Remarque De plus, /etc/profile et /etc/profile.d/*.sh ne sont exécutés que pour les sessions de connexion. Par conséquent, l'environnement configuré ne sera pas disponible pour les comptes système autres que la connexion (c'est-à-dire si essayez de définir une variable d'environnement pour un processus démon exécuté en dehors de votre shell de connexion).

Notez que bashrc n'est pas utile pour configurer l'environnement pour le shell de connexion complet, mais pour les shells bash et les sous-processus ... donc pour le vrai "global" ou " utilisateur global "vous voudrez probablement mettre votre configuration d'environnement dans /etc/profile ou /etc/profile.d/my-custom-env.sh ou ~/.profile. D'autres shells (par exemple zsh) ont leurs propres fichiers de configuration. Ainsi, la configuration d'un environnement non spécifique à bash causera des problèmes ou une confusion si vous changez de shells (ou si d'autres utilisateurs du système utilisent des shells différents).

Il est courant d’installer un nouveau programme et de spécifier un environnement pour le faire fonctionner correctement. L’environnement global est une solution, mais il faudra souvent un redémarrage, ce qui n’est pas idéal pour les serveurs et les cas d’utilisation de provisionnement/configuration automatique. Vous devriez vous demander s'il s'agit vraiment d'une variable dont tous les utilisateurs et programmes du système ont besoin ou si c'est simplement quelque chose que vous devez mettre à la disposition d'un utilisateur ou d'un programme spécifique.

Pour utilisateur spécifique

regardez si vous souhaitez inclure l'environnement dans profile ou bashrc dans le répertoire de base de l'utilisateur (par exemple, ~/.profile. ~/.bashrc), selon que vous le souhaitiez pour un environnement interactif, des shells de connexion, uniquement bash, etc.

N'oubliez pas que cela nécessite également un redémarrage ou une déconnexion/connexion pour que les modifications de l'environnement soient disponibles pour tous les processus de la session de connexion de l'utilisateur. L'utilisateur peut source ~/.profile... mais cela se fait dans un terminal et met à jour l'environnement de cette session de terminal et de ses processus enfants ... pas nécessairement pour l'environnement de connexion complet de l'utilisateur.

Pour un programme spécifique, il y a deux options.

L'une consiste simplement à fournir l'environnement lors de l'exécution de la commande:

VAR_NAME="VAR VALUE" VAR2_NAME="VAR2_VALUE" /path/to/program --opt1 --op2

Si vous utilisez systemd, vous pouvez également spécifier l'environnement dans le fichier unité/service sous [Service] avec Environment=VAR_NAME="VAR VALUE" VAR2_NAME="VAR2_VALUE

Cette option peut sembler maladroite parce que vous devez spécifier l'environnement à chaque fois que vous exécutez un programme, mais si l'environnement n'est vraiment requis que par ce programme ... c'est vraiment le meilleur moyen et vous devez vous y habituer et ne pas tout jeter. dans un fichier bashrc ou de profil.

Si vous n'utilisez pas systemd ou init pour configurer l'environnement et exécuter le programme ... vous pouvez bien entendu aussi envelopper l'exécution du programme avec un script bash dans lequel vous enregistrez la commande complète, y compris la configuration de l'environnement, pour plus de commodité.

Références:

Il y a aussi une réponse très détaillée ici que je vous suggère de lire: https://askubuntu.com/a/247769/82416

3
mattpr

Ajouter une variable à /etc/environment a fonctionné pour moi.

Cependant J'ai dû redémarrer après avoir changé /etc/environment pour que le changement prenne effet. Fermer et rouvrir la fenêtre du terminal n’était pas suffisant.

2
kris

créer un script shell personnalisé sous

/etc/profile.d/

ajoutez vos variables d'environnement globales dans votre script créé, redémarrez la machine pour qu'elle soit disponible pour tout le monde.

1
shalamus