Welche Art von Shell verwende ich, wenn ich mich per SSH mit einer Ubuntu-Maschine in Verbindung setze?

Welche Art von Shell verwende ich, wenn ich mich per SSH mit einer Ubuntu-Maschine in Verbindung setze?

Ich lese immer wieder von interaktiven, nicht interaktiven, Login- und Nicht-Login-Shells.

(Dies geschieht im Kontext dessen, welche der .bash*-Dateien gelesen werden).

Ich verstehe nicht, was die einzelnen Shell-Typen sind, also beginnen wir mit den Grundlagen.

Welcher Shell-Typ wird gestartet, wenn ich von meinem Mac aus per SSH auf meinen Ubuntu-Rechner zugreife?

Antwort1

Wenn Sie sich per SSH mit Ihrer Ubuntu-Box verbinden, erhalten Sie eine interaktive Login-Shell. Hier ist der Unterschied:

  • Interaktiv vs. nicht interaktiv:Jede Shell, in der Sie in eine Eingabeaufforderung tippen können, ist interaktiv. Tatsächlich testen viele Skripte die Variable $PS1, die die Eingabeaufforderungszeichenfolge enthält, um herauszufinden, ob sie interaktiv sind. Wenn eine Shell ein Shell-Skript ausführt, ist sie nicht interaktiv.

    Wenn Sie also tun ssh yourbox.example.com, erhalten Sie eine interaktive Shell mit den Standardeinstellungen. Wenn Sie tun ssh yourbox.example.com mighty_shellscript.sh, erhalten Sie eine nicht interaktive Shell und Ihre SSH-Sitzung wird beendet, wenn das Skript beendet wird.

  • Mit Anmeldung vs. ohne Anmeldung:Wenn Sie sich von der Konsole oder aus der Ferne (z. B. per SSH) anmelden oder die -lOption an übergeben bash, erhalten Sie eine Login-Shell. Andernfalls – z. B. wenn Sie ein Terminalfenster öffnen – erhalten Sie eine Nicht-Login-Shell.

    Um zu testen, ob es sich bei einer Shell um eine Login-Shell handelt, überprüfen Sie, ob ihr Befehlsname -bashanstelle von lautet bash:

    ps -ef | grep [b]ash
    

Antwort2

Sie erhalten eine interaktive Login-Shell. Aber nehmen Sie das nicht als selbstverständlich hin, testen Sie es selbst.

Dies zeigt Ihnen, dass Sie über eine Login-Shell verfügen (von man bash):

# shopt | grep login
login_shell     on

Dies zeigt Ihnen, dass Sie eine interaktive Shell haben. Suchen Sie nach i(von man bash):

# echo $-
himBH

Die interaktive Anmelde-Shell, die Sie erhalten, hat gelesen /etc/profileund als eines von ~/.bash_profile, ~/.bash_loginund ~/.profile, wie in erläutert man bash:

Wenn bash aufgerufen wird als interaktive Login-Shell, oder als nicht-interaktive Shell mit der Option --login,es liest und führt zuerst Befehle aus der Datei /etc/profile aus, falls diese Datei existiert. Nachdem diese Datei gelesen wurde, sucht es in dieser Reihenfolge nach ~/.bash_profile, ~/.bash_login und ~/.profile und liest und führt Befehle aus der ersten Datei aus, die existiert und lesbar ist. Um dieses Verhalten zu unterbinden, kann beim Starten der Shell die Option --noprofile verwendet werden.

Antwort3

Derssh(1)In der Manpage heißt es:

WennBefehlangegeben ist, wird es auf dem Remote-Host anstelle einer Login-Shell ausgeführt.

Und

Wenn die Identität des Benutzers vom Server akzeptiert wurde, führt der Server entweder den angegebenen Befehl aus oder meldet sich beim Computer an und gibt dem Benutzer eine normale Shell auf dem Remotecomputer.

Das lässt für mich darauf schließen, dass es sich bei der Shell, die Sie erhalten, um eine Login-Shell handelt.

Antwort4

Versuchen Sie diesen Befehl.

[max@localhost ~]$ echo $SHELL
/bin/bash

Sie erhalten diese Ausgabe, weil Ihr Shell-Typ in dieser Variable gespeichert ist SHELL.

Um Ihre Umgebungsvariable herauszufinden, geben Sie diesen Befehl ein

[max@localhost ~]$ Umgebung
.
.
.
HOSTNAME=localhost.localdomain
SHELL=/bin/bash
HISTSIZE=1000
USER=max
.
.
.

während der Eingabe echo $SHELLwird der hier gespeicherte Wert ausgedruckt

Dieser Wert wird bei jedem Systemstart aktualisiert.

verwandte Informationen