Ich habe den Unterschied zwischen sudo -i/-s
hier gelesen . Nach der Verwendung des Befehls shopt
wird festgestellt, dass all ( sudo su/sudo -i/sudo -s
) die $SHELL
gleichen Ergebnisse liefern, die shopt
Befehlsergebnisse jedoch unterschiedlich sind.
Also, wie ist Login und Nicht-Login-Shell definiert?
Von dort , wo shopt
das Ergebnis erhalten?
Warum ist es nicht verwandt mit $SHELL
?
sudo su
givinv@87-109:~$ sudo su
root@87-109:/home/givinv#
root@87-109:/home/givinv#
root@87-109:/home/givinv# shopt -q login_shell && echo 'Login shell' || echo 'No login shell'
No login shell
root@87-109:/home/givinv# echo $SHELL
/bin/bash
root@87-109:/home/givinv#
root@87-109:/home/givinv# exit
givinv@87-109:~$
sudo -i
givinv@87-109:~$ sudo -i
root@87-109:~#
root@87-109:~# shopt -q login_shell && echo 'Login shell' || echo 'No login shell'
Login shell
root@87-109:~# echo $SHELL
/bin/bash
root@87-109:~#
sudo -s
root@87-109:~# sudo -s
root@87-109:~# shopt -q login_shell && echo 'Login shell' || echo 'No login shell'
No login shell
root@87-109:~# echo $SHELL
/bin/bash
root@87-109:~#
command-line
bash
sudo
Prado
quelle
quelle
.profile
oder Äquivalente) Benutzer, wie in/etc/passwd
oder gleichwertig definiert .$SHELL
Enthält die letztere, beschäftigen sich Ihreshopt
Ausgaben mit der ersteren. Wenn die Shell in (2) bei der Anmeldung gestartet wird, wird sie in der Regel auf die für (1) erforderliche Art und Weise gestartet, sodass die Bedeutungen zusammengeführt werden.$SHELL
(und verbinden Sie es mit einem Pseudo-Terminal) definiert ist, verzweigen, die wiederum in Ihrem / etc / passwd-Eintrag definiert ist. Diese Shell ist eine Login-Shell und kann mit getestet werdenif [[ -o login ]]; then echo "I am a login shell"; fi
. Als Anmeldeshell würde es die Aufgaben ausführen, die für eine neue Sitzung geeignet sind. zB source~/.zprofile
oder ähnliches, das möglicherweise Umgebungsvariablen und benutzerdefinierten Shell-Code setzt, den Sie zu diesem ZeitpunktAntworten:
TL; DR :
/etc/passwd
.sudo su
/sudo su -
/sudo -i
/sudo -s
gleich? Nein, sie alle spawnen eine Shell, aber anders und in unterschiedlichen Kontexten.$SHELL
das? Sagen Sie einfach Ihre Standard-Shell, wie in/etc/passwd
.Tatsächliche Antwort :
Zuallererst ist es wichtig zu erwähnen, dass dies
shopt
bash-spezifisch ist. Zum Beispiel bin ichmksh
Shell-Benutzer, und es hat nichtshopt
, genau wieksh
nicht.Was genau
login_shell
soll als nächstes dargestellt werden? Vonman bash
:Das ist der entscheidende Punkt.
sudo -i
soll, wie Sie bereits aus der vorherigen Antwort wissen, die erstmalige Anmeldung simulieren. Aus diesem Grundshopt
wirdlogin_shell on
für diese Option berichtet. Stellen Sie sich das so vor, als würdesudo -i
die Shell dazu gezwungen, Dateien zu durchsuchen, die nur während eines Anmeldevorgangs angezeigt werden sollen (die nicht von interaktiven Shells bezogen werden).In anderen Fällen führen Sie bereits eine Instanz einer Shell aus, sodass es sich nicht in erster Linie um eine Anmeldeshell handeln kann, und der Zweck der Optionen ist unterschiedlich.
sudo -s
Liest lediglich$SHELL
die/etc/passwd
Variable (die Ihre Standard-Shell darstellen soll, wie sie in festgelegt ist ) und führt sie mit Root-Rechten aus. Dies entspricht tunsudo $SHELL
odersudo mksh
odersudo bash
(je nachdem , was Sie verwenden passieren).Erinnerst
mksh
du dich, dass ich erwähnt habe, dass ich ein Benutzer bin ? Schau dir das an:Was Sie sehen, ist, dass es in meine Muschel
sudo -s
gesprungen ist , mit der charakteristischen Eingabeaufforderung, die ich dafür festgelegt habe. Und da es sich natürlich nicht um eine Anmeldeaktion handelt, wird gemeldet, dass die Shell als Nicht-Anmeldeshellinstanz erstellt wurde. In meinem Fall sehen Sie jedoch, dass dort kein Buchstabe vorhanden ist, der vorhanden wäre, wenn dies eine Login-Shell-Instanz wäre.bash
mksh
bash
$-
l
Letztendlich gilt der gleiche Gedanke für
sudo su
undsudo su -
. Später wird eine Login-Shell-Instanz erzeugt (dh, bestimmte Dateien, die für die Anmeldung erforderlich sind, werden ausgeführt), und erstere erzeugt nur interaktive Shells (dh, Anmeldedateien werden nicht ausgeführt).Also technisch
shopt login_shell
hat das überhaupt nichts zu$SHELL
tun. Stellen Sie es sich so vor: Es soll zeigen, wie bash ausgeführt wird.$SHELL
soll nur widerspiegeln, was Sie in zugewiesen haben/etc/passwd
.Der Unterschied zwischen Anmelde-Shell und Nicht-Anmelde-Shell wurde in dieser Antwort von hoch angesehenem Gilles auf unix.stackexchange.com erklärt .
Zusätzlicher Spaß
Hier ist etwas Spaß, den Sie ausprobieren können. Wie Sie vielleicht bereits wissen, wird eine Login-Shell ausgeführt
.profile
(und.bashrc
da Ubuntu.profile
dafür konfiguriert ist ), aber Nicht-Logins werden nur.bashrc
Dateien ausgeführt. Wir können also testen, mitecho
welchem dieser Befehle eine Login-Shell ausgeführt wird und mit welchem nicht. Wir erwarten zwei Zeilenecho
für die Login-Shell und nur eine für die Nicht-Login-Shell.Passenderweise haben diejenigen mit zwei Ausgabezeilen auf
login_shell
gesetzton
.quelle
$SHELL
undlogin_shell/non-login_shell
wurde geklärt. Aber wohershopt
bekommen Details? Ist es vonecho $0
?$0
verwendet wird, um anzugeben, ob eine Shell eine Anmeldeshell ist oder nicht. Wennshopt
Sie also diese Variable prüfen würden, ist dies absolut akzeptabel. Es gibt jedoch wahrscheinlich mehr als das, was man sieht.shopt
Wahrscheinlich habe ich für diese Frage keine eindeutige Antwort, da ich mit Bashs Quellcode nicht so gut vertraut bin.-
oder mit der-l
Option gestartet werden .login_shell The shell sets this option if it is started as a login shell (see INVOCATION above). The value may not be changed.
dass Sie mit dershopt login_shell
Einweg-Bash programmgesteuert herausfinden können, wie sie gestartet wurde. der andere Weg wäre[[ -o login ]]
Wie @Serg in dieser Antwort erklärt, um festzustellen , welche Shell Sie ausführen , ist die
SHELL
Variable nur die Standardeinstellung des aktuellen Benutzers Shell wie sie gelesen wird von/etc/passwd
:also wenn ich
echo $SHELL
es immer wiederkomme/bin/bash
:Unabhängig davon , ob die Hülle ein Login - Shell ist ein sh ell opt Ion zu dem Zeitpunkt bestimmt die Shell gestartet wird. Das Shell-Programm speichert diese Informationen zusammen mit allen anderen Einstellungen und Variablen. Der
shopt
Befehl bietet eine Möglichkeit, diese Informationen anzuzeigen und, falls möglich, für die betreffende Option zu aktivieren oder zu deaktivieren (dies ist jedoch nicht der Fall,login_shell
was natürlich vom Prozess abhängt, der zum Starten der Shell verwendet wird).Die
sudo
Optionen des Programms bestimmen, wie diese verschiedenen Arten von Root-Shell gestartet werden:quelle
shopt
undlogin_shell
sollst das in meiner Antwort weitaus besser darstellen.man bash
:man login
:Zusamenfassend:
$SHELL
wirdlogin
zum Beispiel von oder durch das aufrufende Programm festgelegtsu
. Die Shell selbst setzt es nicht.shopt
Zeigt die aktuell gültigen Shell-Optionen an.quelle