Czytałem sudo -i/-s
tutaj różnicę . Po użyciu polecenia shopt
należy zauważyć, że wszystkie ( sudo su/sudo -i/sudo -s
) $SHELL
dają takie same wyniki, ale shopt
wyniki poleceń są różne.
Jak więc zdefiniowano powłokę logowania i powłokę inną niż login?
Skąd shopt
wziąć 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:~#
command-line
bash
sudo
prado
źródło
źródło
.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ń.$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ć testowanaif [[ -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~/.zprofile
lub podobny, który prawdopodobnieOdpowiedzi:
TL; DR :
/etc/passwd
.sudo su
/sudo su -
/sudo -i
/ są takiesudo -s
same? Nie, wszystkie spawnują powłokę, ale inaczej i w różnych kontekstach.$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 jestemmksh
użytkownikiem powłoki i nie mashopt
, tak jakksh
nie.Następnie, co dokładnie
login_shell
ma reprezentować? Odman bash
:To jest kluczowy punkt.
sudo -i
, jak już wiesz z poprzedniej odpowiedzi, którą czytasz, ma symulować początkowe logowanie. Dlategoshopt
raportylogin_shell on
dla tej opcji. Pomyśl o tym, jakbysudo -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
lubsudo mksh
lubsudo bash
(cokolwiek zdarzy się stosowania).Pamiętasz, jak wspomniałem, że jestem
mksh
użytkownikiem? Popatrz na to:To, co widzisz, to
sudo -s
przeskoczyło zbash
mojejmksh
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 literyl
, która byłaby tam, gdyby była to instancja powłoki logowania.Wreszcie ten sam pomysł dotyczy
sudo su
isudo 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ą).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 liniiecho
dla powłoki logowania i tylko jednej dla braku logowania.Odpowiednio, te z dwoma liniami wyjścia zostaną
login_shell
ustawione naon
.źródło
$SHELL
ilogin_shell/non-login_shell
wyjaśnione. Ale skądshopt
wziąć szczegóły? Czy toecho $0
jest$0
jest używany do określenia, czy powłoka jest powłoką logowania, więc jeślishopt
sprawdziłby tę zmienną - jasne, jest ona całkowicie akceptowalna. Jednak prawdopodobnie jest więcej niż na pierwszy rzut oka.shopt
prawdopodobnie Na to pytanie nie mam trudnej odpowiedzi, ponieważ nie znam tak dobrze kodu źródłowego basha.-
, albo przy użyciu-l
opcji.login_shell The shell sets this option if it is started as a login shell (see INVOCATION above). The value may not be changed.
, żeshopt login_shell
wydaje 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 ]]
Jak @Serg wyjaśnia w tej odpowiedzi, w jaki sposób powiedzieć, z jakiej powłoki korzystasz ,
SHELL
zmienna jest po prostu domyślną powłoką bieżącego użytkownika, czytaną z/etc/passwd
:więc jeśli będę
echo $SHELL
to zawsze zwracać/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. The
shopt
Komenda 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 przypadeklogin_shell
, który, oczywiście, zależy od procesu stosowanego do uruchomienia powłoki)W
sudo
opcjach programu jest określić, jak zostanie uruchomiony te różne rodzaje jako root:źródło
shopt
ilogin_shell
powinno reprezentować znacznie lepiej niż w mojej odpowiedzi.man bash
:man login
:W skrócie:
$SHELL
jest ustawianalogin
na przykład przez program wywołujący lubsu
. Sama powłoka go nie ustawia.shopt
pokazuje aktualnie obowiązujące opcje powłoki.źródło