TL; DR :
- Gdzie jest zdefiniowana powłoka logowania? W
/etc/passwd
.
- Czy
sudo su
/ sudo su -
/ sudo -i
/ są takie sudo -s
same? Nie, wszystkie spawnują powłokę, ale inaczej i w różnych kontekstach.
- Co ma
$SHELL
zrobić? Po prostu powiedz domyślną powłokę, tak jak w /etc/passwd
.
Rzeczywista odpowiedź :
Przede wszystkim należy o tym wspomnieć shopt
jest to specyficzne dla bash. Na przykład jestem mksh
użytkownikiem powłoki i nie ma shopt
, tak jak ksh
nie.
Następnie, co dokładnie login_shell
ma reprezentować? Od man bash
:
login_shell
Powłoka ustawia tę opcję jeśli jest uruchamiana jako powłoka logowania
To jest kluczowy punkt. sudo -i
, jak już wiesz z poprzedniej odpowiedzi, którą czytasz, ma symulować początkowe logowanie. Dlategoshopt
raporty login_shell on
dla tej opcji. Pomyśl o tym, jakby sudo -i
zmusiło powłokę do przejścia przez pliki, które powinny pojawić się tylko podczas procesu logowania (które nie są pozyskiwane przez interaktywne powłoki).
W innych przypadkach już uruchamiasz instancję powłoki, więc nie może to być przede wszystkim powłoka logowania, a cel opcji jest inny. sudo -s
po prostu odczytuje zmienną $SHELL
(która ma reprezentować domyślną powłokę zgodnie z ustawieniem /etc/passwd
) i uruchamia ją z uprawnieniami roota. Jest to równoważne z działaniemsudo $SHELL
lub sudo mksh
lub sudo bash
(cokolwiek zdarzy się stosowania).
Pamiętasz, jak wspomniałem, że jestem mksh
użytkownikiem? Popatrz na to:
$ 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
To, co widzisz, to sudo -s
przeskoczyło z bash
mojej mksh
skorupy z charakterystycznym pytaniem, które dla niej ustawiłem. I oczywiście, ponieważ nie jest to akcja logowania, bash
ponieważ zgłosiłaby ona, że powłoka jest spawnowana jako instancja powłoki nie zalogowanej. W moim przypadku jednak widzisz, że $-
nie ma tam litery l
, która byłaby tam, gdyby była to instancja powłoki logowania.
Wreszcie ten sam pomysł dotyczy sudo su
i sudo su -
. Później jeden spawnuje instancję powłoki logowania (tzn. Uruchomione zostaną określone pliki wymagane do logowania), a poprzedni spawnuje tylko interaktywne powłoki (tj. Pliki logowania nie działają).
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
Tak więc technicznie shopt login_shell
nie ma z tym żadnego związku $SHELL
. Pomyśl o tym w ten sposób: jego celem jest pokazanie, jak to zrobić działa bash. $SHELL
ma odzwierciedlać tylko to, co przypisałeś /etc/passwd
.
Jeśli chodzi o różnicę między powłoką logowania a powłoką niezalogowaną, w tej odpowiedzi wyjaśnił ją bardzo szanowany Gilles na unix.stackexchange.com .
Dodatkowa zabawa
Oto coś, co możesz spróbować. Jak już zapewne wiesz, uruchomi się powłoka logowania .profile
(a .bashrc
ponieważ Ubuntu's .profile
jest do tego skonfigurowana ), ale piekło bez logowania uruchomi tylko .bashrc
plik. Możemy więc przetestować, echo
które z tych poleceń uruchamia powłokę logowania, a które nie, i oczekujemy dwóch linii echo
dla powłoki logowania i tylko jednej dla braku logowania.
$ 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:~#
Odpowiednio, te z dwoma liniami wyjścia zostaną login_shell
ustawione na on
.
.profile
lub jej odpowiedniki), oraz 2. To powłoka, która powinna się uruchomić przy logowaniu dla użytkownik, zgodnie z definicją/etc/passwd
lub równoważną.$SHELL
zawiera to drugie, twojeshopt
wyniki dotyczą tego pierwszego. Zazwyczaj, gdy powłoka w (2) jest uruchamiana przy logowaniu, jest uruchamiana w określony sposób wymagany dla (1), stąd połączenie różnych znaczeń.