Gdzie jest zdefiniowana powłoka logowania?

16

Czytałem sudo -i/-s tutaj różnicę . Po użyciu polecenia shoptnależy zauważyć, że wszystkie ( sudo su/sudo -i/sudo -s) $SHELLdają takie same wyniki, ale shoptwyniki poleceń są różne.

Jak więc zdefiniowano powłokę logowania i powłokę inną niż login?

Skąd shoptwziąć wynik?

Dlaczego nie jest to związane $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:~# 
prado
źródło
7
Jednym z problemów jest to, że „powłoka logowania” ma dwa znaczenia: 1. Jest to instancja powłoki uruchomionej w określony sposób, która wykonuje określone czynności (np. Czytanie .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, twoje shoptwyniki 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ń.
mur
1
Wyjaśnienie @muru jest dobre. na przykład jeśli używasz SSH do komputera ze zdalnego komputera. / usr / sbin / sshd w twoim systemie rozwidla powłokę zdefiniowaną przez $SHELL(i łączy ją z pseudo terminalem), która z kolei jest zdefiniowana we wpisie / etc / passwd. ta powłoka jest powłoką logowania i może być testowana if [[ -o login ]]; then echo "I am a login shell"; fi. jako powłoka logowania wykonywałaby zadania odpowiednie dla nowej sesji. np. źródłowy ~/.zprofilelub podobny, który prawdopodobnie
ustawiłby

Odpowiedzi:

17

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.

Sergiy Kolodyazhnyy
źródło
Dziękuję @Serg i @Zanna. Teraz o $SHELLi login_shell/non-login_shellwyjaśnione. Ale skąd shoptwziąć szczegóły? Czy to echo $0jest
prado
1
@prado Powiedziałbym tak, ponieważ pierwszy znak $0jest używany do określenia, czy powłoka jest powłoką logowania, więc jeśli shoptsprawdziłby tę zmienną - jasne, jest ona całkowicie akceptowalna. Jednak prawdopodobnie jest więcej niż na pierwszy rzut oka. shoptprawdopodobnie Na to pytanie nie mam trudnej odpowiedzi, ponieważ nie znam tak dobrze kodu źródłowego basha.
Sergiy Kolodyazhnyy
@prado Bash można uruchomić jako powłokę logowania albo przez znak pierwszego 0 $ be -, albo przy użyciu -lopcji.
mur
@prado możesz przeczytać o wywołaniu basha i opcjach na stronie man. na przykład sekcja SHELL BUILTIN COMMAND mówi login_shell The shell sets this option if it is started as a login shell (see INVOCATION above). The value may not be changed., że shopt login_shellwydaje się, że bash w jeden sposób pozwala ci dowiedzieć się - programowo, jak się dowiedzieć, jak to się zaczęło. innym sposobem byłoby[[ -o login ]]
the_velour_fog
11

Jak @Serg wyjaśnia w tej odpowiedzi, w jaki sposób powiedzieć, z jakiej powłoki korzystasz , SHELLzmienna jest po prostu domyślną powłoką bieżącego użytkownika, czytaną z /etc/passwd:

$ grep zanna /etc/passwd
zanna:x:1000:1000:Zanna,,,:/home/zanna:/bin/bash

więc jeśli będę echo $SHELLto zawsze zwracać /bin/bash:

$ zsh
% echo $SHELL
/bin/bash

Czy powłoka jest powłoką logowania, to sh ell opt jonowa określona w momencie uruchamiania powłoki. Program powłoki przechowuje te informacje wraz ze wszystkimi innymi ustawieniami i zmiennymi. TheshoptKomenda zapewnia sposób, aby zobaczyć te informacje oraz, jeśli to możliwe, dla opcji o których mowa, do zestawu lub rozbrojony to (nie jest to przypadek login_shell, który, oczywiście, zależy od procesu stosowanego do uruchomienia powłoki)

W sudoopcjach programu jest określić, jak zostanie uruchomiony te różne rodzaje jako root:

wprowadź opis zdjęcia tutaj

Zanna
źródło
1
Dobre wytłumaczenie. Wydaje mi się, że wyjaśniłeś co shopti login_shellpowinno reprezentować znacznie lepiej niż w mojej odpowiedzi.
Sergiy Kolodyazhnyy
@Serg dzięki :) Myślę, że twoje wyjaśnienie jest dokładniejsze :)
Zanna
3

man bash:

Powłoka logowania to taka, której pierwszym znakiem argumentu zero jest -lub zaczyna się od --loginopcji.

man login:

Wartość $HOME, $SHELL[...] są ustawione według odpowiednich pól w wprowadzania hasła.

W skrócie:

  • Powłoka jest powłoką logowania, jeśli została wywołana jako powłoka logowania.
  • Zmienna środowiskowa $SHELLjest ustawiana loginna przykład przez program wywołujący lub su. Sama powłoka go nie ustawia.
  • shopt pokazuje aktualnie obowiązujące opcje powłoki.
AlexP
źródło