Qu'est-ce qu'un shell avec ou sans login?


78

Il est dit que les paramètres pour que le shell non connecté se connecte au .bashrcfichier et les paramètres du shell de connexion au .profilefichier.

Qu'entend-on vraiment par les shells login et non-login?

S'il vous plaît expliquer sans utiliser le jargon technique autant que possible.

Réponses:


83

Tout simplement:

  • Si vous ouvrez un shell ou un terminal (ou passez à un autre) et qu'il vous demande de vous connecter (nom d'utilisateur? Mot de passe?) Avant de vous donner une invite, il s'agit d'un shell de connexion.
  • Si ce n'est pas le cas (comme gnome-terminal ), et vous permet de l'utiliser tout de suite, c'est un shell sans connexion.

Si vous êtes un utilisateur normal d'Ubuntu Desktop, le seul shell de connexion est ... votre ordinateur de bureau (vous tapez un mot de passe pour vous connecter, non;)? Eh bien, techniquement, c'est un shell de connexion qui démarre une interface graphique, mais cela entre dans le jargon. Et oui, il lira les paramètres dans.profile

Le seul moment où vous (un utilisateur normal) verra probablement un shell de connexion qui ressemble comme un shell de connexion est si vous avez un problème avec votre ordinateur de bureau et que vous passez à un terminal virtuel avec le Ctrl+ Alt+ F1raccourci.


Les autres cas généraux pour avoir un shell de connexion incluent:

  • accéder à votre ordinateur à distance via ssh(ou se connecter localement avec ssh localhost)
  • simuler un shell de connexion initial avec bash -l(ou sh -l)
  • simuler un rootshell de connexion initial avecsudo -i
    • ou pour un autre utilisateursudo -u username -iroot
  • s'authentifier comme un autre rootutilisateur avec (et son mot de passe)su - username
  • en utilisant la sudo logincommande pour changer d'utilisateur

Si je lance mon IDE Eclipse depuis un terminal, celui-ci s'ouvre comme prévu, mais si j'essaie de l'ouvrir en cliquant sur l'icône Eclipse, il ne parvient pas à reconnaître l'emplacement Java (sauf indication contraire, PATH for Java est défini dans le fichier .profile). Cela signifie que cliquer sur l'icône Eclipse nécessite un shell de connexion, pourquoi?
DUKE

2
@DUKE, Non, cela signifie que les variables d'environnement doivent être définies différemment lorsque vous utilisez un ordinateur de bureau / interface graphique par rapport à un véritable système de console en ligne de commande. Mettez votre PATH, etc. dans ~/.pam_environment(uniquement des variables, pas de commandes bash!), Déconnectez-vous, connectez-vous et regardez tout par magie apparaître sur le bureau ainsi que dans gnome-terminal!
Ish

1
La connexion via ssh n'appelle pas un shell de connexion. Il ne charge pas /etc/profile, /etc/profile.dou ~/.profile.
Xuhdev


@xuhdev Login via ssh appelle un shell de connexion et charge les fichiers / etc / profile, /etc/profile.d et ~ / .bash_profile.
MichaelZ

9

Je ne pense pas qu'une bonne réponse puisse être donnée sans «jargon technique». Étant donné que cette question est la première à apparaître dans Google pour la requête "Qu'est-ce qu'un shell de connexion", je propose une réponse plus correcte ci-dessous:

Le shell de connexion est simplement un shell à qui on a dit d'être un shell de connexion. Cela ne signifie pas que le shell qui apparaît après votre connexion, bien que généralement l’application qui vous connecte indique au shell qu’il est lancé qu’il s’agit d’un shell de connexion. Il existe les moyens suivants pour indiquer à Shell qu'il doit s'agir d'un login:

  1. Lancer shell avec -lou --loginargument en supposant qu'il le sache (je ne connais pas de shell qui ne le sait pas -l, mais qui --loginn'est supporté que par quelques shell).
  2. Exécution shell avec argv[0]set to -{some_string}(c'est-à-dire avec HYPHEN-MINUS ajouté au début argv[0]ou à une autre chaîne). C'est ce que ssh et su faire: su tout fonctionne exécutable avec -sucomme argv[0](bonjour à la pensée de tout le monde argv[0]a quelque chose à voir avec le nom exécutable en cours d' exécution), ssh fonctionne avec zsh -zshlorsque l' utilisateur a mis /bin/zshcomme sa coquille.

La logique du shell n'a absolument rien à voir avec le fait que quelqu'un vous demande un mot de passe ou effectue une autre procédure d'authentification. Certains programmes tels que ssh ou login (ou certains émulateurs de terminaux comme urxvt) utilisent les shells comme des identifiants de connexion utilisant argv[0]un HYPHEN-MINUS. Certains, comme su ou sudo (ou zsh: voir le -modificateur precommand décrit dans la section PRECOMMAND MODIFIERS de man zshmisc), ne le font pas par défaut, mais peuvent le savoir. Certains ont la seule option de dire au shell d'être celui qui se connecte en utilisant son argument (c'est-à-dire bash -l): ssh avec un argument de commande (qui indique explicitement à ssh ce qu'il doit exécuter à l'extrémité distante).

En règle générale, il est préférable de consulter d'abord la documentation du programme utilisé pour appeler le shell afin de déterminer si celui-ci sera celui qui se connecte, puis d'effectuer quelques tests pour déterminer si l'application lancera un shell de connexion (par exemple, en ajoutant echoà .profile).


La deuxième option m'intéresse: comment puis-je réellement changer argv [0] avant (ou après) l'invocation de bash? Peut-on le faire depuis la ligne de commande?
VeryHardCoder

@VeryHardCoder Cela dépend de l'application que vous utilisez pour exécuter la commande. En code C, cela se fait en fournissant directement argv[0]à l’une des exec*fonctions, naturelle et inévitable: vous fournissez toujours les deux, argv[0] ainsi que le chemin de la commande, lorsque vous utilisez des exec*fonctions, même si vous ne voulez jamais argv[0]être différent de l’exécution de la commande. D'autres langues fournissent leurs propres moyens. Plus précisément, bash permet d’utiliser exec -a new_argv0 bash, mais ceci remplacera bien sûr le shell en cours d’exécution avec tout ce que vous avez execédité. Vous devrez donc peut-être utiliser subshell ( (exec -a -zsh zsh))
ZyX 23/03/2016

Ok, j'ai compris! En fait, cela pourrait être fait même de manière plus simple: (exec -l bash) ...
VeryHardCoder

1
Quelle est la différence fonctionnelle entre les deux? Est-ce simplement un drapeau booléen?
Alexey

@Alexey La principale différence fonctionnelle est un ensemble de fichiers de configuration utilisés au démarrage. $0et, peut-être aussi, quelque chose d’autre (variable, paramètre, etc.) est-il défini pour que la cohérence du shell soit détectée dans le fichier de configuration, mais qui dérange réellement de le détecter afin que cela fasse une différence? C'est tout ce que je sais.
ZyX
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.