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?

Gänseblümchen
quelle

Antworten:

38

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
terdon
quelle
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.

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/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.

muru
quelle
3

Anmeldeshell:

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.

George Udosen
quelle
Die angegebenen Beispiele sind also korrekt.
Gänseblümchen
Ja daisy du bist am richtigen Ort.
George Udosen
1
@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:

  1. Ausführen sudo /bin/loginund Eingeben Ihrer Anmeldeinformationen
  2. ausführen exec -l /bin/bash
  3. ausführen su -
  4. 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.

SantaXL
quelle