{{tag>administration système console terminal}}
----
{{ gnu_screen.png?190nolink| Gnu Screen}}
====== Screen, le multiplexeur de terminaux ======
**Screen** ([[wpfr>GNU Screen]]) est un « multiplexeur de terminaux » permettant d'ouvrir plusieurs terminaux dans une même console, de passer de l'un à l'autre et de les récupérer plus tard.
Il offre d'autres services très utiles comme :
  * La possibilité d'attacher et de détacher une session, pratique par exemple pour reprendre la main sur un client IRC tel que [[:Irssi]] ou [[:Weechat]].
  * La possibilité de partager un terminal avec un autre utilisateur, idéal pour aider un utilisateur distant.
  * La possibilité de laisser tourner une commande ssh même en cas de coupure de connexion, idéal pour des opérations d'administration via smartphone quand le réseau mobile est faible ou instable.
===== Pré-requis =====
  * Disposer des [[:sudo|droits d'administration]] ;
  * Disposer d'une connexion à Internet configurée et activée ;
  * Avoir activé l'accès aux [[:depots#universe_et_multiverse|dépôts Universe et Multiverse]]
===== Installation =====
S'il ne l'est pas déjà, [[:tutoriel:comment_installer_un_paquet|installez le paquet]] **[[apt>screen]]**
===== Exemple d'utilisation de Screen =====
Nous allons lancer dans le //screen// une application en ligne de commande, puis « nous détacher » de la session du //screen// en laissant l'application tourner dedans. Ensuite, à partir du même poste ou d'un poste distant (avec [[:ssh]] par exemple) nous pourrons « nous rattacher » à la session du //screen// et récupérer exactement la même chose que lorsque nous nous étions détaché.
  * Créer un nouveau //screen// en nommant la session :
screen -S nom_de_la_session
screen -S nom_de_la_session -dm sleep 10
screen -XS nom_de_la_session quit
Un message annonçant la version utilisée et indiquant que ce programme est publié sous licence GPL s'affiche à l'écran. Il ne reste plus qu'à presser la touche [ESPACE].
La nouvelle session du //shell// s'affiche et attend qu'on saisisse une commande, par exemple : echo test
Le //shell// se présente alors comme ça :
foo@bar $ echo test
test
foo@bar $
  * Pour se détacher de la session du //screen// :
Saisir la suite de touche clavier suivante : [CTRL]+[a] suivi de [d]
OU fermer le terminal et/ou ouvrir un autre terminal
OU tapez exit
  * Pour se rattacher à la session du //screen// :
screen -r nom_de_la_session
Le rattachement à la session du //screen// peut très bien se faire à distance. Nous accédons alors à notre machine via un accès [[:ssh]] par exemple.
===== Utilisation =====
==== Lancement de Screen ====
  * Créer un nouveau //screen// en nommant la session : screen -S toto
Une fois passé l'écran de version, nous avons devant nous un terminal prêt à servir, nous pouvons l'utiliser comme d'habitude (en dehors des applications en mode graphique).
  * Connaître les //screen// existants : screen -ls
  * Rattacher un //screen// existant : screen -r
Si plusieurs //screen// sont en cours d'exécution, voilà ce que screen -r va afficher :
There are several suitable screens on: 
      13379.toto1 (Detached) 
      13308.toto2 (Detached) 
      13334.toto3 (Attached) 
      13356.toto4 (Dead ???)
Type "screen [-d] -r [pid.]tty.host" to resume one of them.
Nous avons donc le choix entre plusieurs //screen// que l'on va préciser simplement par
screen -r 13379
ou
screen -r toto1
Si le //screen// que nous essayons de rattacher n'a pas été détaché (toto3 dans l'exemple ci-dessus), il est possible de forcer son détachement de la console précédente :
screen -d toto3
Pour avoir plusieurs attachements simultanés (option "-x"), voir la section [[#Partager un terminal]].
Si un //screen// est mort (toto4 dans l'exemple ci-dessus), il est possible de le supprimer en saisissant la commande
screen -wipe
==== Créer un nouveau terminal ====
Saisir la suite de touche clavier suivante : [CTRL]+[a] suivi de [c]
Si vous avez auparavant exécuté une commande, le contenu du terminal devrait visiblement changer : vous êtes dans le nouveau terminal dont vous venez de demander la création.
==== Naviguer entre les terminaux du screen ====
  * [CTRL]+[a] suivi de [n]: pour «**n**ext», aller au terminal suivant.
  * [CTRL]+[a] suivi de [p]: pour «**p**revious», aller au terminal précédent.
  * [CTRL]+[a] suivi de [0]..[9]: aller au terminal //n//.
  * [CTRL]+[a] suivi de [']: saisir dans le prompt le numéro du terminal.
  * [CTRL]+[a] suivi de ["]: lister des différents terminaux, avec la possibilité d'en choisir un.
  * [CTRL]+[a] suivi de [w]: lister les terminaux actuels avec leur nom.
  * [CTRL]+[a] suivi de [a]: retourner au terminal d'où l'on vient.
  * [CTRL]+[a] suivi de [A]: nommer les terminaux et s'y rendre par la suite plus aisément.
====  « Tuer » un screen ====
Lorsque on est logué sur un screen, pour le « tuer » (kill) :
exit
    * [CTRL]+[D] : équivalent à exit. Lorsqu’il n’y a plus qu’une seule console quitte //screen//.
    * [CTRL]+[A] puis :quit le ferme également. Lorsqu'il n'y a plus qu'une seule console quitte //screen//.
==== Détacher screen ====
  * [CTRL]+[a] suivi de [d]: pour détacher //screen//
  * [CTRL]+[a] suivi de [DD]: pour détacher //screen// et fermer la session
==== Partager un terminal ====
Imaginez que vous vouliez que quelqu'un fasse quelque chose à distance sur votre machine, mais que vous souhaiteriez voir ce qu'il fait, alors //screen// va vous aider :)
  * Créer un nouveau //screen// en nommant la session :
screen -S toto
Votre ami se connecte sur votre machine avec le même compte, via [[:ssh]] par exemple et saisit la commande suivante :
screen -x toto
À partir de là, tout ce qui est saisi dans un des 2 terminaux (le vôtre ou le sien) apparaît sur les deux. Si il n'y a qu'un seul //screen// de lancé, il n'est pas nécessaire de préciser son nom lors de la connexion.
===== Raccourcis supplémentaires =====
Séparation de la console :
  * [CTRL]+[a] suivi de [AltGr]+[6] (|): Sépare la console courante en deux consoles verticalement (la console courante devient celle de gauche).
  * [CTRL]+[a] suivi de [S]: Sépare la console courante en deux consoles horizontalement (la console courante devient celle du dessus).
  * [CTRL]+[a] suivi de [TAB]: Une fois la console séparée, ce raccourci permet de se positionner sur la console suivante.
  * [CTRL]+[a] suivi de [Q]: Supprime toutes les régions, sauf la région courante.
  * [CTRL]+[a] suivi de [K]: Tue la console courante ainsi que les processus qui s'y trouvent.
  * [CTRL]+[a] suivi de [X]: Ferme la région courante.
:!:  Pour la seconde console, il faut créer un nouveau screen par  [CTRL]+[a] suivi de [c] :!:
A noter que la suppression d'une ou plusieurs régions ne supprime pas les consoles qui s'y trouvaient.
Divers :
  * [CTRL]+[a] suivi de [F]: Redimensionnement de la fenêtre à la taille de son terminal. Utile lorsque l'on est plusieurs sur une même console et que l'on enrage de ne pas avoir un écran 16/9e.
  * [CTRL]+[a] suivi de [H]: Permet de logguer tout ce qui passe à l'écran dans un fichier $HOME/screenlog.XX (XX : no de la console)
  * [CTRL]+[a] suivi de [?]: Affiche une petite aide
  * [CTRL]+[a] suivi de [x]: Verrouille la session
  * [CTRL]+[a] suivi de [a]: Envoie le caractère de commande (CTRL a) à la fenêtre.
Déplacement et copie :
  * [CTRL]+[a] suivi de [ESC]: Entre en mode copie/scrollback. On peut se déplacer dans le //screen// avec les flèches directionnelles.
  * ENTER : Permet de commencer une sélection. Appuyer une nouvelle fois sur ENTER pour terminer la sélection.
  * [CTRL]+[a] suivi de []]: Colle le contenu sélectionné précédemment.
===== Personnaliser son screen =====
Il est possible pour chaque utilisateur du système de personnaliser son //screen// grâce à un fichier de configuration spécifique : «~/.screenrc». Un exemple d'un tel fichier est disponible dans /etc/screenrc. Il vous suffit de faire :
cp /etc/screenrc ~/.screenrc
Et vous pourrez ensuite le personnaliser comme bon vous semble.
Il est possible de changer le caractère d'échappement (CTRL+a). De cette manière, vous avez un caractère d'échappement sur votre machine et un différent sur une machine distante. Et grâce à cela, vous pouvez faire du //screen// dans un //screen//.
[[https://forum.ubuntu-fr.org/viewtopic.php?id=846021|https://forum.ubuntu-fr.org/viewtopic.php?id=846021]]
===== Voir aussi =====
  * Les pages du manuel **man screen** et **info screen**
  * [[http://www.gnu.org/software/screen|La page du projet]] (en)
  * [[http://www.ddmdllt.org/weblog/posts/2008/10/27/screen-ssh-et-autres-joies/|Un article sur screen]] paru sur le Planet de l'APRIL
  * [[http://postit.petitchevalroux.net/linux/screen-tutoriel-video-linux.191.html|Tutoriel video de screen]]
  * [[https://forum.ubuntu-fr.org/viewtopic.php?id=390985|Partagez vos '.screenrc' (sur Ubuntu-fr)]]
  * [[http://durak.org/sean/pubs/software/screen/screen.html#Top|Manuel de screen]], [[http://durak.org/sean/pubs/software/screen/screen_27.html|partie sur le multiuser]] (en)
  * [[http://unstableme.blogspot.fr/2010/01/prevent-exit-of-shell-with-ctrl-d.html|Ignore crtl+d]] (en)
  * [[Tmux]] un autre multiplexeur.
  * [[:Byobu]] une version améliorée de Screen.
----
//Contributeurs : Termitor, Benoît « Beny » Pineau, [[utilisateurs:loack]], [[utilisateurs:petitchevalroux]], boubou_cs, [[utilisateurs:mydjey]]//