TL; DR :
- Gdzie jest zdefiniowana powłoka logowania? W
/etc/passwd.
- Czy
sudo su/ sudo su -/ sudo -i/ są takie sudo -ssame? Nie, wszystkie spawnują powłokę, ale inaczej i w różnych kontekstach.
- Co ma
$SHELLzrobić? 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 mkshużytkownikiem powłoki i nie ma shopt, tak jak kshnie.
Następnie, co dokładnie login_shellma 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 -izmusił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 -spo 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 mkshlub sudo bash(cokolwiek zdarzy się stosowania).
Pamiętasz, jak wspomniałem, że jestem mkshuż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 -sprzeskoczyło z bashmojej mkshskorupy z charakterystycznym pytaniem, które dla niej ustawiłem. I oczywiście, ponieważ nie jest to akcja logowania, bashponieważ 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 sui 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_shellnie 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. $SHELLma 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 .bashrcponieważ Ubuntu's .profile jest do tego skonfigurowana ), ale piekło bez logowania uruchomi tylko .bashrcplik. Możemy więc przetestować, echoktóre z tych poleceń uruchamia powłokę logowania, a które nie, i oczekujemy dwóch linii echodla 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_shellustawione na on.
.profilelub jej odpowiedniki), oraz 2. To powłoka, która powinna się uruchomić przy logowaniu dla użytkownik, zgodnie z definicją/etc/passwdlub równoważną.$SHELLzawiera to drugie, twojeshoptwyniki 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ń.