Comment déterminer d'où vient une variable d'environnement?

154

J'ai une instance Linux que j'ai configurée il y a quelque temps. Lorsque je le lance et rootque je me connecte, il y a des variables d’environnement que j’ai configurées, mais je ne me souviens pas ou ne trouve pas d’où elles viennent.

  • J'ai vérifié ~/.bash_profile, /etc/.bash_rcet tous les scripts de démarrage.
  • J'ai couru findet grepen vain.

J'ai l'impression que je dois oublier de regarder dans un endroit évident. Y a-t-il un truc pour comprendre cela?

Joel
la source
6
/etc/environmentest un autre.
derobert
8
Et des /etc/env.d/*fichiers. Mais faire grep -R "YOUR_VARIABLE" /etc/est probablement le meilleur moyen de le savoir.
rozcietrzewiacz
@rozcietrzewiacz le moyen le plus simple ... si la variable est en effet située quelque part dans / etc / (comme dans mon cas); si vous postez cela comme réponse, je voterais;)
Ligne le

Réponses:

55

Si vous utilisez la envcommande pour afficher les variables, celles-ci doivent apparaître approximativement dans leur ordre de création. Vous pouvez vous en servir pour savoir s'ils ont été définis par le système très tôt au démarrage, ou par un fichier .profile ou un autre fichier de configuration ultérieur. D'après mon expérience, les commandes setet exportvont trier leurs variables par ordre alphabétique, ce qui rend la liste moins utile.

Ben Combee
la source
1
C'est génial ... sauf que j'essaie de savoir ce qui efface une variable d'environnement (définie dans / etc / environment). :-) (Et oui, c'est en train d'être initialisé ... J'ajoute des lignes dans des scripts dans divers pour se connecter là où il est effacé ...)
Michael Scheper
128

Si zshest votre shell de connexion:

zsh -xl

Avec bash:

PS4='+$BASH_SOURCE> ' BASH_XTRACEFD=7 bash -xl 7>&2

Cela simule un shell de connexion et montre tout ce qui est fait (sauf dans les zones où stderr est redirigé avec zsh) avec le nom du fichier en cours d’interprétation.

Il suffit donc de rechercher le nom de la variable d’environnement dans cette sortie. (vous pouvez utiliser la scriptcommande pour vous aider à stocker l'intégralité de la sortie de la session shell ou, pour l' bashapproche, utiliser à la 7> file.logplace de 7>&2pour stocker la xtracesortie au file.loglieu de sur le terminal).

Si votre variable n'y est pas, le shell en a probablement hérité au démarrage. Elle a donc été définie auparavant, comme dans la configuration de PAM, dans les ~/.ssh/environmentéléments lus lors du démarrage de votre session X11 ( ~/.xinitrc, ~/.xsession) ou lors de la définition du service qui a démarré votre connexion. gestionnaire ou même plus tôt dans certains script de démarrage. Alors un find /etc -type f -exec grep -F THE_VAR {} +peut aider.

Stéphane Chazelas
la source
4
Impressionnant et utile, merci. Pour nous n00bs, voudriez-vous en dire un peu plus sur le mode et comment pouvons-nous sortir du mode dans lequel cela nous met? Par exemple, nous ne pouvons pas simplement diriger grep cette sortie.
Geoffrey Hale
5
@ GeoffreyHale si vous zsh -xl 2>&1, c'est-à-dire que vous fusionnez les sorties stderr et stdout, vous pouvez grep comme d'habitude.
Rakesh
1
Est-il possible de faire cela avec la fishcoque?
Nick Sweeting
Même si j'utilise zsh -xl 2>&1, d'une manière ou d'une autre je ne peux pas grep normalement. Apparemment, la sortie ne contient pas de nouvelles lignes appropriées.
Xerus
Je pense que vous pourriez simplement utiliser PS4='+$BASH_SOURCE> ' BASH_XTRACEFD=7 bash -xl 7>/tmp/$(uuidgen), puis grep, sur ce fichier aléatoire également.
bd1251252
51

Quelques endroits à regarder en premier:

À l'échelle du système

  • /etc/environment: spécialement conçu pour les variables d'environnement
  • /etc/env.d/*: variables d'environnement, divisées en plusieurs fichiers
  • /etc/profile: tous types de scripts d'initialisation
  • /etc/profile.d/*: scripts d'initialisation
  • /etc/bashrc, /etc/bash.bashrc: destiné aux fonctions et alias

Spécifique à l'utilisateur

  • ~/.bash_profile: initialisation pour les shell de connexion (bash)
  • ~/.bashrc: initialisation pour tous les shells interactifs (bash)
  • ~/.profile: utilisé pour tous les coquillages
  • ~/.cshrc, ~/.zshrc, ~/.tcshrc: Similaire pour les coquilles non bash
Beetstra
la source
31

@Cian est correct. À part utiliser findet grep, vous ne pouvez pas faire grand chose pour découvrir d’où il vient. Sachant qu’il s’agit bien d’une variable d’environnement, j’essayerais de centrer votre recherche dans / etc / et votre répertoire personnel. Remplacez VARIABLEpar la variable appropriée que vous recherchez:

$ grep -r VARIABLE /etc/*

$ grep -r VARIABLE ~/.*

Aaron Toponce
la source
1
Il est surprenant qu'une réponse disant «vous ne pouvez pas», entourée de réponses disant «oui, vous le pouvez», a même autant de votes positifs.
Michael Scheper
Je ne vois aucune réponse qui permette de déterminer O set une variable a été définie. Il y a des indices utiles, mais pas une seule ligne en mesure de faire le travail.
Andrew Wagner
Cette chose a résolu mon temps. Merci
Hassan Raza
@MichaelScheper "vous ne pouvez pas" le faire sans find / grep. plus tard dans "vous pouvez", il est décrit comment le faire UTILISER grep
Line
23

Si vous entrez set -xvotre .profileou .bash_profile, toutes les commandes shell suivantes seront consignées en erreur standard et vous pourrez voir si l’une d’elles définit ces variables. Vous pouvez aussi mettre set -xen haut /etc/profilepour le tracer. La sortie peut être très détaillée, vous pouvez donc le rediriger vers un fichier avec quelque chose comme exec 2>/tmp/profile.log.

Si votre système utilise PAM, recherchez pam_envles demandes de charge dans /etc/pam.confou /etc/pam.d/*. Ce module charge les variables d’environnement à partir des fichiers spécifiés ou d’une valeur par défaut du système si aucun fichier n’est spécifié ( /etc/environmentet /etc/security/pam_env.confsur Debian et Ubuntu). Un autre fichier avec les définitions de variable d’environnement sous Linux est /etc/login.defs(recherchez les lignes commençant par ENV_).

Gilles
la source
5

Recherchez dans vos scripts de démarrage les fichiers qu’ils utilisent comme source .(point) ou source. Ces fichiers pourraient se trouver dans d’autres répertoires à part /etcet $HOME.

Dennis Williamson
la source
2

Pour les zshutilisateurs, il peut être utile de suivre les fichiers consultés (au démarrage), ils ne sont pas trop nombreux et on peut les parcourir un par un pour trouver où quelque chose a été défini.

zsh -o SOURCE_TRACE
Erik Zivkovic
la source
0

Les variables d'environnement sont stockées dans le fichier / etc / profile, alors faites plus de / etc / profile et vérifiez les variables env que vous voulez et si / etc / profile n'est pas présent, lokk pour le fichier .profile dans votre répertoire personnel

Sarvesh Pawar
la source
1
Les variables d'environnement ne sont pas stockées dans /etc/profile, vous pouvez les définir dans tout le système, par exemple bashlorsqu'elles sont utilisées comme shell de connexion. Ils sont stockés par le processus shell après avoir lu les définitions à partir de fichiers et / ou de lignes de commande.
Anthon
-2

Par exemple, si vous voulez trouver la variable HISTFILE et sa valeur ou si vous voulez savoir quelles variables sont définies pour l'historique, tapez ceci dans le shell:

set | grep HIST
env | grep HIST
printenv | grep HIST
Vusal Aliyev
la source
si vous connaissez déjà le nom, pourquoi pas echo "$HISTFILE":?
Jeff Schaller
parce que nous voulons trouver où la variable $ HISTFILE est définie. Aussi, si je veux savoir quelles variables sont définies dans l'histoire
Vusal Aliyev
2
Malheureusement, setne vous dit pas quel fichier a défini la variable.
Jeff Schaller