Screen

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Domaine Multiplexeur de terminal
Commande screen
Contexte Garder une session (et les process qu'elle contient) vivante après une

déconnexion — utile en SSH sur un serveur distant

Voir aussi Nohup, Bg (alternatives partielles, pas des équivalents)

screen permet d'ouvrir une session de terminal persistante : on peut s'y détacher (detach) sans la fermer, se déconnecter du serveur, puis s'y rattacher (attach) plus tard — depuis la même machine ou une autre — et retrouver exactement l'état de la session, y compris les programmes toujours en cours d'exécution dedans.

screen n'est pas un équivalent de nohup ou de bg : ces deux commandes évitent qu'un process ne soit tué à la déconnexion du shell, mais on ne peut pas reprendre la main dessus interactivement ensuite (pas de STDIN/STDOUT repris, pas de multi-fenêtres). screen gère de vraies sessions interactives, avec plusieurs fenêtres, du split d'écran, et même du partage multi-utilisateurs.

Installation

apt-get install screen        # Debian/Ubuntu
yum install screen            # RHEL/CentOS

Sessions : créer, détacher, retrouver

screen                  # nouvelle session anonyme
screen -S nom           # nouvelle session nommée (plus pratique pour la retrouver)

screen -ls              # lister les sessions en cours
screen -r               # rattacher l'unique session détachée
screen -r nom           # rattacher une session précise (par nom ou PID.nom)
screen -d -r nom        # forcer le détachement ailleurs puis rattacher ici
                         # (utile si la session est restée "attached" sur un autre terminal)

Raccourci pour détacher depuis l'intérieur de la session : Ctrl+a d.

⚠️ Une session tuée avec exit (ou Ctrl+a puis k sur la dernière fenêtre) est définitivement perdue — contrairement à un détachement, il n'y a rien à rattacher ensuite.

Raccourcis clavier

Toutes les commandes screen s'invoquent par le préfixe Ctrl+a (noté C-a ci-dessous), suivi d'une touche :

C-a c        nouvelle fenêtre
C-a k        fermer la fenêtre courante
C-a n / p    fenêtre suivante / précédente
C-a "        lister toutes les fenêtres et en choisir une
C-a [0-9]    aller directement à la fenêtre 0-9
C-a Tab      passer d'une fenêtre à l'autre (utile avec le split)

C-a S        diviser l'écran horizontalement
C-a X        fermer la région d'écran courante
C-a Q        ne garder que la région courante (fermer les autres)
C-a Ctrl+A   ??? (préfixe littéral, rarement utile)

C-a d        détacher la session (screen continue de tourner en arrière-plan)
C-a Ctrl+\   fermer screen et terminer toutes les fenêtres (avec confirmation)
C-a ?        aide / liste des raccourcis actifs

Sessions multi-utilisateurs

Deux façons de partager une session entre plusieurs utilisateurs connectés.

Méthode simple : même utilisateur système

Si les deux personnes peuvent se connecter avec le même compte, la deuxième rejoint simplement la session déjà ouverte par la première avec screen -x au lieu de screen -r — les deux terminaux affichent alors la même chose en temps réel :

# Sur le premier terminal
screen -S partagee

# Sur le deuxième terminal (même utilisateur, autre connexion SSH)
screen -x

Méthode ACL : utilisateurs système différents

Pour autoriser un utilisateur différent à rejoindre une session, screen doit tourner en mode multi-utilisateur, ce qui nécessite le bit setuid root sur le binaire :

chmod u+s "$(which screen)"
chmod 755 /var/run/screen

⚠️ Le setuid root sur screen est une surface d'attaque non négligeable (plusieurs CVE historiques touchant sa gestion des permissions/fichiers) — à réserver à des besoins réels de partage de session inter-comptes, pas à activer par défaut.

Puis dans ~/.screenrc (ou en tapant les commandes après Ctrl+a : dans une session déjà ouverte) :

multiuser on
acladd invite            # autoriser l'utilisateur "invite" à rejoindre la session
aclchg invite -x "?"     # lui retirer le droit d'exécuter des commandes screen
aclchg invite +x "wall"  # sauf "wall" (écrire un message dans la ligne de statut)
aclumask invite-wx       # permissions par défaut sur les fenêtres : lecture seule

L'utilisateur invité rejoint ensuite avec :

screen -x proprietaire/nom_session

Exemples d'ACL supplémentaires :

aclchg toto -w "#?"                    # accès en lecture seule (voir sans agir)
aclchg toto -wx "#?"                   # retirer tout droit d'écriture/exécution
aclchg toto +x "detach,wall,colon"     # n'autoriser que ces commandes précises

Configuration (~/.screenrc)

Aide-mémoire des codes couleur et des variables d'affichage utilisables dans le fichier de configuration (barre de statut, invite, etc.) :

Couleurs
--------
 0 Black             .    laisser la couleur inchangée
 1 Red               b    blue
 2 Green             c    cyan
 3 Brown / yellow    d    default color
 4 Blue              g    green           b    bold
 5 Purple            k    blacK           B    blinking
 6 Cyan              m    magenta         d    dim
 7 White             r    red             r    reverse
 8 unused/illegal    w    white           s    standout
 9 transparent       y    yellow          u    underline

Variables d'affichage (%-escapes)
----------------------------------
 %%      signe pourcent littéral
 %a/%A   'am'/'pm' ou 'AM'/'PM'
 %c/%C   heure courante HH:MM (24h / 12h)
 %d/%D   numéro du jour / nom du jour
 %f      flags de la fenêtre
 %F      vrai si la fenêtre a le focus
 %h      hardstatus de la fenêtre
 %H      nom d'hôte
 %l      charge système courante
 %m/%M   numéro du mois / nom du mois
 %n      numéro de fenêtre
 %s      secondes
 %t      titre de la fenêtre
 %u      autres utilisateurs présents sur cette fenêtre
 %w      liste de toutes les fenêtres (numéros + noms)
 %-w     fenêtres avant la fenêtre courante
 %+w     fenêtres après la fenêtre courante
 %W      toutes les fenêtres sauf la courante
 %y/%Y   année sur 2 / 4 chiffres

Voir aussi

  • Nohup — détacher un process de son shell sans session interactive
  • Bg — passer un job en arrière-plan dans le shell courant
  • Ssh — cas d'usage le plus courant de screen (session distante persistante)