Wie kann ermittelt werden, woher eine Umgebungsvariable stammt?

154

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

  • Ich habe überprüft ~/.bash_profile, /etc/.bash_rcund alle Startskripts.
  • Ich bin gelaufen findund grepohne Erfolg.

Ich habe das Gefühl, dass ich vergessen muss, irgendwo auf der Hand zu liegen. Gibt es einen Trick, um das herauszufinden?

Joel
quelle
6
/etc/environmentist ein anderer.
Derobert
8
Und /etc/env.d/*Dateien. Aber dies grep -R "YOUR_VARIABLE" /etc/ist wahrscheinlich der beste Weg, es herauszufinden.
Rozcietrzewiacz
1
Siehe auch Wie finde ich unter
Gilles
@rozcietrzewiacz der einfachste Weg ... wenn sich die Variable tatsächlich irgendwo unter / etc / befindet (wie in meinem Fall); Wenn Sie es als Antwort posten, würde ich positiv stimmen;)
Zeile

Antworten:

55

Wenn Sie den envBefehl verwenden, um die Variablen anzuzeigen, sollten sie ungefähr in der Reihenfolge angezeigt werden, in der sie erstellt wurden. Sie können dies als Anhaltspunkt dafür verwenden, ob sie sehr früh beim Start vom System oder von einem späteren Profil oder einer anderen Konfigurationsdatei festgelegt wurden. Nach meiner Erfahrung, die setund exportwerden Befehle ihre Variablen nach alphabetischer Reihenfolge sortieren, so dass Angebot nicht so nützlich ist.

Ben Combee
quelle
1
Das ist toll ... außer ich versuche, um herauszufinden , was Clearing eine Umgebungsvariable (in / etc / Umwelt). :-) (Und ja, es wird anfangs festgelegt ... Ich füge Zeilen in Skripten in verschiedenen hinzu, um zu protokollieren, wo es gelöscht wird ...)
Michael Scheper
128

Wenn zshist Ihre Login-Shell:

zsh -xl

Mit bash:

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

Das simuliert eine Login-Shell und zeigt alles, was gemacht wird (außer in Bereichen, in denen stderr umgeleitet wird zsh), zusammen mit dem Namen der Datei, die gerade interpretiert wird.

Sie müssen also in dieser Ausgabe nur nach dem Namen Ihrer Umgebungsvariablen suchen. (Sie können den scriptBefehl verwenden, um die gesamte Ausgabe der Shell-Sitzung zu speichern , oder für den bashAnsatz verwenden , um die Ausgabe nicht auf dem Terminal , 7> file.logsondern auf 7>&2zu speichern .)xtracefile.log

Wenn Ihre Variable nicht vorhanden ist, hat sie die Shell wahrscheinlich beim Start geerbt. Sie wurde also zuvor wie in der PAM-Konfiguration festgelegt ~/.ssh/environmentoder beim Start der X11-Sitzung ( ~/.xinitrc, ~/.xsession) oder bei der Service-Definition festgelegt, die Ihre Anmeldung gestartet hat Manager oder sogar früher in einem Boot-Skript. Dann find /etc -type f -exec grep -F THE_VAR {} +kann ein helfen.

Stéphane Chazelas
quelle
4
Beeindruckend und hilfsbereit, danke. Würden Sie uns n00bs etwas mehr über den Modus erklären und wie kommen wir aus dem Modus heraus, in den wir uns versetzen? Zum Beispiel können wir diese Ausgabe nicht einfach per Pipe übermitteln.
Geoffrey Hale
5
@GeoffreyHale Wenn Sie zsh -xl 2>&1, dh die stderr und stdout ouputs zusammenführen, können Sie wie gewohnt grep.
Rakesh
1
Gibt es eine Möglichkeit, dies mit der fishShell zu tun ?
Nick Sweeting
Selbst wenn ich es benutze zsh -xl 2>&1, kann ich irgendwie nicht normal greifen. Anscheinend enthält die Ausgabe keine richtigen Zeilenumbrüche oder ähnliches.
Xerus
Ich denke, Sie könnten einfach PS4='+$BASH_SOURCE> ' BASH_XTRACEFD=7 bash -xl 7>/tmp/$(uuidgen)diese zufällige Datei verwenden und dann auch darauf zugreifen.
bd1251252
51

Einige Orte, um zuerst zu schauen:

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: bestimmt für Funktionen und Aliase

Benutzerspezifisch

  • ~/.bash_profile: Initialisierung für Login (Bash-) Shells
  • ~/.bashrc: Initialisierung für alle interaktiven (Bash-) Shells
  • ~/.profile: für alle Muscheln verwendet
  • ~/.cshrc, ~/.zshrc, ~/.tcshrc: Ähnliches gilt für Nicht-Bash - Shells
beetstra
quelle
31

@Cian ist richtig. Abgesehen von der Verwendung von findund grepgibt es nicht viel, was Sie tun können, um herauszufinden, woher es kommt. Da ich weiß, dass es sich tatsächlich um eine Umgebungsvariable handelt, würde ich versuchen, Ihre Suche in / etc / und Ihrem Home-Verzeichnis zu fokussieren. Ersetzen Sie VARIABLEdurch die entsprechende Variable, nach der Sie suchen:

$ grep -r VARIABLE /etc/*

$ grep -r VARIABLE ~/.*

Aaron Toponce
quelle
1
Es ist überraschend, dass eine Antwort, die "Sie können nicht" sagt, umgeben von Antworten, die "Ja, Sie können" sagen, sogar so viele positive Stimmen hat.
Michael Scheper
Ich sehe keine Antworten, die tatsächlich Aufschluss darüber geben, WO eine Variable gesetzt wurde. Es gibt einige nützliche Hinweise, aber keine Einzeiler, die die Arbeit erledigen können.
Andrew Wagner
Dieses Ding löste meine Zeit. Vielen Dank.
Hassan Raza
@MichaelScheper "Ohne find / grep geht das nicht". später in "you can" wird beschrieben, wie es mit grep
Line
23

Wenn Sie set -xIhr .profileoder .bash_profileeingeben, werden alle nachfolgenden Shell-Befehle als Standardfehler protokolliert und Sie können sehen, ob einer von ihnen diese Variablen festlegt. Sie können es auch set -xan die Spitze setzen /etc/profile, um es zu verfolgen. Die Ausgabe kann sehr ausführlich sein, so dass Sie sie möglicherweise in eine Datei mit so etwas wie umleiten möchten exec 2>/tmp/profile.log.

Wenn Ihr System PAM verwendet, suchen Sie pam_envin /etc/pam.confoder nach Ladeanforderungen /etc/pam.d/*. Dieses Modul lädt Umgebungsvariablen aus den angegebenen Dateien oder aus einem Systemstandard, wenn keine Datei angegeben ist ( /etc/environmentund /etc/security/pam_env.confunter Debian und Ubuntu). Eine andere Datei mit Umgebungsvariablendefinitionen unter Linux ist /etc/login.defs(suchen Sie nach Zeilen, die mit beginnen ENV_).

Gilles
quelle
5

Überprüfen Sie Ihre Startskripte auf Dateien, die sie mit .(Punkt) oder (Punkt) erzeugen source. Diese Dateien können sich neben /etcund in anderen Verzeichnissen befinden $HOME.

Dennis Williamson
quelle
2

Für zshBenutzer kann das Verfolgen der Dateien, auf die zugegriffen wird (während des Startvorgangs), nützlich sein. Sie sind nicht zu zahlreich und können einzeln durchsucht werden, um herauszufinden, wo etwas definiert wurde.

zsh -o SOURCE_TRACE
Erik Zivkovic
quelle
0

Umgebungsvariablen werden in der Datei / etc / profile gespeichert, führen Sie also mehr / etc / profile aus, und überprüfen Sie, ob die gewünschten Umgebungsvariablen vorhanden sind. Wenn / etc / profile nicht vorhanden ist, suchen Sie in Ihrem Ausgangsverzeichnis nach der Datei .profile

Sarvesh Pawar
quelle
1
Umgebungsvariablen werden nicht gespeichert /etc/profile, sondern können dort systemweit definiert werden, z. B. bashwenn sie als Login-Shell verwendet werden. Sie werden vom Shell-Prozess gespeichert, nachdem Definitionen aus Dateien und / oder der Befehlszeile eingelesen wurden.
Anthon
-2

Wenn Sie beispielsweise die Variable HISTFILE und ihren Wert suchen oder wissen möchten, welche Variablen für den Verlauf definiert sind, geben Sie Folgendes in die Shell ein:

set | grep HIST
env | grep HIST
printenv | grep HIST
Vusal Aliyev
quelle
Wenn Sie den Namen bereits kennen, warum nicht echo "$HISTFILE":?
Jeff Schaller
Wir wollen herausfinden, wo die Variable $ HISTFILE definiert ist. Auch wenn ich wissen will, welche Variablen über die Geschichte definiert ist
Vusal Aliyev
2
Leider setverrät dir nicht, welche Datei die Variable definiert hat.
Jeff Schaller