TL; DR :
- Dove viene definita la shell di accesso? In
/etc/passwd
.
- Sono
sudo su
/ sudo su -
/ sudo -i
/ sudo -s
stessa? No, generano tutti una shell ma in modo diverso e in contesti diversi.
- Cosa fa
$SHELL
? Basta dire la shell predefinita, come in /etc/passwd
.
Risposta effettiva :
Prima di tutto, è importante ricordare che shopt
è specifico per Bash. Ad esempio, sono un mksh
utente shell e non ha shopt
, proprio come ksh
non lo è.
Quindi, cosa login_shell
dovrebbe rappresentare esattamente ? Da man bash
:
login_shell
La shell imposta questa opzione se viene avviata come shell di accesso
Questo è il punto chiave. sudo -i
, come già sapete dalla risposta precedente che avete letto, dovrebbe simulare il login iniziale. Ecco perché i shopt
rapporti login_shell on
per questa opzione. Pensa a questo come se sudo -i
forzasse la shell a passare attraverso i file che dovrebbero apparire solo durante un processo di login (che non provengono da shell interattive).
In altri casi, stai già eseguendo un'istanza di una shell, quindi in primo luogo non può essere la shell di accesso e lo scopo delle opzioni è diverso. sudo -s
legge semplicemente $SHELL
(che dovrebbe rappresentare la shell predefinita come impostata in /etc/passwd
) variabile e la esegue con il privilegio di root. Ciò equivale a fare sudo $SHELL
o sudo mksh
o sudo bash
(qualunque sia il caso in cui si usi).
Ricordi di aver detto che sono mksh
utente? Guarda questo:
$ 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
Quello che vedi è che è sudo -s
saltato dalla bash
mia mksh
shell, con il prompt caratteristico che ho impostato per questo. E naturalmente, poiché non si tratta di un'azione di accesso, in bash
quanto segnalerebbe che la shell viene generata come istanza di shell non di accesso. Nel mio caso, tuttavia, vedi che $-
non c'è una lettera l
lì, che sarebbe lì se fosse un'istanza della shell di accesso.
Infine, la stessa idea si applica a sudo su
e sudo su -
. Successivamente viene generata l'istanza della shell di accesso (ovvero, verranno eseguiti file specifici necessari per l'accesso) e la precedente genera solo shell interattive (ovvero, i file di accesso non vengono eseguiti).
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
Quindi tecnicamente shopt login_shell
non ha alcuna relazione con nessuno $SHELL
. Pensala in questo modo: il suo scopo è mostrare come corre Bash. $SHELL
dovrebbe riflettere solo ciò che ti è stato assegnato /etc/passwd
.
Per quanto riguarda la differenza tra shell di login e shell di non login, questa risposta è stata spiegata da Gilles altamente rispettato su unix.stackexchange.com .
Divertimento aggiuntivo
Ecco qualcosa di divertente che puoi provare. Come forse già saprai, verrà eseguita una shell di accesso .profile
(e .bashrc
poiché Ubuntu .profile
è configurata per farlo ), ma l'inferno senza login eseguirà solo .bashrc
file. Quindi possiamo testare con echo
quale di questi comandi viene eseguita una shell di accesso e quale no, e ci aspettiamo due righe echo
per la shell di accesso e solo una per la non login.
$ 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:~#
Abbastanza opportunamente, quelli con due linee di output avranno login_shell
impostato su on
.
.profile
o equivalenti), e 2. È la shell che dovrebbe essere avviata all'accesso per un utente, come definito in/etc/passwd
o equivalente.$SHELL
contiene il secondo, i tuoishopt
output si occupano del primo. In genere, quando la shell in (2) viene avviata all'accesso, viene avviata nel modo specifico necessario per (1), da cui la conflazione dei significati.