Je lisais la différence entre Sudo -i/-s
ici . Après avoir utilisé la commande shopt
name__, il est noté que tous (Sudo su/Sudo -i/Sudo -s
) le $Shell
fournissent les mêmes résultats, mais les résultats de la commande shopt
sont différents.
Alors, comment est-ce que le login et le non-login sont définis?
D'où shopt
obtient le résultat?
Pourquoi n'est-il pas lié à $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:~#
TL; DR :
/etc/passwd
.Sudo su
/Sudo su -
/Sudo -i
/Sudo -s
sont-ils les mêmes? Non, ils engendrent tous un shell, mais différemment et dans des contextes différents.$Shell
? 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
est spécifique à bash. Par exemple, je suis mksh
name__, et il n'a pas shopt
name__, comme ksh
n'en a pas.
Ensuite, que représente exactement login_Shell
? De man bash
:
login_Shell
Le shell définit cette option s’il est lancé en tant que shell de connexion
C'est le point clé. Sudo -i
, comme vous le savez déjà de la réponse précédente que vous avez lue, est supposé simuler la connexion initiale. C'est pourquoi shopt
indique login_Shell on
pour cette option. Pensez à cela comme si Sudo -i
obligeait le shell à parcourir les fichiers censés apparaître uniquement lors d'un processus de connexion (qui ne sont pas générés par des shells interactifs).
Dans d'autres cas, vous exécutez déjà une instance d'un shell. Par conséquent, il ne peut pas s'agir du shell de connexion et l'objectif des options est différent. Sudo -s
lit simplement la variable $Shell
(qui est censée représenter votre shell par défaut 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 par hasard).
Rappelez-vous que j'ai mentionné que je suis mksh
name__? 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 Sudo -s
est passé de bash
à mon mksh
Shell, avec l'invite caractéristique que j'ai définie pour celui-ci. Et bien sûr, comme il ne s’agit pas d’une action de connexion, bash
indique que le shell est créé en tant qu’instance de shell autre que la connexion. Dans mon cas, cependant, vous voyez que $-
ne possède pas de lettre l
name__, qui serait là s'il s'agissait d'une instance de connexion Shell.
Enfin, la même idée s'applique à Sudo su
et Sudo su -
. Une instance génère ensuite une instance de shell de connexion (c'est-à-dire que des fichiers spécifiques requis pour la connexion s'exécutent) et l'ancienne une génère uniquement des shells interactifs (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 lien avec $Shell
. Pensez-y de cette façon: son but est de montrer comment fonctionne bash. $Shell
est censé refléter uniquement ce que vous avez assigné dans /etc/passwd
.
Quant à la différence entre le shell de connexion et le shell sans connexion, cela a été expliqué par le très respecté Gilles sur unix.stackexchange.com dans cette réponse .
Amusant supplémentaire
Voici quelque chose d'amusant que vous pouvez essayer. Comme vous le savez peut-être déjà, un shell de connexion exécutera .profile
(et .bashrc
étant donné que .profile
d'Ubuntu est configuré pour le faire ), mais l'en-cas qui ne se connecte pas n'exécutera que le fichier .bashrc
. Nous pouvons donc tester avec echo
laquelle de ces commandes exécute un shell de connexion et qui ne fonctionne pas, et nous attendons deux lignes de echo
pour le login et un seul pour le 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:~#
De manière appropriée, ceux qui ont deux lignes de sortie auront login_Shell
défini sur on
name__.
Comme @Serg explique dans cette réponse sur la façon de dire quel shell vous utilisez , la variable Shell
correspond uniquement à l'utilisateur actuel défaut Shell lu à partir de /etc/passwd
:
$ grep zanna /etc/passwd
zanna:x:1000:1000:Zanna,,,:/home/zanna:/bin/bash
donc si je echo $Shell
il retournera toujours /bin/bash
:
$ zsh
% echo $Shell
/bin/bash
Si le shell est ou non un shell de connexion, est un sh ell opt déterminée au moment du démarrage du shell. Le programme Shell stocke ces informations avec tous ses autres paramètres et variables. La commande shopt
permet de voir cette information et, si possible pour l'option en question, de la définir ou de la désélectionner (ce n'est pas le cas pour login_Shell
qui dépend bien sûr du processus utilisé pour démarrer le shell).
Les options du programme Sudo
déterminent le mode de démarrage de ces différents types de shell racine:
man bash
:
Un shell de connexion est un shell dont le premier caractère de l'argument zéro est un
-
, ou un caractère commençant par l'option--login
.
man login
:
Les valeurs pour
$HOME
,$Shell
sont [...] définies en fonction des champs appropriés dans l'entrée du mot de passe.
En bref:
$Shell
est définie par login
ou par le programme appelant, par exemple su
. Le shell lui-même ne le définit pas.shopt
indique les options du shell actuellement en vigueur.