====== Console virtuelle, le message issue ======
* Objet : Message de présentation, affiché à l'invite d'une connexion, à une console virtuelle en mode texte.
* Niveau requis : {{tag>débutant}}
* Pour aller vers : {{tag>avisé}}
* Commentaires : Personnalisation du fichier ''/etc/issue''.
* Débutant, à savoir : [[:doc:systeme:commandes:le_debianiste_qui_papillonne|Utiliser GNU/Linux en ligne de commande, tout commence là !.]] :-)
* Suivi : {{tag>à-placer}}
* Création par [[user>agp91]] 10/06/2024
* Testé par <...> le <...> FIXME
* Commentaires sur le forum : [[https://debian-facile.org/viewtopic.php?id=34943| Lien vers le forum concernant ce tuto]] ((N'hésitez pas à y faire part de vos remarques, succès, améliorations ou échecs !))
**Nota :**
Contributeurs, les FIXME sont là pour vous aider, supprimez-les une fois le problème corrigé ou le champ rempli !
===== Introduction =====
Ce tuto propose de personnaliser le message de présentation affiché, lors d'une demande de connexion, en mode texte, à une [[doc:systeme:console|console (virtuelle)]].
Ce tuto peut-être réalisé depuis l'interface texte d'une console. Ou depuis une session graphique, avec un terminal fenêtre.\\
**__Remarque__ :** Le réaliser depuis un terminal fenêtre, offrant le copier/coller, est plus pratique.
===== Présentation =====
La commande ''agetty'' parfois nommée ''getty'' ((La commande ''agetty'' est l'alternative GNU/Linux de la commande ''getty''.)) établie la communication avec une console (virtuelle) pour que nous pussions communiquer avec le système directement en mode texte (sans passer par une interface graphique).
Une fois la communication établie avec la console, ''agetty'' affiche le contenu du fichier ''/etc/issue''.\\
Puis propose son invite à la saisie d'un nom d'utilisateur.\\
''Agetty'' est la première étape de l'ouverture d'une session en mode texte.\\
Son processus est suspendu tant que nous ne saisissons pas un nom d'utilisateur.
Lorsque qu'un nom est renseigné,\\
Le programme ''agetty'' est remplacé par le programme **login**, qui contrôle le mot passe saisi.\\
Si le mot de passe est correcte, la session est ouverte... Et l'interpréteur de commande (souvent ''bash'') est démarré.\\
La console (qui est un terminal((Un **terminal** est un appareil ou son émulation logicielle, qui permet de communiquer avec un système informatique. Il dispose généralement au moins, d'une entrée pour envoyer des informations au système (par exemple un clavier). Et d'une sortie, pour que le système puisse aussi nous informer (par exemple un écran).))) nous permet alors de communiquer interactivement avec l'interpréteur (le shell).
Le fichier ''/etc/issue'' peut être utilisé pour personnaliser l'affichage d'une demande de connexion.
Dans le fichier ''/etc/issue'', le programme ''agetty'' reconnaît des __codes d’échappements__ (voir plus bas), qu'il substituera par des informations ou par des __séquences d’échappement__ couleur.\\
===== Le fichier issue =====
Commençons par afficher le contenu du fichier ''/etc/issue''.\\
**__Note__ :** Celui montré ici, provient d'un système Debian GNU/Linux 12 (Bookworm) :
cat /etc/issue
Debian GNU/Linux 12 \n \l
Il contient du texte : ''Debian GNU/Linux 12''.\\
Et deux __codes d'échappements__ :
* ''\n'', qui insère le nom de l'hôte (définit dans le fichier ''/etc/hostname'').
* Et ''\l'', qui insère le nom du périphérique de la console utilisée.
Pour voir le rendu, nous demandons l'affichage de la 3em console virtuelle avec la combinaison C-A-F3
{{ /file-R8a46edec955f288570ef7031b67f7a7c.png | }}
Pour revenir à l'interface graphique :
* KDE : A-F1
* Gnome : A-F2
* Cinnamon, Mate, LXDE, LXQT ou Xfce : A-F7
==== Les codes d’échappement ====
Les __codes d’échappement__ débutent par le caractère ''\'' (contre-oblique).\\
Sont actuellement reconnus (chez Debian GNU/Linux) les codes suivants :
^ Codes d'échappement d'agetty ||
^ Codes ^ Descriptions |
| \4{__interface__}\\ \4|Insère l’adresse IPv4 de l’__interface__ réseau.\\ Si __interface__ n’est pas indiquée, insère la première interface fonctionnelle qui n'est pas la boucle locale.\\ Si aucune interface n’est trouvée, insère l’adresse IP de l'hôte (recherchée dans ''/etc/hosts'').|
| \6{__interface__}\\ \6 |Insère l’adresse IPv6 de l’__interface__ réseau.\\ Si __interface__ n’est pas indiquée, insère la première interface fonctionnelle qui n'est pas la boucle locale.\\ Si aucune interface n’est trouvée, insère l’adresse IP de l'hôte (recherchée dans ''/etc/hosts'')|
| \b | Insère la vitesse en baud de la console virtuelle. |
| \d | Insère la date actuelle. |
| \e{__nom__}\\ \e | Insère la séquence d’échappement de la couleur d'écriture, correspondante à __nom__.\\ Avec pour __nom__ : ''black'', ''blink'', ''blue'', ''bold'', ''brown'', ''cyan'', ''darkgray'', ''gray'', ''green'', ''halfbright'', ''lightblue'', ''lightcyan'', ''lightgray'', ''lightgreen'', ''lightmagenta'', ''lightred'', ''magenta'', ''red'', ''reset'', ''reverse'', ''yellow'' et ''white''.\\ Si __non__ n'est pas indiqué, ''\033'' est inséré.\\ Si __nom__ est inconnu le code d'échappement est ignoré.\\ ''reset'', permet de revenir à la couleur par défaut. |
| \s | Insère l'équivalent retourné par la commande **uname -s** (nom du noyau). |
| \S{__variable__}\\ \S | Insère la valeur de __variable__ déclarée dans le fichier ''/etc/os-release''.\\ Si le fichier n’existe pas, ''/usr/lib/os-release'' est utilisé.\\ Si __variable__ n’est pas indiqué, c'est la variable PRETTY_NAME du fichier qui est utilisée.\\ Si aucun des fichiers n'existent, le code \s est utilisé. |
| \l | Insère le nom du périphérique de la console utilisée (ttyN; N étant le numéro de la console). |
| \n | Insère l'équivalent du retour de la commande **uname -n** (nom de l'hôte). |
| \o | Insère l'équivalent du retour de la commande **domainname** (nom de domaine NIS/YP). |
| \O | Insère l'équivalent du retour de la commande **hostname -d** (nom de domaine DNS). |
| \r | Insère l'équivalent du retour de la commande **uname -r** (révision du noyau). |
| \t | Insère l'heure actuelle (hh:mm:ss). |
| \u | Insère le nombre d'utilisateur connecté. |
| \U | Insère la chaîne ''1 utilisateur'' ou ''N utilisateurs'' (''N'' est le nombre d'utilisateur connecté). |
| \v | Insère l'équivalent du retour de la commande **uname -v** (la version du noyau). |
Source : [[https://fr.manpages.org/agetty/8|Manuel (fr) agetty (4) : getty alternatif pour Linux (manpages.org)]]
==== Les séquences d'échappement ====
Le fichier ''/etc/issue'' est affiché dans les consoles virtuelles.\\
Il peut donc aussi contenir, directement des __séquences d'échappement__, reconnues par la console Linux.
Voir [[https://fr.manpages.org/console_codes/4|Manuel (fr) console_codes (4) : Séquence de contrôle des consoles (manpage.org)]].
===== Personnalisation =====
Commençons par regarder les détails du fichier ''/etc/issue''.
ls -l /etc/issue
-rw-r--r-- 1 root root 27 9 juin 03:29 /etc/issue
Il appartient à ''root'',\\
Qui seul a le pouvoir d'écrire dedans.\\
Pour modifier son contenu, nous devons donc le faire sous son autorité.\\
Soit en étant nous même ''root'' (via la commande ''su'').\\
Soit en utilisant la commande ''sudo''.
Durant la confection d'un fichier ''issue'',\\
Il n'est pas nécessaire de modifier l'original (''/etc/issue'').\\
Nous pouvons utiliser l'option ''-f '' de la commande ''agetty'', pour indiquer un chemin différent.
Afin de ne pas compliquer le tuto avec une histoire de chemin,\\
Nous créons notre fichier ''mon_issue'' dans le répertoire ''/tmp''.
Copions l’intégralité ci-dessous dans le terminal fenêtre, puis appuyons sur Entrée.
echo '\e{gray} \S{NAME} \S{VERSION_ID} \S{VERSION_CODENAME}\e{reset}
\e{darkgray} .--. \e{reset}
\e{darkgray} |o_o | \e{reset} \e{yellow}Bonjour\e{reset}
\e{darkgray} |:_/ | \e{reset} \e{yellow}Bienvenu\e{reset}
\e{darkgray} // \\\\\ \e{reset}
\e{darkgray} (| |) \e{reset} \e{gray}Sur la console \l \e{reset}
\e{darkgray} / \\\_ _/ \\\ \e{reset}
\e{darkgray} \\\___)=(___/ \e{reset} \e{gray}De \e{lightgreen}\n\e{reset}
\e{gray} Nous sommes au \e{lightred}\4\e{reset}
' >/tmp/mon_issue
Dans un fichier ''issue'', le caractère ''\'' est spécial, il annonce un code d’échappement.\\
\\
Pour qu'il soit considéré comme simple caractère, il doit être noté ainsi : ''\\\'' (3).\\
Pour en afficher 2 à la suite, ils doivent être notés ainsi : ''\\\\\'' (5).\\
Pour en afficher 3 à la suite, ils doivent être notés ainsi : ''\\\\\\'' (6).\\
Pour en afficher 4 à la suite, ils doivent être notés ainsi : ''\\\\\\\\\'' (6+3).\\
...
Puis demandons son affichage :
La commande ''agetty'' est une commande système.\\
Elle se trouve dans le répertoire ''/usr/sbin''.\\
Par défaut, ce chemin est inconnu pour un simple utilisateur (il n'est pas indiqué dans son PATH).\\
C'est pourquoi, pour exécuter ''agetty'', nous devons saisir son chemin complet.
/usr/sbin/agetty --show-issue -f /tmp/mon_issue
{{ /file-Rae6adf34042b5cc83c2beb6fb90fd45e.png?nolink | }}
**__Remarque__ :**\\
Nous travaillons depuis un terminal fenêtre.\\
Le __code d'échappement__ ''\l'' ne peut pas retourner correctement le nom de la console utilisée.\\
(Puisque nous sommes dans un terminal fenêtre.)
----
... Quand le rendu nous convient, nous pouvons remplacer l'original.\\
Mais avant nous devons le sauvegarder.
cp -v /etc/issue /etc/issue.s00
'/etc/issue' -> '/etc/issue.s00'
Voila qui est bien fait :-P
Puis écrasons le :
cp -v /tmp/mon_issue /etc/issue
'/tmp/mon_issue' -> '/etc/issue'
Pour observer le résultat,\\
Il suffit de visiter une console qui ne dispose pas encore du processus ''agetty'',\\
Par exemple la 4em console avec la combinaison C-A-F4.
{{ /file-R5ffdf862bca0898bcd26bd8a436baa0e.png | }}
**__Remarque__ :**\\
Nous sommes ici dans une console, le __code d'échappement__ ''\l'' a correctement retourné le nom de la console.
===== Conclusions ====
Voila nous pouvons maintenant personnaliser à notre convenance l'invite de connexion à une session en mode texte. 8-)
Le fichier ''/etc/issue'' peut être complémenté par d'autres fichiers disposant de l'extension ''.issue'', placés dans le répertoire ''/etc/issue.d'' (à créer).\\
Si le fichier ''/etc/issue'' n'existe pas, ces fichiers sont ignorés.\\
Voir : [[https://fr.manpages.org/agetty/8|Manuel (fr) agetty (4) : getty alternatif pour Linux (manpages.org)]] (section FICHIERS ISSUES).
Si les codes d'échappement ne suffisent pas (par exemple pour modifier la couleur du fond), les __séquences d'échappement__ de la console peuvent être utilisées.\\
Voir [[https://fr.manpages.org/console_codes/4|Manuel (fr) console_codes (4) : Séquence de contrôle des consoles (manpage.org)]]
Il n'est pas forcément évident (du moins tant que nous ne savons pas faire) d'écrire une séquence d'échappement dans un fichier.\\
Cela provient du besoin d'écrire textuellement le caractère d’échappement (ESC), dont le caractère textuel n'existe pas.\\
Pour ce faire, voir le wiki : [[atelier:chantier:ecrire-le-caractere-d-echappement-esc|Ecrire le caractère d'échappement ESC]].
==== Retour à l'état initial ====
Pour retrouver l'issue d'origine :
cp -v /etc/issue.s00 /etc/issue
'/etc/issue.s00' -> '/etc/issue'
Le fichier ''mon_issue'' à été créé dans le répertoire ''/tmp''.\\
S'il n'est pas copier ailleurs, il sera supprimé à l'arrêt du système.