Mise à jour : Debian 9.1
Le shell est le programme qui lit, interprète et exécute les commandes lues depuis un terminal ou un fichier et permet d'interagir avec l'ordinateur. Plusieurs shells peuvent être ouverts simultanément, de façon parallèle ou imbriquée, par un ou plusieurs utilisateurs.
Ce document décrit le déroulement d'une session shell interactive.
Terminologie :
Shell interactif : Un shell est dit interactif lorsqu'il affiche un prompt. Les tâches exécutées en arrière plan sont des exemples de shell non interactif
Sommaire
Le démarrage d'un shell interactif s'effectue
en lançant un terminal
ou en lançant un shell "fils" depuis un shell "parent" ouvert dans un terminal
La méthode de lancement du shell va jouer sur la définition de l'environnement :
Si le shell est démarré par un "login" utilisateur, le shell est dit shell de connexion (login shell)
Sinon, le shell est dit "non connexion" (not-logging shell)
alt Ctrl Fn
Un shell de connexion s'ouvre.
Pour démarrer un shell dans un émulateur de terminal : lancer l'émulateur de terminal, par exemple, xfce4-terminal, depuis l'interface graphique
Pour plus de détails sur l'ouverture d'un terminal voir : Terminal
Pour démarrer un shell de connexion (login shell)
$ bash -l
Mot de passe :
Pour démarrer un shell "non connexion" (not loging shell)
$ bash
su démarre un nouveau shell, comme bash, mais permet de changer d'utilisateur. Dans le cas du super-utilisateur, le nom (root) peut être omis dans la commande.
Pour démarrer un shell de connexion (login shell)
$ su -l nom_utilisateur
Mot de passe :
$ su nom_utilisateur
Mot de passe :
Note : Dans ce dernier cas, il s'agit bien d'un shell "non connexion", la saisie du nom d'utilisateur et du mot de passe appartiennent à la commande su et non à bash.
Les commandes suivantes permettent d'afficher le pid du shell et les shells ouvert dans la session :
$ echo $BASHPID
2716
$ ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 1000 2698 2693 0 80 0 - 5407 - pts/0 00:00:00 bash
0 S 1000 2716 2698 0 80 0 - 5419 - pts/0 00:00:00 bash
0 R 1000 2745 2716 0 80 0 - 7465 - pts/0 00:00:00 ps
Dans l'exemple ci-dessus, le pid du shell courant est 2716. Son parent a pour pid 2698 (colonne PPID), et est lui-même un shell. Le shell courant est donc un shell fils.
Repris de : https://unix.stackexchange.com/questions/26676/how-to-check-if-a-shell-is-login-interactive-batch#26827
Les commandes suivantes permettent d'afficher
$ shopt -q login_shell && echo 'Shell de connexion' || echo 'Pas un shell de connexion'
s'il s'agit d'un shell interactif :
$ [[ $- == *i* ]] && echo 'Shell interactif' || echo 'Shell non interactif'
La commande exit ou la combinaison de touches Ctrl D permettent
de clore le shell courant et de revenir au shell parent, s'il s'agit d'un shell fils
ou selon qu'il s'agit d'un émulateur de terminal ou d'une console, de fermer l'émulateur de terminal ou de réafficher le prompt de login
Les shells de connexion peuvent également être fermés avec la commande logout.
$ loginctl list-users
UID USER
1000 pi
1 users listed.
$ loginctl list-sessions
SESSION UID USER SEAT TTY
12 1000 pi pts/0
1 sessions listed.
$ loginctl user-status
pi (1000)
Since: Mon 2021-12-13 14:48:58 CET; 25min ago
State: active
Sessions: *12
Linger: no
Unit: user-1000.slice
├─session-12.scope
│ ├─655 sshd: pi [priv]
│ ├─682 sshd: pi@pts/0
│ ├─683 -bash
│ ├─746 loginctl user-status
│ └─747 pager
└─user@1000.service
└─init.scope
├─659 /lib/systemd/systemd --user
└─660 (sd-pam)
déc. 13 14:48:59 raspi systemd[659]: Reached target Timers.
$ loginctl session-status
12 - pi (1000)
Since: Mon 2021-12-13 14:48:58 CET; 28min ago
Leader: 655 (sshd)
TTY: pts/0
Remote: 192.168.0.14
Service: sshd; type tty; class user
State: active
Unit: session-12.scope
├─655 sshd: pi [priv]
├─682 sshd: pi@pts/0
├─683 -bash
├─769 loginctl session-status
└─770 pager
déc. 13 14:48:59 raspi systemd[1]: Started Session 12 of user pi