Je comprends la différence fondamentale entre un shell interactif et un shell non interactif. Mais qu'est-ce qui différencie exactement un shell de connexion d'un shell non-login?
Pouvez-vous donner des exemples d'utilisation d'un shell interactif sans connexion ?
Réponses:
Un shell de connexion est le premier processus qui s'exécute sous votre ID utilisateur lorsque vous vous connectez pour une session interactive. Le processus de connexion indique au shell de se comporter comme un shell de connexion avec une convention: passer l'argument 0, qui est normalement le nom de l'exécutable du shell, avec un
-
caractère ajouté (par exemple-bash
alors qu'il le serait normalement)bash
. Les shells de login lisent généralement un fichier qui des choses comme la définition des variables d'environnement:/etc/profile
et~/.profile
pour la coquille traditionnelle Bourne, en~/.bash_profile
plus pour bash † ,/etc/zprofile
et~/.zprofile
pour zsh † ,/etc/csh.login
et~/.login
pour csh, etc.Lorsque vous vous connectez à une console de texte, via SSH ou avec
su -
, vous obtenez un shell de connexion interactif . Lorsque vous vous connectez en mode graphique (sur un gestionnaire d'affichage X ), vous ne disposez pas d'un shell de connexion, mais d'un gestionnaire de session ou d'un gestionnaire de fenêtres.Il est rare d’exécuter un shell de connexion non interactif , mais certains paramètres X le font lorsque vous vous connectez avec un gestionnaire d’affichage afin de pouvoir lire les fichiers de profil. D'autres paramètres (cela dépend de la distribution et du gestionnaire d'affichage) sont lus
/etc/profile
et~/.profile
explicitement, ou ne les lisent pas. Pour obtenir un shell de connexion non interactif, vous pouvez également vous connecter à distance à l'aide d'une commande transmise via une entrée standard qui n'est pas un terminal, par exemplessh example.com <my-script-which-is-stored-locally
(par opposition àssh example.com my-script-which-is-on-the-remote-machine
, qui exécute un shell non interactif et non connecté).Lorsque vous démarrez un shell dans un terminal dans une session existante (écran, terminal X, tampon de terminal Emacs, shell dans un autre, etc.), vous obtenez un shell interactif sans connexion . Ce shell peut lire un fichier de configuration du shell (
~/.bashrc
pour bash invoquéebash
,/etc/zshrc
et~/.zshrc
pour zsh,/etc/csh.cshrc
et~/.cshrc
pour csh, le fichier indiqué par laENV
variable pour POSIX / coquilles XSI conformes tels que tableau de bord, ksh et bash lorsqu'il est invoqué commesh
,$ENV
si elle est définie et~/.mkshrc
pour mksh, etc.).Lorsqu'un shell exécute un script ou une commande passée sur sa ligne de commande, il s'agit d'un shell non interactif et non connecté . De tels shells fonctionnent tout le temps: il est très courant que lorsqu'un programme appelle un autre programme, il exécute un minuscule script dans un shell pour appeler cet autre programme. Certains shells lisent un fichier de démarrage dans ce cas (bash exécute le fichier indiqué par la
BASH_ENV
variable, zsh exécute/etc/zshenv
et~/.zshenv
), mais cela présente un risque: le shell peut être appelé dans toutes sortes de contextes, et vous ne pouvez pratiquement rien faire de tel casser quelque chose.† Je simplifie un peu, voir le manuel pour les détails sanglants.
la source
bash
tant que shell de connexion non interactif?echo $- | bash -lx
FOO
est une variable d'environnement (c'est-à.profile
- dire contientexport FOO=something
), elle est disponible pour tous les sous-processus, y comprisfoo.sh
. Si vous changez.profile
d'export FOO=something_else
alors./foo.sh
imprimerasomething
jusqu'à ce que la prochaine fois que vous vous connectez.Pour savoir si vous êtes dans un shell de connexion:
Dans Bash, vous pouvez également utiliser
shopt login_shell
:(ou
on
dans un shell de connexion).Des informations peuvent être trouvées dans
man bash
(recherche d'invocation). Voici un extrait:Vous pouvez tester cela vous-même. Chaque fois que vous SSH, vous utilisez un shell de connexion. Par exemple:
L'importance d'utiliser un shell de connexion est que tous les paramètres
/home/user/.bash_profile
seront exécutés. Voici un peu plus d'informations si vous êtes intéressé (deman bash
)la source
Dans une coquille de connexion,
argv[0][0] == '-'
. Voici comment il sait que c'est un shell de connexion.Et dans certaines situations, il se comporte différemment selon son statut de "shell de connexion". Par exemple, un shell, qui n'est pas un shell de connexion, n'exécute pas une commande "logout".
la source
man bash
, avec une emphase ajoutée, "Un shell de connexion est un shell dont le premier caractère de l'argument zéro est un -, ou un code commençant par l'option --login. "Un shell démarré dans un nouveau terminal dans une interface graphique serait un shell interactif sans connexion. Cela aurait pour source votre .bashrc, mais pas votre .profile, par exemple.
la source
Je développerai l'excellente réponse de Gilles, associée à la méthode de vérification du type de shell de connexion de Timothy.
Si vous aimez voir des choses par vous-même, essayez les extraits et les scénarios ci-dessous.
Vérifier si le shell est (non) interactif
Vérifier si le shell est (non) connecté
Si la sortie
echo $0
commence par-
, c'est un shell de connexion (echo $0
exemple de sortie:)-bash
. Sinon, c'est un shell non-login (echo $0
exemple de sortie:)bash
.Associons les deux éléments ci-dessus pour obtenir les deux informations à la fois:
Scénarios:
Session SSH typique sans options spéciales
Exécution d'un script ou exécution explicite via un nouveau shell
Exécuter un script local à distance
Exécuter une commande sur ssh à distance
Exécuter une commande sur ssh à distance avec
-t
switchVous pouvez demander explicitement un shell interactif lorsque vous souhaitez exécuter une commande à distance via ssh en utilisant
-t
switch.Remarque: Pourquoi exécuter une commande à distance n’est pas
login shell
plus utile ici .la source