it-swarm.com.de

Wie kann man feststellen, woher eine Umgebungsvariable stammt?

Ich habe eine Linux-Instanz, die ich vor einiger Zeit eingerichtet habe. Wenn ich es starte und mich als root anmelde, gibt es einige Umgebungsvariablen, die ich eingerichtet habe, aber ich kann mich nicht erinnern oder finden, woher sie stammen.

  • Ich habe ~/.bash_profile, /etc/.bash_rc und alle Startskripte.
  • Ich habe find und grep ohne Erfolg ausgeführt.

Ich habe das Gefühl, ich muss vergessen, an einem offensichtlichen Ort zu suchen. Gibt es einen Trick, um das herauszufinden?

177
Joel

Wenn Sie die Variablen mit dem Befehl env anzeigen, sollten sie ungefähr in der Reihenfolge angezeigt werden, in der sie erstellt wurden. Sie können dies als Leitfaden verwenden, um festzustellen, ob sie sehr früh beim Booten vom System oder von einem späteren Profil oder einer anderen Konfigurationsdatei festgelegt wurden. Nach meiner Erfahrung sortieren die Befehle set und export ihre Variablen nach alphabetischer Reihenfolge, sodass die Auflistung nicht so nützlich ist.

63
Ben Combee

Wenn zsh Ihre Login-Shell ist:

zsh -xl

Mit bash:

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

Dadurch wird eine Anmeldeshell simuliert und alles, was getan wird (außer in Bereichen, in denen stderr mit zsh umgeleitet wird), zusammen mit dem Namen der aktuell interpretierten Datei angezeigt.

Sie müssen also nur in dieser Ausgabe nach dem Namen Ihrer Umgebungsvariablen suchen. (Sie können den Befehl script verwenden, um die gesamte Shell-Sitzungsausgabe zu speichern, oder für den Ansatz bash7> file.log anstelle von 7>&2 zum Speichern verwenden die Ausgabe von xtrace an file.log anstatt am Terminal).

Wenn Ihre Variable nicht vorhanden ist, hat die Shell sie wahrscheinlich beim Start geerbt, sodass sie zuvor wie in der PAM-Konfiguration, in ~/.ssh/environment Oder beim Lesen Ihrer X11-Sitzung (~/.xinitrc Gelesen wurde). , ~/.xsession) Oder legen Sie die Dienstdefinition fest, mit der Ihr Anmeldemanager oder sogar früher in einem Startskript gestartet wurde. Dann kann ein find /etc -type f -exec grep -F THE_VAR {} + Helfen.

158

Einige Orte, an denen Sie zuerst suchen sollten:

Systemweit

  • /etc/environment: speziell für Umgebungsvariablen gedacht
  • /etc/env.d/*: Umgebungsvariablen, aufgeteilt in mehrere Dateien
  • /etc/profile: alle Arten von Initialisierungsskripten
  • /etc/profile.d/*: Initialisierungsskripte
  • /etc/bashrc, /etc/bash.bashrc: für Funktionen und Aliase gedacht

benutzerspezifisch

  • ~/.bash_profile: Initialisierung für Login (Bash-) Shells
  • ~/.bashrc: Initialisierung für alle interaktiven (Bash-) Shells
  • ~/.profile: wird für alle Muscheln verwendet
  • ~/.cshrc, ~/.zshrc, ~/.tcshrc: ähnlich für Nicht-Bash-Shells
65
beetstra

@Cian ist richtig. Abgesehen von der Verwendung von find und grep können Sie nicht viel tun, um herauszufinden, woher es stammt. Da ich weiß, dass es sich tatsächlich um eine Umgebungsvariable handelt, würde ich versuchen, Ihre Suche auf/etc/und Ihr Home-Verzeichnis zu konzentrieren. Ersetzen Sie VARIABLE durch die entsprechende Variable, nach der Sie suchen:

$ grep -r VARIABLE /etc/*

$ grep -r VARIABLE ~/.*

34
Aaron Toponce

Wenn Sie set -x In .profile Oder .bash_profile Einfügen, werden alle nachfolgenden Shell-Befehle als Standardfehler protokolliert, und Sie können sehen, ob einer von ihnen diese Variablen setzt. Sie können set -x Oben in /etc/profile Einfügen, um es ebenfalls zu verfolgen. Die Ausgabe kann sehr ausführlich sein, daher möchten Sie sie möglicherweise in eine Datei mit exec 2>/tmp/profile.log Umleiten.

Wenn Ihr System PAM verwendet, suchen Sie in pam_env Oder /etc/pam.conf Nach /etc/pam.d/* Ladeanforderungen. Dieses Modul lädt Umgebungsvariablen aus den angegebenen Dateien oder aus einem Systemstandard, wenn keine Datei angegeben ist (/etc/environment Und /etc/security/pam_env.conf Unter Debian und Ubuntu). Eine andere Datei mit Umgebungsvariablendefinitionen unter Linux ist /etc/login.defs (Suchen Sie nach Zeilen, die mit ENV_ Beginnen).

Überprüfen Sie Ihre Startskripte mit . (Punkt) oder source auf Dateien, die von ihnen stammen. Diese Dateien können sich neben /etc Und $HOME In anderen Verzeichnissen befinden.

Für zsh Benutzer kann es nützlich sein, die Dateien zu verfolgen, auf die (während des Startvorgangs) zugegriffen wird. Sie sind nicht zu viele und man kann sie einzeln durchsehen, um herauszufinden, wo etwas definiert wurde.

zsh -o SOURCE_TRACE
4
Erik Zivkovic

umgebungsvariablen werden in der Datei/etc/profile gespeichert. Machen Sie also mehr/etc/profile und suchen Sie nach gewünschten env-Variablen. Wenn/etc/profile nicht vorhanden ist, suchen Sie die Datei lokk for .profile in Ihrem Home-Verzeichnis

0
Sarvesh Pawar