Ich verstehe den grundlegenden Unterschied zwischen einer interaktiven und einer nicht interaktiven Shell. Aber was unterscheidet eine Login-Shell genau von einer Nicht-Login-Shell?
Können Sie Beispiele für die Verwendung einer nicht angemeldeten interaktiven Shell geben?
Antworten:
Eine Anmeldeshell ist der erste Prozess, der unter Ihrer Benutzer-ID ausgeführt wird, wenn Sie sich für eine interaktive Sitzung anmelden. Der Anmeldeprozess weist die Shell an, sich wie eine Anmelde-Shell mit einer Konvention zu verhalten: Übergabe des Arguments 0, das normalerweise der Name der ausführbaren Shell ist, mit
-
vorangestelltem Zeichen (z. B.-bash
während dies normalerweise der Fall wärebash
. Anmelde-Shells lesen normalerweise eine Datei, die dies tut Dinge wie Umgebungsvariablen:/etc/profile
und~/.profile
für die traditionelle Bourne - Shell,~/.bash_profile
zusätzlich für bash † ,/etc/zprofile
und~/.zprofile
für zsh † ,/etc/csh.login
und~/.login
für csh etc.Wenn Sie sich an einer Textkonsole oder über SSH oder mit anmelden
su -
, erhalten Sie eine interaktive Anmeldeshell . Wenn Sie sich im Grafikmodus (auf einem X-Display-Manager ) anmelden, erhalten Sie keine Anmeldeshell, sondern einen Sitzungs- oder Fenstermanager.Es kommt selten vor, dass eine nicht interaktive Anmeldeshell ausgeführt wird. Bei einigen X-Einstellungen erfolgt dies jedoch, wenn Sie sich mit einem Display-Manager anmelden, um das Lesen der Profildateien zu arrangieren. Andere Einstellungen (dies hängt von der Distribution und dem Display-Manager ab) lesen
/etc/profile
und~/.profile
explizit oder lesen sie nicht. Eine andere Möglichkeit, eine nicht interaktive Anmeldeshell zu erhalten, besteht darin, sich remote mit einem Befehl anzumelden, der über die Standardeingabe übergeben wird und kein Terminal istssh example.com <my-script-which-is-stored-locally
(im Gegensatz zussh example.com my-script-which-is-on-the-remote-machine
einer nicht interaktiven Shell, die keine Anmeldeshell ausführt).Wenn Sie eine Shell in einem Terminal in einer vorhandenen Sitzung starten (Bildschirm, X-Terminal, Emacs-Terminalpuffer, eine Shell in einer anderen usw.), erhalten Sie eine interaktive Shell ohne Anmeldung . Diese Shell liest möglicherweise eine Shell-Konfigurationsdatei (
~/.bashrc
für Bash, die als und für zsh aufgerufenbash
wird , und für csh die Datei, die von der Variablen für POSIX / XSI-kompatible Shells wie dash, ksh und bash angegeben wird, wenn sie als , sofern gesetzt und aufgerufen wird für mksh usw.)./etc/zshrc
~/.zshrc
/etc/csh.cshrc
~/.cshrc
ENV
sh
$ENV
~/.mkshrc
Wenn eine Shell ein Skript oder einen Befehl ausführt, der über die Befehlszeile übergeben wird, handelt es sich um eine nicht interaktive Shell ohne Anmeldung . Solche Shells werden ständig ausgeführt: Wenn ein Programm ein anderes Programm aufruft, wird häufig ein winziges Skript in einer Shell ausgeführt, um dieses andere Programm aufzurufen. Einige Shells lesen in diesem Fall eine Startdatei (bash führt die durch die
BASH_ENV
Variable angegebene Datei aus , zsh läuft/etc/zshenv
und~/.zshenv
), aber dies ist riskant: Die Shell kann in allen möglichen Kontexten aufgerufen werden, und Sie können kaum etwas tun, was möglicherweise nicht möglich ist kaputt machen.† Ich vereinfache ein wenig, siehe Handbuch für die blutigen Details.
quelle
bash
als nicht interaktive Anmeldeshell ausgeführt werden?echo $- | bash -lx
FOO
es sich um eine Umgebungsvariable handelt (dh sie.profile
enthältexport FOO=something
), steht sie allen Unterprozessen zur Verfügung, einschließlichfoo.sh
. Wenn Sie ändern ,.profile
umexport FOO=something_else
dann./foo.sh
noch gedruckt wird ,something
bis zum nächsten Mal , wenn Sie sich anmelden.So stellen Sie fest, ob Sie sich in einer Anmeldeshell befinden:
In Bash können Sie auch Folgendes verwenden
shopt login_shell
:(oder
on
in einer Login-Shell).Informationen finden Sie in
man bash
(Suche nach Invocation). Hier ist ein Auszug:Sie können dies selbst testen. Immer wenn Sie SSH verwenden, verwenden Sie eine Login-Shell. Zum Beispiel:
Die Verwendung einer Login-Shell hat die Bedeutung, dass alle Einstellungen in
/home/user/.bash_profile
ausgeführt werden. Hier noch ein bisschen mehr Infos bei Interesse (vonman bash
)quelle
In einer Login-Shell
argv[0][0] == '-'
. So weiß es, dass es sich um eine Login-Shell handelt.In einigen Situationen verhält es sich je nach Status der "Anmeldeshell" unterschiedlich. ZB würde eine Shell, die keine Login-Shell ist, keinen "Logout" -Befehl ausführen.
quelle
man bash
, mit Hervorhebung hinzugefügt, "Eine Login-Shell ist eine, deren erstes Zeichen des Arguments Null ein - ist, oder eine, die mit der Option --login begonnen wurde. "Eine Shell, die in einem neuen Terminal in einer GUI gestartet wird, ist eine interaktive Shell ohne Anmeldung. Es würde zum Beispiel Ihre .bashrc-Datei als Quelle verwenden, nicht jedoch Ihr .profile.
quelle
Ich werde auf die großartige Antwort von Gilles eingehen, kombiniert mit Timothys Methode zur Überprüfung des Login-Shell-Typs.
Wenn Sie sich selbst davon überzeugen möchten, probieren Sie die folgenden Ausschnitte und Szenarien aus.
Überprüfen, ob die Shell (nicht) interaktiv ist
Überprüfen, ob die Shell (nicht-) angemeldet ist
Wenn die Ausgabe von mit
echo $0
beginnt-
, ist dies die Login-Shell (echo $0
Ausgabebeispiel:)-bash
. Ansonsten handelt es sich um eine Nicht-Login-Shell (echo $0
Ausgabebeispiel:)bash
.Kombinieren wir die beiden oben genannten Elemente, um beide Informationen gleichzeitig zu erhalten:
Szenarien:
Typische SSH-Sitzung ohne spezielle Optionen
Skript ausführen oder explizit über neue Shell ausführen
Lokales Skript remote ausführen
Ausführen eines Befehls über SSH aus der Ferne
Führen Sie einen Befehl über ssh mit
-t
switch aus der Ferne ausSie können die interaktive Shell explizit anfordern, wenn Sie den Befehl remote über ssh mithilfe von
-t
switch ausführen möchten .Hinweis: Auf Thema , warum remote Befehl nicht ausgeführt ist
login shell
mehr Infos hier .quelle