web-dev-qa-db-fra.com

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

J'ai une instance Linux que j'ai installée il y a quelque temps. Lorsque je l'allume et me connecte en tant que root, je configure certaines variables d'environnement, mais je ne me souviens pas ou ne trouve pas d'où elles viennent.

  • J'ai vérifié ~/.bash_profile, /etc/.bash_rc, et tous les scripts de démarrage.
  • J'ai exécuté find et grep en vain.

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

177
Joel

Si vous utilisez la commande env pour afficher les variables, elles doivent apparaître approximativement dans l'ordre dans lequel elles ont été créées. Vous pouvez l'utiliser comme guide 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 set et export trieront leurs variables par ordre alphabétique, de sorte que la liste n'est pas aussi utile.

63
Ben Combee

Si zsh est votre shell de connexion:

zsh -xl

Avec bash:

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

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

Il vous suffit donc de rechercher le nom de votre variable d'environnement dans cette sortie. (vous pouvez utiliser la commande script pour vous aider à stocker l'intégralité de la sortie de la session Shell, ou pour l'approche bash, utilisez 7> file.log au lieu de 7>&2 pour stocker la sortie xtrace dans file.log au lieu de sur le terminal).

Si votre variable n'est pas là, alors le Shell l'a probablement héritée au démarrage, donc elle a été définie auparavant comme dans la configuration PAM, dans ~/.ssh/environment, ou des informations lues au démarrage de votre session X11 (~/.xinitrc, ~/.xsession) ou définissez la définition de service qui a démarré votre gestionnaire de connexion ou même plus tôt dans un script de démarrage. Puis un find /etc -type f -exec grep -F THE_VAR {} + peut aider.

158
Stéphane Chazelas

Quelques endroits à regarder en premier:

à l'échelle du système

  • /etc/environment: spécifiquement destiné aux variables d'environnement
  • /etc/env.d/*: variables d'environnement, divisées en plusieurs fichiers
  • /etc/profile: tous les 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 shells de connexion (bash-)
  • ~/.bashrc: initialisation pour tous les shells (bash-) interactifs
  • ~/.profile: utilisé pour tous les shells
  • ~/.cshrc, ~/.zshrc, ~/.tcshrc: similaire pour les shells non bash
65
beetstra

@Cian est correct. Outre l'utilisation de find et 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'essaierais de concentrer votre recherche dans/etc/et votre répertoire personnel. Remplacez VARIABLE par la variable appropriée que vous recherchez:

$ grep -r VARIABLE /etc/*

$ grep -r VARIABLE ~/.*

34
Aaron Toponce

Si vous mettez set -x dans ton .profile ou .bash_profile, toutes les commandes Shell suivantes seront enregistrées dans l'erreur standard et vous pouvez voir si l'une d'elles définit ces variables. Vous pouvez mettre set -x Au sommet de /etc/profile pour le retracer également. La sortie peut être très détaillée, vous pouvez donc la rediriger vers un fichier avec quelque chose comme exec 2>/tmp/profile.log.

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

Vérifiez vos scripts de démarrage pour les fichiers qui ils source en utilisant . (point) ou source. Ces fichiers peuvent se trouver dans d'autres répertoires que /etc et $HOME.

Pour les utilisateurs de zsh, le traçage des fichiers auxquels on accède (au démarrage) peut être utile, 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
4
Erik Zivkovic

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

0
Sarvesh Pawar