(GNU) Screen, le compagnon idéal de ssh ou bien plus qu’un “window manager” en mode texte
Le site officiel de screen et la page de manuel de screen commencent l’introduction par ces mots (en anglais): “Screen is a full-screen window manager that multiplexes a physical terminal between several processes, typically interactive shells.”
Une traduction approchée en français pourrait être “Screen est un gestionnaire de fenêtres plein écran qui multiplexe un terminal physique entre plusieurs processus, typiquement des shells interactifs”. Par “gestionnaire de fenêtres” il faut comprendre “gestionnaire de fenêtres en mode texte”, mais quoiqu’il en soit, cette phrase est loin de résumer toutes les possibilités de screen, et loin d’indiquer pourquoi screen est tant utile avec ssh…
Lancement de screen, les fenêtres, et le multiplexage…
Commençons par le début! GNU Screen permet en effet de multiplexer un terminal (physique ou virtuel) entre plusieurs processus. Ce terminal que vous multiplexez peut être l’un des terminaux tty1 à tty6 (obtenus en pressant respectivement de [Ctrl]+[Alt]+[F1] à [Ctrl]+[Alt]+[F6]), un terminal virtuel lancé depuis X.Org (comme par exemple avec konsole, gnome-terminal ou xterm), ou bien encore un terminal virtuel distant c’est à dire une session ssh.
Bref, pour lancer screen pour la première fois (lorsqu’il n’est pas encore lancé), tapez tout simplement “screen” depuis votre terminal. Il faut bien sûr que ce programme soit préalablement installé, ce qui est souvent le cas.
Au lancement, screen affiche un message classique indiquant le copyright, la licence (libre, GNU GPL version 2 ou ultérieure en l’occurrence), l’adresse pour soumettre les rapports de bugs et pour envoyer bierre et pizzas (quoique je doute que ça soit facile par email…), et surtout vous indique d’appuyer sur [Entrée] ou [Espace] pour continuer. Vous savez donc ce qu’il vous reste à faire!
Ensuite vous arrivez tout simplement sur un terminal virtuel classique, sauf que screen est derrière tout ça et que vous pouvez interagir avec via ses combinaisons de touches (personnalisables, mais on n’évoquera ici que celles par défaut).
Les commandes clavier pour s’adresser à screen commencent par [Ctrl]+[A] (que l’on notera ^A), suivi d’une autre touche ou d’une combinaison de touches. La première commande que je vous suggère d’essayer est “^A ?” ([Ctrl]+[A] suivi de [?]). Cette commande, facile à se rappeller, affiche de façon logique la liste des combinaisons de touches, ce qui s’avère très utile… Vous ferez également par la suite attention aux minuscules et majuscules dans les commandes, car cela compte.
Vous voilà donc bien armé pour commencer à découvrir screen.
Créons donc des nouvelles “fenêtres”, pour cela il y a principalement deux solutions:
- la commande “^A c”: crée une nouvelle fenêtre en y lançant le shell et bascule de suite sur cette fenêtre
- taper screen nom_de_la_commande (une fois que screen est déjà lancé) pour lancer une commande dans une nouvelle fenêtre.
Pour naviguer entre les fenêtres: [Ctrl]+[A] puis ["] (oui la touche guillemet, ici elle fait partie de la commande…).
Vous le remarquerez, trop souvent pas mal de fenêtres ont le même nom… En renommer quelques unes sera donc assez pratique: “^A A”.
Enfin pour détruire une fenêtre, le plus simple est de détruire le processus qu’elle contient: par exemple en tappant exit dans le cas d’un shell bash.
En cherchant un peu, vous pourrez découvrir qu’il est possible de “splitter” (diviser) votre fenêtre, en deux ou en plus, mais je ne présenterais pas tout et je vous laisse chercher un peu…

Détacher et réattacher des sessions persistantes
GNU Screen ne permet pas uniquement d’avoir l’équivalents des onglets ou des fenêtres multiples en lançant une seule fois le programme ssh…
Un intérêt principal est de pouvoir détacher et réattacher des sessions qui persistent ainsi dans le temps alors même que vos connexions ssh peuvent être interrompues. Cela permet aussi de reprendre par la suite en ssh une tâche que vous avez commencez à faire directement sur la machine.
Poussé à l’extrême, certains l’utilisent par exemple pour chatter sur irc dans le bus, en se connectant automatiquement aux réseaux ouverts qui se présentent au fil du trajet….
Pour “détacher” une session screen deux cas de figure:
- manuellement, avec “^A d”
- en fermant le programme ayant appellé screen (par exemple konsole, ou en cas de rupture de connexion ssh, ce qui peut arriver facilement avec du wifi…)
Pour reprendre une session screen interrompue (ie la “ré-attacher”), il faut regarder du côté de “screen -r ” et de ses variantes (le plus adapté pour vous peut différer suivant la situation, je vous laisse donc regarder dans la documentation qui est assez bien faite…).
Le reste?
Malgré sa longueur, cet article ne présente qu’une infime partie des possibilités de screen. Je me suis volontairement limité aux plus courantes de celles que j’utilise fréquemment avec ssh. Après si vous souhaitez exploiter screen à fond, libre à vous de chercher un peu…



J’utilise screen de façon basique depuis pas mal de temps avec irssi et rTorrent. Il est très puissant dans ce pouvoir de détacher/re-attacher les fenêtres.
Tape ça dans ~/.screenrc
caption always “%{=b wK}%-w%{=b rY}%n %t%{-}% w %=%{= wB}%c%{-} ”
enjoy
Je préfère utiliser “C-a K” pour fermer un fenêtre plutôt que de taper exit =)
Sinon, effectivement, “man screen” est l’ami qu’il vous faut !
@lhb: y a control-d aussi à la place de exit ;)
Bonjour, j’ai installé le paquet Screen pour avoir un multiplexeur de terminal et là je rencontre un problème. Tout marche impécable, mais il m’arrive d’avoir un screen qui semble bloquer toutes commandes, le screen c’est pas réellement freezé (car je vois bien le défilement de ce qu’il ce passe) mais le curseur est bloqué et je ne peux rien envoyer.
Comment remédier à ce problème ?
merci !
@Ghost : Curieux. J’ai déjà eu screen qui plante totalement, avec des gros soucis récurrents, mais à chaque fois c’était sur la même machine, machine que je n’administre pas mais sur laquelle j’ai un accès simple utilisateur en ssh.
“Plantage partiel” avec le contenu qui continue de défiler, ça jamais vu. Est-ce spécifique à une appli ? Le screenrc contient-il des réglages personnalisés ?
Bonjour je découvre tout juste screen. Est-ce possible de “retrouver” l’affichage des applications graphiques lancé avec screen.
Par exemple demander à quelqu’un d’un pays lointain de lance xclock et de récupérer son affichage pour voir qu’elle l’heure il est la bas…
Très joli blog, bravo
@roger :
Bonjour,
Le programme screen en lui même n’est pas fait pour ça : c’est uniquement en mode console je crois. En revanche, récupérer l’affichage à distance en mode graphique est possible avec bien d’autres programmes, bien que franchement, la dernière fois que je l’ai fait remonte à trop loin pour que je m’en souvienne avec exactitude (ssh en mode texte étant quand même très souvent suffisant).
Je t’invite à jeter un coup d’oeil sur http://doc.ubuntu-fr.org/vnc : ce n’est pas forcément toute la documentation idéale pour ta config ou tes besoins, mais ça te donnera au minimum des idées sur quoi chercher.
Merci, je vais regarder de plus près vnc, et les partages de bureau.
Hey,
merci pour ces info, ça m’a pas mal aidé :p
sinon j’ai une question, quand on a splitté la fenêtre en deux dans la largeur, est-il possible de modifier la hauteur de celle du bas sans toucher à celle du haut?
Thanks :)
@Nicolas :
Je dois avouer qu’aujourd’hui j’utilise essentiellement screen pour les deux raisons suivantes :
1) C’est une alternative aux tabs et fenêtres, plutôt agréable à utiliser au clavier,
2) Ça permet d’avoir une ou plusieurs sessions bash qui résistent très bien à une déconnexion ssh (ou à une fermeture de la session Gnome/KDE/X avec fermeture de l’émulateur de terminal associé tel que “Terminal”/Konsole/xterm…).
Pour le reste, je me souviens que screen est riche en fonctionnalités, et si la curiosité m’y pousse, je sais que la commande “man” est toujours là.
Bonjour !
J’essaye sans succès une manipulation depuis quelque temps, peut être pourrez vous m’aider (j’ai épluché le manuel et plusieurs forum sans succès).
Je lance un screen dans une machine A, via lequel je ssh sur une machine B, dans laquelle je relance un screen.
A ce stade, multiples tests à l’appui, j’ai “la main” sur le screen de la machine A (tout en continuant à utiliser le terminal de B en ssh). Je souhaiterai pouvoir prendre la main sur le screen de B (en fait utiliser screen A et screen B alternativement en fonction de mes besoins, mais j’imagine que ça revient au même)
Merci de vos conseils, et de ce tuto qui fut un bon complément à ce que je savais déjà !
Bonjour,
@ronces : Le résultat de vos essais est tout à fait normal. Le screen le plus “à l’extérieur” (celui lancé sur la machine A) intercepte la combinaison de touche [Ctrl] [A], considéré comme la “command key”, et par conséquent ne la retransmet pas en principe au programme “à l’intérieur”.
Toutefois, une des commandes de screen est de retransmettre un [Ctrl] [A] au programme à l’intérieur, donc de ce point de vue, aucune possibilité n’est perdue. Cette commande s’obtient en tapant la touche “a” après le [Ctrl] [A]. Cette possibilité est listée sur la page d’aide que vous pouvez obtenir en tapant [?] après le [Ctrl] [A] :
“Screen key bindings, page 1 of 3″ : “Command key: ^A Literal ^A: a”.
Le symbole “caret” (l’accent circonflexe sans lettre) siginifie alors la touche [Ctrl].
Ainsi, au prix d’une manipulation certes plus complexe, vous pourrez vous adresser au screen lancé sur la machine B.
Une autre solution est de changer le “command character” afin que ce ne soit pas le même sur les deux screen. Vous pouvez jeter un coup d’œil à “-e xy” sur la page du manuel de screen, ou bien à la commande escape (utile pour un screenrc).
J’avoue, à titre personnel, j’évite le screen dans un screen, et je préfère utiliser les onglets de l’outil de terminal virtuel pour séparer les sessions ssh. Par contre, une commande que j’apprécie dans mon screenrc :
caption always ‘%3n %t %c:%s %H %l’
(en gros numéro de fenêtre dans screen, nom de celle-ci, heure, hostname et load average si je ne me trompe pas, le tout dans une ligne en bas de la fenêtre, avec inversion de la couleur de fond et des caractères sur cette ligne)