Unterscheiden Sie die interaktive Anmeldung und die nicht interaktive Nichtanmeldungs-Shell
25
Ich versuche, diese vier Begriffe Login, Nicht-Login, Interaktiv und Nicht-Interaktiv zu unterscheiden :
interaktive Login-Shell
Interaktiv - Shell ohne Anmeldung
nicht interaktiv - Login-Shell
Nicht interaktiv - Shell ohne Anmeldung
So wie ich es verstehe - interaktive Shell ohne Anmeldung : Starten Sie das System, melden Sie sich beim System an und öffnen Sie das Terminal. - nicht interaktive Shell ohne Anmeldung : Telnet zum System und melden Sie sich an
Aber was ist mit einer interaktiven Login-Shell?
Meldet es sich beim System an, öffnet ein virtuelles Terminal und meldet sich an? und
nicht interaktiv - Nicht-Login-Shell, läuft ein automatisiertes Skript in Crontab?
Das einzige wirkliche Missverständnis, das Sie zu haben scheinen, ist, was eine nicht interaktive Login-Shell ausmacht.
Kurz (siehe hier für weitere Details) mit Beispielen:
Interaktive Anmeldeshell: Sie melden sich beispielsweise über an einem Remotecomputer an ssh. Alternativ können Sie auf Ihrem lokalen Computer zu einem tty wechseln ( Ctrl+ Alt+ F1) und sich dort anmelden.
Interaktive Shell ohne Anmeldung: Öffnen Sie ein neues Terminal.
Nicht interaktive Shell ohne Anmeldung: Führen Sie ein Skript aus. Alle Skripte werden in einer eigenen Subshell ausgeführt und diese Shell ist nicht interaktiv. Es wird nur zur Ausführung des Skripts geöffnet und sofort geschlossen, wenn das Skript beendet ist.
Nicht interaktive Anmeldeshell: Dies ist äußerst selten und es ist unwahrscheinlich, dass Sie darauf stoßen. Eine Möglichkeit, eine zu starten, ist echo command | ssh server. Wenn sshohne einen Befehl gestartet wird (so sshstatt ssh commanddem ausgeführt wird commandauf dem Remote - Shell) es startet ein Login - Shell. Wenn das stdinvon sshkein tty ist, startet es eine nicht interaktive Shell. Aus diesem Grund echo command | ssh serverwird eine nicht interaktive Anmeldeshell gestartet. Sie können auch eins mit starten bash -l -c command.
Wenn Sie damit herumspielen möchten, können Sie die verschiedenen Shell-Typen wie folgt testen:
Ist diese Shell interaktiv?
Überprüfen Sie den Inhalt der $-Variablen. Für interaktive Shells gehören dazu i:
## Normal shell, just running a command in a terminal: interacive
$ echo $-
himBHs
## Non interactive shell
$ bash -c 'echo $-'
hBc
Ist das eine Login-Shell?
Es gibt keine tragbare Möglichkeit , dies zu überprüfen, aber für Bash können Sie überprüfen, ob die login_shellOption festgelegt ist:
## Normal shell, just running a command in a terminal: interacive
$ shopt login_shell
login_shell off
## Login shell;
$ ssh localhost
$ shopt login_shell
login_shell on
Zusammengefasst ist hier eine der möglichen Arten von Schalen:
## Interactive, non-login shell. Regular terminal
$ echo $-; shopt login_shell
himBHs
login_shell off
## Interactive login shell
$ bash -l
$ echo $-; shopt login_shell
himBHs
login_shell on
## Non-interactive, non-login shell
$ bash -c 'echo $-; shopt login_shell'
hBc
login_shell off
## Non-interactive login shell
$ echo 'echo $-; shopt login_shell'| ssh localhost
Pseudo-terminal will not be allocated because stdin is not a terminal.
hBs
login_shell on
Ich möchte klarstellen, dass 1) Für mich das Anmelden an der GUI bedeutet, das System zu starten, sich am System anzumelden und das Terminal zu öffnen. 2) Telnet oder SSH ist eine interaktive Anmeldeshell non-interactive login shell.
Daisy
@daisy danke für die Klarstellung; Antwort bearbeitet.
Terdon
okay und gui ist irrelevant, interaktive nicht-Login-Shell: öffnen Sie einfach ein neues Terminal entweder lokal oder remote über Telnet oder ssh
daisy
@daisy yep, klingt ungefähr richtig. Aber lesen Sie bitte auch Murus Antwort sorgfältig durch, da dies erklärt, dass dies im Wesentlichen eine Frage der Semantik ist und sich nur darauf auswirkt, welche Startdateien von der Shell gelesen werden. Siehe auch hier für einen noch umfassenderen Überblick über die verschiedenen Shell - Typen.
Terdon
Nicht interaktive Login-Shells sind keine Seltenheit, zum Beispiel werden sie von git verwendet, IIRC.
Quazgar
6
Im Wesentlichen spielt es aus genau einem Grund eine Rolle, ob eine Shell angemeldet ist oder nicht, ob sie interaktiv ist oder nicht:
Die Initialisierungsdateien und Standardoptionen hängen davon ab, ob eine Shell angemeldet ist oder nicht und ob sie interaktiv ist oder nicht.
Ob eine Shell angemeldet ist oder nicht oder interaktiv ist, hängt dementsprechend ausschließlich vom verwendeten Aufruf ab - dem genauen Befehlsnamen und den Optionen.
Die beiden Eigenschaften sind ansonsten orthogonal - ob eine Shell angemeldet ist oder nicht, hat keinen Einfluss darauf, ob sie interaktiv ist oder nicht.
Bash startet eine Login-Shell, wenn eine der folgenden Bedingungen erfüllt ist:
argv[0]Der Name des Befehls, unter dem er aufgerufen wurde, beginnt mit einem -
Die -lOption ist angegeben
In ähnlicher Weise startet bash eine interaktive Shell, wenn eine der folgenden Bedingungen erfüllt ist:
Es wurde keine auszuführende Datei angegeben (dh der Befehl war nicht vorhanden bash some/file) oder eine auszuführende Befehlszeichenfolge ( bash -c 'foo') (der tatsächliche Zustand ist etwas komplexer, siehe Handbuch).
Die -iOption wurde angegeben
Insbesondere (und paradoxerweise) impliziert Letzteres, dass bash -ic 'foo'eine interaktive Shell gestartet wird.
Das Folgende startet also eine interaktive Login-Shell, obwohl sie überhaupt nichts Interaktives enthält und der Aufruf nichts mit dem Einloggen zu tun hatte:
bash -lic true
Das Anmelden über die Konsole oder die grafische Benutzeroberfläche startet eine Anmeldeshell (oder auch nicht), ist ausschließlich eine Auswirkung des Anmeldevorgangs unter Verwendung des entsprechenden Aufrufs.
Eine Hauptverwirrungsquelle ist, dass es eine andere gemeinsame Bedeutung für die "Login" -Shell gibt:
Die Anmelde-Shell eines Benutzers ist die Shell, die in diesem Benutzereintrag definiert ist passwd(die von /etc/passwdLDAP oder einer anderen Quelle stammen kann).
Das loginProgramm, SSH usw. starten diese Shell als Login- Shell im Sinne der restlichen Antwort - -in der Regel mit einem vorangestellten Kommandonamen. Wenn Sie besonders verwirrend sein wollten, könnten Sie sagen:
Einige Anmeldevorgänge starten die Anmeldeshell des Benutzers als Anmeldeshell.
Beachten Sie, dass die GUI-Anmeldung eine Anmeldeshell nur startet, weil die Entwickler dies für zweckmäßig hielten. LightDM führt beim Anmelden ein Skript aus, das offensichtlich nicht interaktiv ist und sicherlich nicht von der Anmeldeshell des Benutzers abhängt (im zweiten Sinne). Verlassen Sie sich jedoch nicht darauf, dass der Anzeigemanager eine Anmeldeshell startet - dies tun nicht alle. In Wayland und GNOME werden beim Anmeldevorgang überhaupt keine Shell-Skripte verwendet.
Der erste Prozess, der unter unserer Benutzer-ID ausgeführt wird, wenn wir uns bei einer Sitzung anmelden. Der Anmeldeprozess weist die Shell an, sich wie eine Anmelde-Shell zu verhalten. Dabei wird das Argument 0 (normalerweise der Name der ausführbaren Shell-Datei) mit einem vorangestellten "-" - Zeichen übergeben
Interaktive Shell:
Liest Befehle von Benutzereingaben auf einem tty. Unter anderem liest eine solche Shell beim Aktivieren Startdateien, zeigt eine Eingabeaufforderung an und aktiviert standardmäßig die Auftragssteuerung. Der Benutzer kann mit der Shell interagieren. Eine Shell, die ein Skript ausführt, ist immer eine nicht interaktive Shell.
Einfach ausgedrückt: Die interaktive Shell erfordert Benutzereingaben, während die nicht interaktive Shell von Skripten ausgeführt wird und keine Benutzereingaben erfordert.
@daisy nein! Die GUI hat absolut nichts damit zu tun. Hier geht es um Kommandozeilen-Shells, nicht um grafische Shells (die ebenfalls existieren, aber ein anderes Biest sind).
Terdon
1
@George nein, es gibt zwei Fehler: Beim Anmelden über die GUI wird keine Anmeldeshell (oder eine andere relevante Shell) gestartet, und beim Anmelden über Telnet bei einem Remote-System wird eine Telnet-Shell gestartet, aber über ssh wird eine interaktive Anmeldung gestartet Schale.
Terdon
1
@ George eigentlich stehe ich korrigiert. Einige GUI-Anmeldungsmanager starten möglicherweise eine Anmeldungsshell zum Lesen .profile(ich dachte, sie .profilebeziehen nur manuell, aber ich liege möglicherweise falsch ).
Terdon
0
Ich möchte erwähnen, dass Sie eine interaktive Login-Shell starten können, indem Sie:
Ausführen sudo /bin/loginund Eingeben Ihrer Anmeldeinformationen
ausführen exec -l /bin/bash
ausführen su -
und wie oben angegeben, mit ssh antworten und sich bei einem entfernten Rechner anmelden
Sie können auch (in Bash) überprüfen, ob die Shell angemeldet ist, indem Sie Folgendes eingeben. echo $0Beginnt die Ausgabe mit einem Bindestrich -, handelt es sich um eine Anmeldeshell.
non-interactive login shell
.Im Wesentlichen spielt es aus genau einem Grund eine Rolle, ob eine Shell angemeldet ist oder nicht, ob sie interaktiv ist oder nicht:
Die Initialisierungsdateien und Standardoptionen hängen davon ab, ob eine Shell angemeldet ist oder nicht und ob sie interaktiv ist oder nicht.
Ob eine Shell angemeldet ist oder nicht oder interaktiv ist, hängt dementsprechend ausschließlich vom verwendeten Aufruf ab - dem genauen Befehlsnamen und den Optionen.
Die beiden Eigenschaften sind ansonsten orthogonal - ob eine Shell angemeldet ist oder nicht, hat keinen Einfluss darauf, ob sie interaktiv ist oder nicht.
Bash startet eine Login-Shell, wenn eine der folgenden Bedingungen erfüllt ist:
argv[0]
Der Name des Befehls, unter dem er aufgerufen wurde, beginnt mit einem-
-l
Option ist angegebenIn ähnlicher Weise startet bash eine interaktive Shell, wenn eine der folgenden Bedingungen erfüllt ist:
bash some/file
) oder eine auszuführende Befehlszeichenfolge (bash -c 'foo'
) (der tatsächliche Zustand ist etwas komplexer, siehe Handbuch).-i
Option wurde angegebenInsbesondere (und paradoxerweise) impliziert Letzteres, dass
bash -ic 'foo'
eine interaktive Shell gestartet wird.Das Folgende startet also eine interaktive Login-Shell, obwohl sie überhaupt nichts Interaktives enthält und der Aufruf nichts mit dem Einloggen zu tun hatte:
Das Anmelden über die Konsole oder die grafische Benutzeroberfläche startet eine Anmeldeshell (oder auch nicht), ist ausschließlich eine Auswirkung des Anmeldevorgangs unter Verwendung des entsprechenden Aufrufs.
Die Bedingungen und Auswirkungen werden ausführlich im Bash-Handbuch im Abschnitt Startdateien beschrieben .
Eine Hauptverwirrungsquelle ist, dass es eine andere gemeinsame Bedeutung für die "Login" -Shell gibt:
Die Anmelde-Shell eines Benutzers ist die Shell, die in diesem Benutzereintrag definiert ist
passwd
(die von/etc/passwd
LDAP oder einer anderen Quelle stammen kann).Das
login
Programm, SSH usw. starten diese Shell als Login- Shell im Sinne der restlichen Antwort --
in der Regel mit einem vorangestellten Kommandonamen. Wenn Sie besonders verwirrend sein wollten, könnten Sie sagen:Einige Anmeldevorgänge starten die Anmeldeshell des Benutzers als Anmeldeshell.
Beachten Sie, dass die GUI-Anmeldung eine Anmeldeshell nur startet, weil die Entwickler dies für zweckmäßig hielten. LightDM führt beim Anmelden ein Skript aus, das offensichtlich nicht interaktiv ist und sicherlich nicht von der Anmeldeshell des Benutzers abhängt (im zweiten Sinne). Verlassen Sie sich jedoch nicht darauf, dass der Anzeigemanager eine Anmeldeshell startet - dies tun nicht alle. In Wayland und GNOME werden beim Anmeldevorgang überhaupt keine Shell-Skripte verwendet.
quelle
Anmeldeshell:
Interaktive Shell:
Einfach ausgedrückt: Die interaktive Shell erfordert Benutzereingaben, während die nicht interaktive Shell von Skripten ausgeführt wird und keine Benutzereingaben erfordert.
quelle
.profile
(ich dachte, sie.profile
beziehen nur manuell, aber ich liege möglicherweise falsch ).Ich möchte erwähnen, dass Sie eine interaktive Login-Shell starten können, indem Sie:
sudo /bin/login
und Eingeben Ihrer Anmeldeinformationenexec -l /bin/bash
su -
Sie können auch (in Bash) überprüfen, ob die Shell angemeldet ist, indem Sie Folgendes eingeben.
echo $0
Beginnt die Ausgabe mit einem Bindestrich-
, handelt es sich um eine Anmeldeshell.quelle