TL; DR :
- Wo ist die Login-Shell definiert? In
/etc/passwd
.
- Sind
sudo su
/ sudo su -
/ sudo -i
/ sudo -s
gleich? Nein, sie alle spawnen eine Shell, aber anders und in unterschiedlichen Kontexten.
- Was macht
$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 ich mksh
Shell-Benutzer, und es hat nicht shopt
, genau wie ksh
nicht.
Was genau login_shell
soll als nächstes dargestellt werden? Von man bash
:
login_shell
Die Shell setzt diese Option, wenn sie als Login-Shell gestartet wird
Das ist der entscheidende Punkt. sudo -i
soll, wie Sie bereits aus der vorherigen Antwort wissen, die erstmalige Anmeldung simulieren. Aus diesem Grund shopt
wird login_shell on
für diese Option berichtet. Stellen Sie sich das so vor, als würde sudo -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 tun sudo $SHELL
oder sudo mksh
oder sudo 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:
$ bash --posix
bash-4.3$ sudo -s
[sudo] password for xieerqi:
DIR:/xieerqi|01:53|skolodya@ubuntu:
$ id
uid=0(root) gid=0(root) groups=0(root)
DIR:/xieerqi|01:53|skolodya@ubuntu:
$ echo $-
imsU
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
und sudo 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).
bash-4.3$ sudo su
[sudo] password for xieerqi:
root@eagle:/home/xieerqi# shopt login_shell
login_shell off
root@eagle:/home/xieerqi# exit
bash-4.3$ sudo su -
[sudo] password for xieerqi:
$ shopt login_shell
login_shell on
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, mit echo
welchem dieser Befehle eine Login-Shell ausgeführt wird und mit welchem nicht. Wir erwarten zwei Zeilen echo
für die Login-Shell und nur eine für die Nicht-Login-Shell.
$ echo "echo 'hi,i am .profile'" >> .profile
$ echo "echo 'hi, i am .bashrc'" >> .bashrc
$ sudo -i
hi, i am .bashrc
hi,i am .profile
$ sudo su
hi, i am .bashrc
root@eagle:~# sudo su -
hi, i am .bashrc
hi,i am .profile
$ sudo -s
hi, i am .bashrc
root@eagle:~#
Passenderweise haben diejenigen mit zwei Ausgabezeilen auf login_shell
gesetzt on
.
.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.