TL; DR :
- Où est défini le shell de connexion? Dans
/etc/passwd
.
- Sont
sudo su
/ sudo su -
/ sudo -i
/ sudo -s
identiques? Non, ils engendrent tous une coquille mais différemment et dans des contextes différents.
- Que fait
$SHELL
-il? Indiquez simplement votre shell par défaut, comme dans /etc/passwd
.
Réponse réelle :
Tout d'abord, il est important de mentionner que shopt
c'est spécifique à bash. Par exemple, je suis mksh
un utilisateur shell, et il n'en a pas shopt
, tout comme ksh
ne le fait pas.
Ensuite, qu'est-ce qui login_shell
est censé représenter exactement ? De man bash
:
login_shell
Le shell définit cette option s'il est démarré en tant que shell de connexion
Voilà le point clé. sudo -i
, comme vous le savez déjà dans la réponse précédente que vous lisez, est censé simuler la connexion initiale. C'est pourquoi les shopt
rapports login_shell on
pour cette option. Considérez ceci comme si sudo -i
force le shell à parcourir les fichiers qui ne devraient apparaître que pendant un processus de connexion (qui ne sont pas fournis par des shells interactifs).
Dans d'autres cas, vous exécutez déjà une instance d'un shell, il ne peut donc pas s'agir d'un shell de connexion en premier lieu, et le but des options est différent. sudo -s
lit simplement $SHELL
(qui est censée représenter votre shell par défaut tel que défini dans /etc/passwd
) et l'exécute avec le privilège root. Cela équivaut à faire sudo $SHELL
ou sudo mksh
ou sudo bash
(selon ce que vous utilisez).
Rappelez-vous que j'ai mentionné que je suis mksh
utilisateur? Regarde ça:
$ 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
Ce que vous voyez, c'est que j'ai sudo -s
sauté de bash
ma mksh
coquille, avec l'invite caractéristique que je lui ai définie. Et bien sûr, puisqu'il ne s'agit pas d'une action de connexion, car bash
cela signifierait que le shell est généré en tant qu'instance de shell sans connexion. Dans mon cas, cependant, vous voyez qu'il $-
n'y a pas de lettre l
, qui serait là s'il s'agissait d'une instance de shell de connexion.
Enfin, la même idée s'applique à sudo su
et sudo su -
. Plus tard, on génère une instance de shell de connexion (c'est-à-dire que les fichiers spécifiques requis pour la connexion s'exécuteront) et l'ancien ne génère que des shells interactifs (c'est-à-dire que les fichiers de connexion ne s'exécutent pas).
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
Donc, techniquement, shopt login_shell
n'a aucun rapport avec $SHELL
quoi que ce soit. Pensez-y de cette façon: son but est de montrer comment bash fonctionne. $SHELL
est censé refléter uniquement ce que vous avez attribué /etc/passwd
.
Quant à la différence entre le shell de connexion et le shell sans connexion, elle a été expliquée par Gilles très respecté sur unix.stackexchange.com dans cette réponse .
Amusement supplémentaire
Voici quelque chose d'amusant que vous pouvez essayer. Comme vous le savez peut-être déjà, un shell de connexion s'exécutera .profile
(et .bashrc
puisque Ubuntu .profile
est configuré pour le faire ), mais l'enfer non-connecté exécutera uniquement un .bashrc
fichier. Nous pouvons donc tester avec echo
laquelle de ces commandes exécute un shell de connexion et laquelle ne le fait pas, et nous attendons deux lignes de echo
shell de connexion et une seule pour les 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:~#
Assez convenablement, ceux avec deux lignes de sortie se seront login_shell
mis à on
.
.profile
ou des équivalents), et 2. C'est le shell qui est censé démarrer à la connexion pour un utilisateur, tel que défini dans/etc/passwd
ou équivalent.$SHELL
contient le dernier, vosshopt
sorties concernent le premier. En règle générale, lorsque le shell dans (2) est démarré à la connexion, il est démarré de la manière spécifique requise pour (1), d'où la fusion des significations.