
Ich bin sehr ( zsh
)/einigermaßen ( bash
) mit der Initialisierungssequenz der Shell vertraut, wenn sich der Benutzer über eine Textschnittstelle anmeldet.
Aber was ist mit dem Fall einer „grafischen Anmeldung“, d. h. wenn sich der Benutzer über eine grafische Oberfläche anmeldet (z. B. über einen sogenannten „Display Manager“ unter Linux oder die Standardanmeldung unter OS X)?
Mich interessieren insbesondere die Dateien ( .zprofile
, .zlogin
, .profile
), die nur für "Login-Shells" als Quelle verwendet werden sollen. Wenn die Anmeldung über eine Textschnittstelle erfolgt, ist dies mehr oder weniger gleichbedeutend damit, "genau einmal pro Sitzung" als Quelle verwendet zu werden.
Wenn die Anmeldung über eine grafische Benutzeroberfläche erfolgt, ist mir nicht klar, ob überhaupt eine „Anmeldeshell“ vorhanden ist. Und selbst wenn .zprofile
usw. irgendwann als Teil der grafischen Anmeldesequenz irgendwie als Quelle verwendet werden, ist mir nicht klar, wie sich die Einstellungen (z. B. exportierte Umgebungsvariablen), die sich aus der Verwendung dieser Dateien ergeben, auf den Rest der Sitzung auswirken.
Beeinflussen diese Einstellungen beispielsweise die Umgebung von Apps, die beim Anmelden automatisch gestartet werden? Oder von Apps, die der Benutzer später durch Klicken auf Desktopsymbole startet?
Und was ist mit den Einstellungen, die in .zshenv
oder in .zshrc
/ .bashrc
1 vorgenommen werden ? Haben sie Auswirkungen auf die Umgebung, die von „automatisch gestarteten“ und/oder „per Klick gestarteten“ Apps gesehen wird?
Wenn die Antwort auf eine der letzten beiden Fragen etwa „nicht standardmäßig“ lautet, wäre die Folgefrage: Wie kann sichergestellt werden, dass die in (zumindest) .zprofile
/ .profile
und möglicherweise auch vorgenommenen Einstellungen .zlogin
an die Umgebung übertragen werden, die von allen „automatisch gestarteten“ und „per Klick gestarteten“ Anwendungen gesehen wird?
Mich interessieren die Antworten auf diese Frage für zwei Shells zsh
und bash
und zwei Betriebssysteme, Linux und OSX.
1 unter der Annahme, dass .zshrc
/ .bashrc
als Teil der in zsh
/ bash
integrierten Initialisierungssequenz für „interaktive“ Shells bezogen werden, anstatt explizit von .zprofile
/ bezogen zu werden .profile
.
Antwort1
Shell-Konfigurationsdateien kommen nur dann ins Spiel, wenn die Shell aufgerufen wird. Sie haben nichts Magisches an sich. Jeder Prozess kann seine Umgebung ändern. Die meisten lesen sie nur, aber jedes Programm, das ein anderes ausführt, muss wahrscheinlich zuerst die Umgebung ändern.
Alles beginnt mitdrinoder was auch immer pid 1 auf Ihrem System ist. Es startet den X-Server, der den Display-Manager startet, der die Anmeldeaufforderung bereitstellt. Die Sequenz, mit der X11 gestartet wird, muss keine Anmelde-Shell enthalten; zum Beispiel:drinkönnte fork(2) und exec(2) auf /usr/bin/startx aufrufen. Kein Login, kein .profile
. Der X-Server erbt nur die von exportierte Umgebungdrin.
Wie sieht die Umgebung des X-Servers aus? Sie können die Umgebung eines Prozesses mit ps(1) extrahieren. Einfacher, aber nicht definitiv, ist die Verwendung vonsshHostname/usr/bin/env(WoHostnameist der Name der Maschine, auf der der X11-Server gehostet wird). Ähnlich wie beim X-Server führt sshdUmgebungohne eine Login-Shell zu erstellen.
Dann kommen wir zu dem, was Ihr Display-Manager macht, wenn Sie sich bei ihm anmelden. Er teilt einen Prozess auf, ändert die UID von (wahrscheinlich) root zu Ihrer und startet einen Sitzungsmanager. Für Einzelheiten verweise ich auf Ihr freundliches Handbuch.
Von diesem Punkt an hat der Sitzungsmanager seine Umgebung festgelegt, auf welche Weise auch immer. Prozesse, die er erstellt – Befehlsinterpreter oder andere Anwendungen, die durch „Anklicken“ erstellt werden – erben seine Umgebung. Der Sitzungsmanager bietet möglicherweise eine Möglichkeit, zusätzliche Werte für Umgebungsvariablen für jedes Symbol einzeln zu definieren, und der Prozess, den das angeklickte Objekt startet, kann (wie eine Shell) seine Umgebung beim Start ändern, möglicherweise durch eine Konfigurationsdatei.
Es ist alles da. Um zu verstehen, wie die Umgebung zu dem wird, was sie ist, müssen Sie „nur“ der Kette der Prozesse folgen, die sie erstellt haben, und verstehen, was jeder einzelne mit der Umgebung gemacht hat. Leider variiert diese Kette nicht nur je nach Betriebssystem, Distribution und Maschinen- und Benutzerkonfiguration, sie ist auch nicht besonders gut dokumentiert oder mit Tools ausgestattet. Viel Glück beispielsweise bei der Suche nach Dokumentation, in der angegeben ist, welche Umgebungsvariablen festgelegt werden, bevor beispielsweise sshd gestartet wird, oder bei der Suche nach einem X11-Client, der die Umgebung des Sitzungsmanagers anzeigt.