Cours sur l'outils Gnu Screen pour #ubuntu-fr-classroom.

mercredi 28 novembre 2007 001804 1196205430 by H. (illovae) Seldon.

Plan

Présentation de l'outils Gnu Screen

Screen est un navigateur de fichier pour votre terminal. Il prend rééllement toute son envergure dans un tty d'ailleurs (c'est à dire en dehors de votre interface graphique permise par X.org).
Avec cet outils vous pouvez créer plusieurs terminaux virtuels, naviguer entres eux. Screen dispose de toutes les fonctionnalités des terminaux "modernes", c'est à dire entre autres un buffer d'historique, le support des caractères accentués, de l'ANSI...
Screen devient très intéressant aussi lors de connection entre ordinateur. Vous lancer l'application foobar dans un screen sur l'ordinateur A. Vous allez à la fac ou ailleurs, vous vous connecter avec ssh sur cet ordinateur A et "récupérer" au travers de screen votre application foobar.
Pour information, screen a initialement été écrit par Oliver Laumann. J'ai spécifié dans le titre 'GNU' car en effet c'est un projet qui a été réaliser avec le soutien de GNU, et ai distribué, bien sûri, sur sa licence. Il existe d'autres outils du même genre tel que tmux qui est développé sous BSD License, ou encore dtach qui reprend les éléments principaux de screen. On pourra aborder à la fin de ce cours, le gestionnaire de fenêtre pour terminal Twin si le coeur vous en dit.

Simplement pour conclure cette introduction, sachez que ce qui va vous être présenter ce soir permet une utilisation de screen comme un window manager, car c'est la façon dont je l'utilise personnellement. À moins d'être un véritable CLI user comme certains fans de crypto que je connais ;) vous n'utiliserez jamais toutes les informations qui vous seront donnés. Donc prenez soin de penser les choses, et à les adapter à vos propres besoins :)

Premier pas : se familiariser avec les raccourcis clavier

Rien ne vaut la pratique pour apprendre à utiliser un outils. Ce cours nécessite que vous n'ayez pas encore de .screenrc (on va en faire un dans la troisième partie du cours). Ne vous inquiétez pas, hormis quelques raccourcis clavier important à retenir (quatre ou cinq) vous pouvez vous laissez porter :)

Une chose est à savoir: screen est "dirigeable" au travers de raccourcis clavier qui tous doivent commencer par "Ctrl et a" pressé simultanément, noter dans ce cours C-a.

De sus les commandes que vous aurez à taper seront précédée d'un $ et seront toujours affiché par moi sur une seule et unique ligne, exemple :

$ echo "une seule et unique ligne"

Enfin tout ce qui doit être écrit/collé dans un fichier est affiché :

variable option

Allez en route pour l'aventure : on ouvre un terminal et on lance screen :

$ screen

Il est gentil, il vous dit bonjour tout ça, et vous convie de presser la barre espace ou la touche Entrée pour continuer. Je vous laisse procéder.
Une fois fait, vous vous retrouvez simplement dans un terminal tout ce qu'il y a de plus banal. On va rentrer une commande pour se situer :

$ echo "je suis dans screen"

Bien. On va maintenant pressez simultanément donc notre C-a puis d. Vous voyez la différence ? Screen vous gratifie d'un ''detached'' (voyez le rapport avec ''d'' du raccourci) pour vous signifié qu'il est ''détaché''.
On peut d'ailleurs le voir simplement en faisant un :

$ screen -ls

On y voit le pid du votre session screen, où il se trouve, un Multi (qui est un des modes de screen, nous y reviendrons) ainsi qu'un ''detached''. Maintenant nous allons "réatacher notre screen" en faisant un:

$ screen -r

Accrochez-vous, on va partir à l'aventure là: on créé une seconde fenetre à notre screen. Combinaison de touches C-a c (pour create) et hop on y ai, pour nous repérer, faisons un:

$ echo "je suis dans ma seconde fenetre screen"

On va jongler entre les deux fenetres, pour cela il existe plusieurs façons, mais pour le moment, je vais vous en montrer qu'une seule, les autres viendront un peu plus tard dans le cours, vous comprendrez pourquoi. C-a p (pour previous) et C-a n (pour next).

Résumé :

Screen intégre un dipositif d'affichage histoire de se repérer entre toutes ces fenêtres.
Vous pouvez voir les fenêtres en cours en faisant un C-a C-w ou C-a w (pour une raison inconnue, la seconde ne fonctionne pas chez moi ; le w étant pour window) et en bas elles s'afficheront. Pour connaître le numéro de votre fenêtre en cours ainsi que son titre C-a N (pour Number).
Tout bon window manager doit être capable de vous afficher l'heure n'est-ce pas ? Aucun problème : C-a t vous l'indiquera (en plus de deux trois autres infos : date host et load average par ordre d'apparition).

Personnalisation : éditer ~/.screenrc

Bon ces premiers pas fait, imaginez-vous naviguer entre sept ou huit fenetres dans votre screen. Pas très très pratique hein ? Heureusement, on va personnaliser screen histoire d'y voir un peu plus clair.
On va fermer nos screens, et on va le faire comme on ferme un terminal, en tapant simplement exit dans les deux terminaux virtuels. Quand screen sera fermé, il vous le signalera d'un ''screen is terminating''.

Nous allons donc éditer^Wcréer un fichier .screenrc à la racine de notre home :

$ gedit ~/.screenrc

ou

$ vi ~/.screenrc

Créer le avec n'importe quel éditeur de texte bien sûr, vous êtes libres. Cependant je vous conseille d'éviter OpenOffice, un peu lourd pour ça à mon goût.
Voilà celle là elle est faite :>

Je vais vous donner les éléments les plus importants à mon sens pour ce qu'on fait. À la fin du cours et si vous êtes sages _et_ que ça arrête de discuter dans le fond :p je vous donnerai mon screenrc qui fait pas loin de 200 lignes commentaires compris bien sûr, on est poilus, mais pas des ours non plus =) Pour rappel, les # signifient que la ligne est "commentée" et donc qu'elle ne sera pas prise en compte par le .screenrc

# j'aime quand ça parle
verbose on
# pour activer tout le temps le multiuser
multiuser on
# avec la sonnerie audible meme depuis les autres fenetres
bell "Bell in window %^G"
# sonnerie visuelle on
vbell on
# on enleve le copyright au lancement, ca saoule a force quand meme
startup_message off
# je veux un scrollback consequent (de 10 000 lignes)
defscrollback 10000
# Maintenant on va "decorer" screen et le rendre un peu plus utilisable ;)
caption always "%{wk}%h %=%c"
hardstatus alwayslastline "%{=b}%{G}Screen(s): %{w}%-      Lw%n%f* %t%{-}%{w}%+Lw%=%{G}Connected to %H"
activity "Activity in %t(%n)"

Sachez aussi qu'une bonne partie des options définies dans le .screenrc peuvent être émise en option lors du lancement de screen (mais ça ne sera effectif _que_ pour la session de screen que vous lancerez).

Bon les histoires de caption, hardstatus et activity sont très très personnalisable. Et c'est pas forcément facile à prendre en main comme ça. Rien que pour les histoires de couleurs et d'agencement qui ne sont pas très ergonomique au premier abord. Sachez quand dans le screenrc que je vous fournirai en fin de cours, il y a plusieurs exemples qui vous aideront à trouver, à faire ce que vous en voulez.

Attention, l'exemple ci-dessus est fait pour un terminal qui a un fond noir ? Y a-t-il des gens (à part Lutin huhu) qui ont un terminal sur fond blanc ? Je ne vais pas pouvoir m'attarder plus sur le sujet, car ça mériterai presque un cours entier à lui tout seul.
On va voir ce que ça donne ? On enregistre notre nouveau .screenrc, on ferme son éditeur et on lance screen.

Description de ce qu'on a à l'écran :

Nous allons créer une nouvelle fenêtre: C-a c ; vous voyez dans votre hardstatus qu'elle s'affiche. Observons d'un peu plus prêt : à côté de la fenêtre vous avez un * pour vous signifier où vous êtes, tandis que le - sert à vous indiquer d'où vous venez. À noter que vous verrez un ! quand il se passera quelque chose dans une fenêtre où vous n'êtes pas et qui requiert votre attention.

Créons une troisème fenêtre: C-a c. Souvenez-vous pour vous déplacer entre les fenêtres C-a p et C-a n. Vous remarquerez d'ailleurs que la première fenêtre porte le numéro 0 : oui un nerd ça commence à compter depuis 0 :]
Revenons tous donc à la fenêtre 0. C'est pas très drôle tous ces bash en bas ? ou tous ces zsh ou tsh pour ceux qui utilise un autre shell. Pour se repérer, on peut faire mieux. Et je le démontre mesdames(?), mesdemoiselles (???) et messi^Wnerds poilus.
Sous vos yeux, nous allons, oui je vous le dit comme ça me vient : renommer le nom de cette fenêtre =O
Pour ce faire faites un C-a A (un a majuscule oui vous lisez bien). Hop vous voyez apparaître un petit encart vert au-dessus de la caption qui vous invite à entrer un nom. Faites-vous plaisir et renommez donc cette fenêtre.

Mais ce n'est pas terminé et la magie continue. On a que trois fenêtres là, mais si on en avait 8 ? Vous vous voyez vous taper des C-a n et C-a p à tour de bras pour aller vite voir ce que vous réclamme votre gnu/linux chéri ? Certes non. Sautons de la fenêtre 0 à la fenêtre 2 en faisant un C-a 2.
Enfin on peut revenir simplement à la fenêtre dans laquelle nous étions juste avant (c'est à dire la 0) en faisant un C-a C-a.

Une dernière petite astuce pour naviguer entre vos fenêtres : C-a " (la touche 3 sans shift).

Bien ici, on peut dire qu'on sait se débrouiller avec screen, que ce soit commme un véritable window manager (avec les histoires de hardstatus pour avoir un feedback de screen) ou simplement comme terminal que l'on peut mettre en avant, ou laisser travailler en arrière plan.

Utilisation avancée

On va quand même essayer de faire deux trois petits trucs sympatiques et qui vont pouvoir vous être utile dans diverses situations.

Encore et toujours des raccourcis clavier...
Et oui que voulez-vous, screen est à base de clavier... Bah mangez-en c'est bon :D Donc on est dans notre screen a trois fenêtres, on va en profiter pour voir une fonctionnalité en plus. Mettez-vous dans la fenêtre 0 (C-a 0) puis faites un C-a S (pour split). Vous voyez ça "coupe" en deux votre screen, votre curseur est en haut. C'est pas forcément flagrant là mais bon. Tapez quelque chose pour bien vous situer (un 'ls' par exemple).
On va passer à l'espace inférieur en faisant un C-a <tab> (la touche tab). Ensuite on va aller depuis cette espace sur la fenêtre 1 : C-a 1. Pour revenir à la fenêtre en haut, faites : C-a <tab> ; ATTENTION: si vous faites C-a 0, ça va afficher la fenêtre aussi dans la fenêtre du bas, vous l'aurez en double. Je vous laisse imaginer les possibilités que cela va vous procurer.
Ces deux espaces sont de tailles égal, on peut y remedier passant une commande à screen, soyez attentif. On fait un C-a : (deux points) pour rentrer dans le "mode commande" (comme pour changer le nom de la fenêtre vous voyez) puis taper resize 20 par exemple où 20 est le nombre de ligne que l'on veut pour cet espace.
Si vous voulez vous débarrassez des espaces créer (sans pour autant tuer les fenêtre) faites un C-a Q. Bien sûr, cette commande ne marche _que_ si vous avez des splits ;)

Maintenant, quelques fonctionnalités de screen un peu plus dans la veine d'un window manager : les deux trois trucs (genre C-a t pour voir l'heure) ne nous servent plus ici étant donné que l'on affiche le tout grâce au caption (ou hardstatus selon les préférences).

Vous êtes dans votre tty, peinard quand soudain vous devez vous éloigner de votre ordi. Vous allez vous prendre la tête à C-a d puis fermer votre session pour être sûr que personne ne vienne bidouiller dans vos affaires ? Que neni mon bon seigneur : C-a x lockera votre screen jusqu'à votre retour. Votre mot de passe utilisateur est requis pour retrouver votre travail.

Bon on va sortir un peu de screen. En passant, remarquez qu'une fenêtre peut venir à freezer, à ne plus répondre sans raison apparente, vous pouvez la tuer avec un simple C-a k (il vous faudra confirmer).

Quoi d'autres sinon ? Je vois rien sinon quitter tout, tout de suite : C-a \ (obtenu en faisant AltGr+8). Là aussi il vous demande confirmation. Allez-y donc, fermer tout.

Myriade de screen
Si vous êtes comme moi, vous allez finir par lancer plusieurs screen en même temps. Je ne vais pas trop m'étendre sur cette partie, mais juste vous donnez deux trois informations pratiques.
Allez on relance un screen, dedans, on fais un

$ echo "screen #1"

Petit C-a d pour s'en détacher (notez le ''detached'' pour être sûr) puis on va ouvrir un nouveau screen mais cette fois-ci on va lui donner un nom :

$ screen -S "ceci est un nom"

Les " sont importantes car notre titre contient des espaces, sans ça on peut s'en passer ; et encore une fois un C-a d pour s'en détacher (et encore notez le ''detached'' tout ça :)
Examinons la situation :

$ screen -ls

On liste les screen et on retrouve comme la première fois le fait qu'on voit le premier screen avec son pid impossible à retenir ainsi que notre second screen qui porte "ceci est un nom". Remarquez que si vous faites un screen -r il va pas être très content parce qu'il ne saura pas lequel ouvrir.
Deux solutions qui sont fonction de ce que vous voulez s'offre à vous :

Comme dit en introduction, screen devient très pratique lors d'une connection à distance. Vous êtes parti de chez vous sans détacher votre screen, vous vous logguer de la fac sur votre ordi et Oh misère vous vous rendez compte de votre oubli. Pas grave, on va d'abord détaché votre screen (avec l'option -d) et le réattacher (avec l'option -r donc) ce qui nous donne un :

$ screen -d -r

Oui on aurait pu le faire en deux fois, screen -d pour détacher et screen -r pour réattacher, mais bon le nerd n'aime pas perdre son temps ;)
Bien sûr vous pouvez spécifier le screen à détacher:

$screen -d "ceci est un nom"

Le clou du spectacle : toujours dans le cadre d'une connexion ssh, vous êtes chez vous, et vous avez besoin d'aide. Vous vous débrouillez pour qu'un copain se connecte à votre ordinateur en ssh, et lui demander de faire un

$ screen -x

Et hop vous vous retrouvez tous les deux ensembles dans le même screen et chacun peut voir ce que l'autre y fait... S'unir dans l'amour au travers de screen. Mais que demande le peuple en plus ? Sinon du pain et des jeux... :>

Ah sachez que ceci ne peut marcher uniquement qu'en mode multi, mais bon comme on l'a défini plus haut à 'on' par défaut dans notre .screenrc

Et quelques tips pour votre ~/.screenrc
Je vais terminer cette partie sur quelques tips pour votre screenrc.
Par défaut, quand vous ouvrez screen, il vous créer une fenêtre qui porte le nom de l'application, bash pour la peine. Peut-être avez-vous envie que screen vous lance des applications tout seul comme un grand ?
Il suffit de rajouter ceci dans votre ~/.screenrc :

screen 0 mutt -y
screen 1 w3m www.google.fr
screen 2 ssh 192.168.3.2
screen 3 centericq
La fenêtre portera alors le nom de votre application. Attention cependant, en tuant, fermant cette fenêtre, vous arrêterez inévitablement l'application lancer au dedans.

Encore un autre petit truc qui me paraît intéressant. Les keys binding ; comprennez configuration des raccourcis clavier. Alors là aussi, vous pouvez laisser votre imagination flannée.
Les raccourcis par défaut pour commencer : je trouve le C-a k dangereux, car on a vite fait de dérapper donc :

# j'enleve le raccourci falacieux
bind k
# et j'en rajoute un autre
bind 'K' kill

Ici C-a k ne marche plus on le remplace par C-a K (qui nécessite d'avoir la touche shift pressée (oui elle a un train à prendre...).
Enfin, vous pouvez lancer des applications de la même manière :

bind 'T' screen - t Todo vim $HOME/repos/todo

Traduction: Quand je fais un C-a T, screen m'ouvre une nouvelle fenêtre portant le nom de Todo et exécutant vim (n'oubliez pas ce que l'on a vu ci-dessus, vous tuez, quittez cette fenêtre et l'application disaparaît dans sans un souffle avec elle).

Et encore un petit sympas :

bind \# colon "number "

Celui là permet de changer aisément le nombre de votre fenêtre en cours grâce à C-a #<numero>

Pour aller plus loin

Voilà donc, on a fait un grand tour de screen, mais sachez que j'ai évidemment emis de vous parler de pas mal de choses. Une de ces choses les plus importantes est la possibilité de copié/collé de screen. De nos jours, tout le monde à une souris à porter de la main, et je vous avoue, bien que farouche CLI user, la façon de procéder de screen n'est pas des plus simples à prendre en main (comparé à un surligne/clic_milieu) (même en tty, grâce à gpm).
Pour ce qui est des options que l'on passe à screen quand on le lance, sauf celle que je vous ai donné, je n'en utilise aucune, et je m'en sort très bien, mais libre à vous d'aller voir si quelques unes ne pourrait pas éveiller votre intérêt.
Screen permet aussi de logguer dans un fichier tout ce qui se passe en son sein. Je n'ai jamais utiliser cette possibilité.
Enfin, je vous laisse consulter le manuel de screen afin de connaître toutes les subtilités du ~/.screenrc ; il y a énormément de possibilités, et beaucoup d'entre elles, pour une utilisation de screen optimale mériterait votre attention :)

Mes sources pour ce cours :

$ man screen
$ lynx http://www.gnu.org/software/screen/
$ lynx http://fr.wikipedia.org/wiki/GNU_Screen

Remerciements :

Merci à gapz d'avoir exacerbé mon goût pour CLI et de m'avoir montré screen.
Merci aux fondateurs de la classroom et à ceux qui y ont contribués sans qui ce channel et ces sessions n'existeraient pas.
Merci à tous les habitués d'#ubuntu-fr-classroom qui la font vivre par leurs expériences et leurs présences.
Merci à vous qui suivez les sessions, car sans vous non plus classroom n'aurait pas de sens ; et qui avez suivi ce cours, j'espère qu'il vous a plu.
Encore merci à vous tous :)