Wenn Sie eine Shell oder ein Terminal öffnen (oder zu einem wechseln) und Sie aufgefordert werden, sich anzumelden (Benutzername? Passwort?), Bevor Sie dazu aufgefordert werden, handelt es sich um eine Anmeldeshell.
Wenn dies nicht der Fall ist (wie bei gnome-terminal ) und Sie es sofort verwenden können, handelt es sich um eine Shell ohne Anmeldung.
Wenn Sie ein normaler Benutzer von Ubuntu Desktop sind, ist die einzige Anmeldeshell ... Ihr Desktop (Sie geben ein Passwort ein, um hineinzukommen, oder?)? Nun, technisch gesehen ist es eine Login-Shell, die eine GUI startet, aber das bringt uns in die Fachsprache. Und ja, es werden die Einstellungen eingelesen.profile
Das einzige Mal, dass Sie (ein normaler Benutzer) wahrscheinlich eine Anmeldeshell sehen, die wie eine Anmeldeshell aussieht, ist, wenn Sie Probleme mit Ihrem Desktop haben und mit der Tastenkombination Ctrl+ Alt+ zu einem virtuellen Terminal wechseln F1.
Die anderen allgemeinen Fälle für eine Login-Shell sind:
Fernzugriff auf Ihren Computer über ssh(oder lokale Verbindung mit ssh localhost)
Eine erste Login-Shell mit bash -l(oder sh -l) simulieren
simuliert eine erste rootLogin-Shell mitsudo -i
oder für ein anderes nicht Benutzersudo -u username -iroot
Authentifizierung als ein anderer Nichtbenutzer rootmit (und ihrem Passwort)su - username
Verwenden Sie den sudo loginBefehl, um den Benutzer zu wechseln
Wenn ich meine Eclipse-IDE vom Terminal aus starte, wird sie erwartungsgemäß geöffnet. Wenn ich jedoch versuche, sie durch Klicken auf das Eclipse-Symbol zu öffnen, kann sie den Java-Speicherort nicht erkennen (es sei denn, in der .profile-Datei ist PATH for Java anderweitig festgelegt). Wenn Sie auf das Eclipse-Symbol klicken, benötigen Sie eine Anmeldeshell. Warum?
DUKE
2
@DUKE, Nein, dies bedeutet, dass Umgebungsvariablen anders festgelegt werden müssen, wenn Sie einen Desktop / eine GUI verwenden als ein echtes Konsolensystem, das nur über die Befehlszeile ausgeführt wird. Geben Sie Ihren PATH usw. ein ~/.pam_environment(nur Variablen, keine Bash-Befehle!), Melden Sie sich ab, melden Sie sich an und beobachten Sie, wie alles auf magische Weise auf dem Desktop und im Gnome-Terminal erscheint!
ish
1
Die Anmeldung über ssh ruft keine Anmeldeshell auf. Es wird nicht geladen /etc/profile, /etc/profile.doder ~/.profile.
@xuhdev Login via ssh ruft eine Login-Shell auf und lädt / etc / profile, /etc/profile.d und ~ / .bash_profile.
MichaelZ
9
Ich denke nicht, dass eine richtige Antwort ohne "Fachjargon" gegeben werden kann. Da diese Frage die erste ist, die in Google für die Abfrage "Was ist eine Anmeldeshell?" Auftaucht, gebe ich im Folgenden eine korrektere Antwort:
Die Login-Shell ist einfach eine Shell, die als Login-Shell bezeichnet wurde. Dies bedeutet nicht , dass die Shell nach der Anmeldung angezeigt wird. In der Regel teilt eine Anwendung, die Sie anmeldet, der Shell mit, dass sie als Anmeldeshell gestartet wird. Es gibt die folgenden Möglichkeiten, um der Shell mitzuteilen, dass es sich um eine Login-Shell handeln soll:
Ausführen von Shell mit -loder --loginArgument, vorausgesetzt, es weiß es (ich kenne keine Shells, die nicht wissen -l, sondern --loginnur von einigen Shells unterstützt werden).
Running Shell mit argv[0]set to -{some_string}(dh mit HYPHEN-MINUS, das vor einer normalen argv[0]oder einer anderen Zeichenkette steht). Dies ist, was ssh und su tun: su läuft nur mit -suas argv[0](Hallo, jeder denkt, das argv[0]hat etwas mit dem Namen der aktuell laufenden ausführbaren Datei zu tun), ssh läuft mit zsh, -zshwenn der Benutzer /bin/zshals Shell festgelegt hat.
Die Logizität der Shell hat absolut nichts damit zu tun, dass jemand Sie nach einem Passwort fragt oder ein anderes Authentifizierungsverfahren durchführt. Einige Programme wie ssh oder login (oder einige Terminalemulatoren wie urxvt) führen Shells als Login aus argv[0], die mit einem HYPHEN-MINUS beginnen. Einige wie su oder sudo (oder zsh: siehe -den im Abschnitt PRECOMMAND MODIFIERS in beschriebenen Precommand Modifier man zshmisc) tun dies nicht standardmäßig, können dies aber mitteilen . Einige haben die einzige Möglichkeit, der Shell mit ihrem Argument (dh bash -lssh mit einem Befehlsargument, das ssh explizit mitteilt, was auf der Remote-Seite ausgeführt werden soll) mitzuteilen, dass es sich um die Login-Shell handelt .
Im Allgemeinen ist es besser, zuerst die Dokumentation des Programms zu konsultieren, das zum Aufrufen der Shell verwendet wird, um festzustellen, ob die Shell als Anmelde-Shell fungiert, und anschließend einige Tests durchzuführen, um festzustellen, ob die App eine Anmelde-Shell startet (z. B. durch Hinzufügen echozu .profile).
Ich bin an der zweiten Option interessiert: Wie kann ich argv [0] vor (oder nach) dem Aufrufen von bash tatsächlich ändern? Kann es von der Kommandozeile aus gemacht werden?
VeryHardCoder
@VeryHardCoder Dies hängt von der Anwendung ab, mit der Sie den Befehl ausführen. In C - Code wird durch die direkte Versorgung getan , argv[0]um eine der exec*Funktionen, natürlich und unvermeidlich: Sie immer liefern beideargv[0] und den Pfad zum Befehl ausführt tatsächlich bei der Verwendung von exec*Funktionen, auch wenn Sie nicht wollen , jemals argv[0]von Befehl ausgeführt , anders sein. Andere Sprachen bieten ihre eigenen Wege. Speziell bash erlaubt die Verwendung von exec -a new_argv0 bash, aber dies ersetzt natürlich die aktuell ausgeführte Shell durch das, was Sie execbearbeitet haben. Möglicherweise müssen Sie subshell ( (exec -a -zsh zsh))
ZyX
OK habe es! Eigentlich könnte es noch einfacher gemacht werden: (exec -l bash) ...
VeryHardCoder
1
Was ist der funktionale Unterschied zwischen den beiden? Ist das einfach eine Boolesche Flagge?
Alexey
@Alexey Der Hauptunterschied zwischen den Funktionen besteht in einer Reihe von Konfigurationsdateien, die beim Start verwendet werden. $0, und vielleicht ist auch etwas anderes (Variable, Einstellung usw.) festgelegt, damit die Logizität der Shell in der Konfigurationsdatei erkannt wird. Aber wer stört es eigentlich, dies zu erkennen, damit es einen Unterschied macht? Das ist alles was ich weiß.
~/.pam_environment
(nur Variablen, keine Bash-Befehle!), Melden Sie sich ab, melden Sie sich an und beobachten Sie, wie alles auf magische Weise auf dem Desktop und im Gnome-Terminal erscheint!/etc/profile
,/etc/profile.d
oder~/.profile
.Ich denke nicht, dass eine richtige Antwort ohne "Fachjargon" gegeben werden kann. Da diese Frage die erste ist, die in Google für die Abfrage "Was ist eine Anmeldeshell?" Auftaucht, gebe ich im Folgenden eine korrektere Antwort:
Die Login-Shell ist einfach eine Shell, die als Login-Shell bezeichnet wurde. Dies bedeutet nicht , dass die Shell nach der Anmeldung angezeigt wird. In der Regel teilt eine Anwendung, die Sie anmeldet, der Shell mit, dass sie als Anmeldeshell gestartet wird. Es gibt die folgenden Möglichkeiten, um der Shell mitzuteilen, dass es sich um eine Login-Shell handeln soll:
-l
oder--login
Argument, vorausgesetzt, es weiß es (ich kenne keine Shells, die nicht wissen-l
, sondern--login
nur von einigen Shells unterstützt werden).argv[0]
set to-{some_string}
(dh mit HYPHEN-MINUS, das vor einer normalenargv[0]
oder einer anderen Zeichenkette steht). Dies ist, was ssh und su tun: su läuft nur mit-su
asargv[0]
(Hallo, jeder denkt, dasargv[0]
hat etwas mit dem Namen der aktuell laufenden ausführbaren Datei zu tun), ssh läuft mit zsh,-zsh
wenn der Benutzer/bin/zsh
als Shell festgelegt hat.Die Logizität der Shell hat absolut nichts damit zu tun, dass jemand Sie nach einem Passwort fragt oder ein anderes Authentifizierungsverfahren durchführt. Einige Programme wie ssh oder login (oder einige Terminalemulatoren wie urxvt) führen Shells als Login aus
argv[0]
, die mit einem HYPHEN-MINUS beginnen. Einige wie su oder sudo (oder zsh: siehe-
den im Abschnitt PRECOMMAND MODIFIERS in beschriebenen Precommand Modifierman zshmisc
) tun dies nicht standardmäßig, können dies aber mitteilen . Einige haben die einzige Möglichkeit, der Shell mit ihrem Argument (dhbash -l
ssh mit einem Befehlsargument, das ssh explizit mitteilt, was auf der Remote-Seite ausgeführt werden soll) mitzuteilen, dass es sich um die Login-Shell handelt .Im Allgemeinen ist es besser, zuerst die Dokumentation des Programms zu konsultieren, das zum Aufrufen der Shell verwendet wird, um festzustellen, ob die Shell als Anmelde-Shell fungiert, und anschließend einige Tests durchzuführen, um festzustellen, ob die App eine Anmelde-Shell startet (z. B. durch Hinzufügen
echo
zu.profile
).quelle
argv[0]
um eine derexec*
Funktionen, natürlich und unvermeidlich: Sie immer liefern beideargv[0]
und den Pfad zum Befehl ausführt tatsächlich bei der Verwendung vonexec*
Funktionen, auch wenn Sie nicht wollen , jemalsargv[0]
von Befehl ausgeführt , anders sein. Andere Sprachen bieten ihre eigenen Wege. Speziell bash erlaubt die Verwendung vonexec -a new_argv0 bash
, aber dies ersetzt natürlich die aktuell ausgeführte Shell durch das, was Sieexec
bearbeitet haben. Möglicherweise müssen Sie subshell ((exec -a -zsh zsh)
)$0
, und vielleicht ist auch etwas anderes (Variable, Einstellung usw.) festgelegt, damit die Logizität der Shell in der Konfigurationsdatei erkannt wird. Aber wer stört es eigentlich, dies zu erkennen, damit es einen Unterschied macht? Das ist alles was ich weiß.