TL; DR :
- ¿Dónde se define el shell de inicio de sesión? En
/etc/passwd
.
- ¿Son
sudo su
/ sudo su -
/ sudo -i
/ sudo -s
iguales? No, todos generan un caparazón pero de manera diferente y en contextos diferentes.
- ¿Qué
$SHELL
hacer? Solo dígale a su shell predeterminado, igual que en /etc/passwd
.
Respuesta real :
En primer lugar, es importante mencionar que shopt
es específico de bash. Por ejemplo, soy mksh
usuario de shell y no tiene shopt
, al igual ksh
que no.
A continuación, ¿qué login_shell
se supone que representa exactamente ? De man bash
:
login_shell
El shell establece esta opción si se inicia como un shell de inicio de sesión
Ese es el punto clave. sudo -i
, como ya sabe por la respuesta anterior que leyó, se supone que simula el inicio de sesión inicial. Es por eso que shopt
informa login_shell on
para esta opción. Piense en esto como si sudo -i
obligara al shell a pasar por los archivos que se supone que deben aparecer solo durante un proceso de inicio de sesión (que no se obtienen mediante shells interactivos).
En otros casos, ya está ejecutando una instancia de un shell, por lo que no puede ser un shell de inicio de sesión, y el propósito de las opciones es diferente. sudo -s
simplemente lee $SHELL
(que está destinado a representar su shell predeterminado como se establece /etc/passwd
) variable y lo ejecuta con privilegio de root. Esto es equivalente a hacer sudo $SHELL
o sudo mksh
o sudo bash
(lo que sea que uses).
¿Recuerdas que mencioné que soy mksh
usuario? Mira esto:
$ 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
Lo que ves es que sudo -s
saltó de bash
mi mksh
shell, con el indicador característico que he establecido para él. Y, por supuesto, dado que no es una acción de inicio de sesión, bash
ya que informaría que el shell se genera como una instancia de shell sin inicio de sesión. Sin embargo, en mi caso, verá que $-
no tiene una letra l
allí, que estaría allí si se tratara de una instancia de shell de inicio de sesión.
Finalmente, la misma idea se aplica a sudo su
y sudo su -
. Más tarde, uno genera una instancia de shell de inicio de sesión (es decir, se ejecutarán los archivos específicos necesarios para iniciar sesión) y el anterior genera solo shells interactivos (es decir, los archivos de inicio de sesión no se ejecutan).
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
Por lo tanto, técnicamente, shopt login_shell
no tiene relación $SHELL
alguna. Piénselo de esta manera: su propósito es mostrar cómo se ejecuta bash. $SHELL
se supone que refleja solo lo que has asignado /etc/passwd
.
En cuanto a la diferencia entre el shell de inicio de sesión y el shell de no inicio de sesión, Gilles lo ha explicado en unix.stackexchange.com en esta respuesta .
Diversión adicional
Aquí hay algo divertido que puedes probar. Como ya sabrás, se ejecutará un shell de inicio de sesión .profile
(y .bashrc
dado que Ubuntu .profile
está configurado para hacerlo ), pero el infierno que no inicia sesión solo ejecutará el .bashrc
archivo. Por lo tanto, podemos probar con echo
cuál de estos comandos ejecuta un shell de inicio de sesión y cuál no, y esperamos dos líneas echo
para shell de inicio de sesión y solo una para no inicio de sesión.
$ 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:~#
Apropiadamente, aquellos con dos líneas de salida se habrán login_shell
establecido en on
.
.profile
o equivalentes), y 2. Es el shell que se supone que debe iniciarse al iniciar sesión para usuario, como se define en/etc/passwd
o equivalente.$SHELL
contiene el último, susshopt
salidas tratan con el primero. Típicamente, cuando el shell en (2) se inicia al iniciar sesión, se inicia de la manera específica necesaria para (1), de ahí la combinación de significados.