web-dev-qa-db-fra.com

Où le shell de connexion est-il défini?

Je lisais la différence entre Sudo -i/-sici . Après avoir utilisé la commande shoptname__, 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 shoptsont différents.

Alors, comment est-ce que le login et le non-login sont définis?

D'où shoptobtient 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:~# 
16
prado

TL; DR :

  • Où est défini le login Shell? Dans /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.
  • Que fait $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 shoptest spécifique à bash. Par exemple, je suis mkshname__, et il n'a pas shoptname__, comme kshn'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 shoptindique 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 mkshname__? 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 mkshShell, 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, bashindique 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 lname__, 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 .profiled'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 echolaquelle de ces commandes exécute un shell de connexion et qui ne fonctionne pas, et nous attendons deux lignes de echopour 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 onname__.

17

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:

enter image description here

11
Zanna

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:

  • Un shell est un shell de connexion s’il a été appelé en tant que shell de connexion.
  • La variable d'environnement $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.
3
AlexP