it-swarm.com.de

Unterscheiden Sie zwischen interaktiver Anmeldung und nicht interaktiver Nicht-Anmeldeshell

Ich versuche, diese vier Begriffe zu unterscheiden: Login, Nicht-Login, Interaktiv und Nicht-Interaktiv :

  • interaktiv - Login-Shell
  • interaktiv - Shell ohne Anmeldung
  • nicht interaktiv - Login-Shell
  • nicht interaktiv - Shell ohne Anmeldung

Wie ich es verstehe
interaktiv - keine Anmelde-Shell: Starten Sie das System, melden Sie sich beim System an und öffnen Sie das Terminal und
nicht interaktiv - Login-Shell: Telnet zum System und Einloggen

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 - keine Anmeldung Shell, wird ein automatisiertes Skript in Crontab ausgeführt?

25
d a i s y

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 bei einem Remotecomputer beispielsweise über ssh an. Alternativ können Sie auf Ihrem lokalen Computer zu einem tty wechseln (Ctrl+Alt+F1) und log dich dort ein.

  • 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 ssh ohne einen Befehl gestartet wird (also ssh anstelle von ssh command, der command auf der Remote-Shell ausführt), wird eine Anmeldeshell gestartet. Wenn das stdin des ssh kein tty ist, wird eine nicht interaktive Shell gestartet. Aus diesem Grund startet echo command | ssh server eine nicht interaktive Anmeldeshell. Sie können eine auch mit bash -l -c command starten.

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 enthält es 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 Option login_Shell gesetzt 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 Shell:

## 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
37
terdon

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 sich eine Shell anmeldet 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 Option -l 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 (d. h. der Befehl war nicht bash some/file) oder eine auszuführende Befehlszeichenfolge (bash -c 'foo') (der tatsächliche Zustand ist etwas komplexer, siehe Handbuch).
  • die Option -i wurde angegeben

Insbesondere (und paradoxerweise) impliziert letzteres, dass bash -ic 'foo' eine interaktive Shell startet.

Das Folgende startet also ein Login, eine interaktive 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 Benutzeroberfläche startet eine Anmelde-Shell (oder auch nicht), ist vollständig eine Auswirkung des Anmeldevorgangs unter Verwendung des entsprechenden Aufrufs.

Die Bedingungen und Auswirkungen sind ausführlich in Bash-Handbuch, Abschnitt Startdateien beschrieben.


Eine Hauptverwirrungsquelle ist, dass es eine andere gemeinsame Bedeutung für "Login" Shell gibt:

Die Login-Shell eines Benutzers ist die Shell, die im passwd -Eintrag dieses Benutzers definiert ist (der aus /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 - mit einem führenden - normalerweise im Befehlsnamen. 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 startet, nur weil die Entwickler dies für zweckmäßig hielten. LightDM führt beim Anmelden ein Skript aus, das offensichtlich nicht interaktiv ist und auf keinen Fall von der Anmeldeshell des Benutzers abhängt (im zweiten Sinne). Verlassen Sie sich jedoch nicht darauf, dass der Anzeigemanager eine Anmelde-Shell startet - nicht alle von ihnen. In Wayland und GNOME werden beim Anmeldeprozess überhaupt keine Shell-Skripte verwendet.

6
muru

Login-Shell:

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.

3
George Udosen