TL; DR :
- Dove viene definita la shell di accesso? In
/etc/passwd.
- Sono
sudo su/ sudo su -/ sudo -i/ sudo -sstessa? 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 mkshutente shell e non ha shopt, proprio come kshnon lo è.
Quindi, cosa login_shelldovrebbe 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 shoptrapporti login_shell on per questa opzione. Pensa a questo come se sudo -iforzasse 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 -slegge 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 $SHELLo sudo mksho sudo bash(qualunque sia il caso in cui si usi).
Ricordi di aver detto che sono mkshutente? 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 -ssaltato dalla bashmia mkshshell, con il prompt caratteristico che ho impostato per questo. E naturalmente, poiché non si tratta di un'azione di accesso, in bashquanto segnalerebbe che la shell viene generata come istanza di shell non di accesso. Nel mio caso, tuttavia, vedi che $-non c'è una lettera llì, che sarebbe lì se fosse un'istanza della shell di accesso.
Infine, la stessa idea si applica a sudo sue 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_shellnon ha alcuna relazione con nessuno $SHELL. Pensala in questo modo: il suo scopo è mostrare come corre Bash. $SHELLdovrebbe 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 .bashrcpoiché Ubuntu .profile è configurata per farlo ), ma l'inferno senza login eseguirà solo .bashrcfile. Quindi possiamo testare con echoquale di questi comandi viene eseguita una shell di accesso e quale no, e ci aspettiamo due righe echoper 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_shellimpostato su on.
.profileo equivalenti), e 2. È la shell che dovrebbe essere avviata all'accesso per un utente, come definito in/etc/passwdo equivalente.$SHELLcontiene il secondo, i tuoishoptoutput 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.