mercredi 28 novembre 2007 001804 1196205430 by H. (illovae) Seldon.
Plan
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 :)
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).
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.
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 :
$ screen -r "ceci est un
nom" vous rendra la main.$
screen -RR Ce qui signifie 'reattacher et utiliser la première session pour
cela' (oui votre dernière session créer, qui s'affiche en premier dans la
liste... Tout le monde suit ? :> )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
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>
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_ScreenRemerciements :
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 :)