MaDoVi - Le wiki

Machines - Données - Virtualisation

Outils pour utilisateurs

Outils du site


services:autres:tuto_perso1

Personnalisation du Terminal

On va proposer ici de s'amuser à faire du «look». Ca ne sert strictement à rien (même si en même temps les informations qu'on affiche peuvent être intéressantes): la console d'un terminal Linux est un peu fadasse, on va tenter d’égayer…

1. Le «prompt»

Le «prompt» est une information affichée après qu'un utilisateur se soit connecté sur une machine.
Sur la plupart des systèmes Linux ça se présente comme ceci:

toto@mamachine:~/mesdocuments$
  • <toto> est le nom du compte de l'utilisateur
  • <mamachine> est le nom de la machine (contenu dans /etc/hostname)
  • ~ est le symbole qui dit: «le répertoire personnel - ou répertoire 'home'» de l'utilisateur courant
  • ~/mesdocuments indique donc dans quel répertoire est actuellement toto dans sa navigation: ici, dossier mesdocuments de son 'home'
  • $ c'est le niveau de droits; le compte root aura #

Le fichier qui permet de piloter la «tête du prompt» est propre à chaque utilisateur: il s'agit d'un script / fichier caché .bashrc situé dans le répertoire 'home' de l’utilisateur concerné.
C'est vrai pour les utilisateurs dont le shell est bash, c'est par défaut, on s'occupe pas des autres shell ici.

On va changer ici les prompts de deux utilisateurs: un compte admin et le compte root sur le serveur wasabi.

1.1. Compte «banalisé»

On se connecte sur la machine appelée wasabi avec le compte admin. Ca peut être un login local ou distant via ssh.

  • Éditon du fichier ~/.bashrc:
    $ nano .bashrc
  • Positionnez-vous en fin de fichier et ajouter la ligne suivante:
    ## Ajout ssaa.mm.jj - Gestion du prompt / couleurs
    PS1='${debian_chroot:+($debian_chroot)}\[\033[1;32m\]\u@\h\[\033[00m\] - \[\033[2;36m\][\d - \t]\[\033[00m\]\n\[\033[2m\]Chemin courant:\[\033[00m\] \[\033[01;34m\]\w\[\033[00m\]\n\$ '
  • Recharger ce script ainsi modifié:
    $ source .bashrc
  • Le prompt change immédiatement:
    admin@wasabi - [dim. nov. 03 - 18:38:19]
    Chemin courant: ~
    $ cd /mnt/raid_data/
    admin@wasabi - [lun. nov. 03 - 18:39:02]
    /mnt/raid_data
    $ 

    Bon, là on voit pas les couleurs mais vert pour user@machine, un bleu clair pour la date et un bleu foncé pour le répertoire courant (cf. copie d’écran plus bas).

Un peu d'explications:

  • Variables prédéfinies:
    • \u: login de l’utilisateur
    • \h: nom de la machine
    • \w: répertoire courant
    • \$: si root # sinon $
  • Codes couleurs: voir ce lien ou plus bas un petit script d'affichage.

1.2. Compte 'root'

On fait la même chose pour le compte root, en mettant de l' «emphase»: s'agit de savoir où on est et pas faire de conn…

On bascule sur le compte root (depuis un compte avec droits sudo par exemple):

$ sudo -i
root@wasabi - [lun. nov. 04 - 00:46:42]
~
# 

On la déjà mis en place ici: pour le faire on a modifié de la même façon le fichier /root/.bashrc en ajoutant:

## Ajout ssaa.mm.jj - Gestion du prompt / couleurs
PS1='${debian_chroot:+($debian_chroot)}\[\033[101;30m\]\u@\h\[\033[00m\] - \[\033[2;36m\][\d - \t]\[\033[00m\]\n\[\033[2m\]Chemin courant:\[\033[00m\] \[\033[01;34m\]\w\[\033[00m\]\n\$ '

On a juste mis du noir sur fond rouge pour le login, histoire de bien voir qu'on est root.

1.3. Un script

Le bout de script ci-dessous vous affichera ce qu'il est possible de faire:

couleur_console.sh
#!/bin/bash
 
#man 4 console_codes
 
echo "### Colorisation ###"
for bg in {40..47} {100..107} 49 ; do
  for fg in {30..37} {90..97} 39 ; do
    echo -ne "\\e[${bg};${fg}m ${bg};${fg}\\e[${bg};${fg}m\\e[0m\\c"
  done
  echo ""
done
 
echo ""
echo "### Formattage ###"
echo ""
echo -e "\\e[0mNormal"
echo -e "\\e[1mGras\\e[0m"
echo -e "\\e[2mFaible\\e[0m"
echo -e "\\e[4mSouligné\\e[0m"
echo -e "\\e[5mClignotant\\e[0m"
echo -e "\\e[7mCouleurs inversées\\e[0m"
echo -e "\\e[8mMasqué\\e[0m"
 
exit 0

Ceci donne des choses comme:

☛ Le script:

☛ La console:

Et là, j'va m'coucher…


2. Bannière «ssh»

Vous avez plein de machines, ou bien vous avez construit une foultitude de containers: chacun est accessible via le protocole ssh.
Allez, trois PCs nommés… PC1, PC2 et PC3; 5 Raspberry avec des noms parlants comme RPi_1 à RPi_5; une bonne dizaine de containers sur votre serveur: CT1, CT2….

Bref, évidemment vous ne savez plus quelle machine fait quoi… :-/

Ce qui est indiqué ci-dessous s'applique a priori sur toutes les machines qui hébergent un serveur OpenSSH.

2.1. Configuration «Banner»

Il existe un fichier de configuration du démon ssh server:

$ sudo nano /etc/ssh/sshd_config
[sudo] Mot de passe de admin : 
...
#VersionAddendum none
 
# no default banner path
#Banner none
 
# Allow client to pass locale environment variables
AcceptEnv LANG LC_*
....

Vers la ligne ~ 105/107, il existe une balise Banner commentée. L'idée est d'enlever le commentaire et d'ajouter un fichier texte qui contiendra le texte qu'on souhaite afficher à la connexion, avant même la saisie du mot de passe. Par exemple, remplacer la ligne avec:

Banner /etc/ssh/hello.msg

Vous rechargez la configuration du serveur ssh, pour prise en compte:

$ sudo service ssh reload

2.2. Alimentation «Banner»

Vous pourriez définir le contenu de ce fichier avec:

$ sudo nano /etc/ssh/hello.msg
Machine RPI_5: Héberge Pi-Hole
Veuillez vous identifier ou passer votre chemin...

Ainsi, lorsque vous souhaitez vous connecter, vous avez votre message d'information:

ssh toto@rpi_5
Machine RPI_5: Héberge Pi-Hole
Veuillez vous identifier ou passer votre chemin...
toto@rpi_5's password: 

Et si vous vous êtes gouré, un simple Ctrl+c et on passe à une autre machine…;-)

Vous pouvez «agrémenter» un peu… mais dans la limite de la sécurité ! En effet, les caractères de contrôle, comme pour les couleurs vues plus haut par exemple, ne sont pas acceptés: un code «malin» là-dedans, et hop, c'est la cata !

On peut quand-même faire des trucs un peu sympa…

$ ssh toto@rpi_5
 ____  _     _   _       _      
|  _ \(_)   | | | | ___ | | ___ 
| |_) | |___| |_| |/ _ \| |/ _ \
|  __/| |___|  _  | (_) | |  __/
|_|   |_|   |_| |_|\___/|_|\___|
 
Veuillez vous identifier ou passer votre chemin...
toto@rpi_5's password: 

2.3. Quelques outils

Bref, de quoi faire des choses pour agrémenter vos bannières, qui sont des fichiers texte / ASCII.


3. Le «mot du jour» (au login)

«motd» qu'on dit: message of the day !
Il s'agit d'un message qui est affiché sur la console, après la connexion à la machine d'un utilisateur (en direct ou via ssh).

  • Sur une distribution Debian par exemple, ce message pourrait être:
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
  • Sur nos serveurs VHS actuels sous Ubuntu, on a plus d'informations avec quelque chose comme:
Welcome to Ubuntu 14.04.2 LTS (GNU/Linux 3.16.0-31-generic x86_64)

* Documentation:  https://help.ubuntu.com/

  System information as of Sun Aug 18 10:29:01 CEST 2019

  System load:  1.02              Users logged in:       0
  Usage of /:   66.6% of 4.46GB   IP address for lxcbr0: 10.0.3.1
  Memory usage: 40%               IP address for br0:    192.168.0.123
  Swap usage:   0%                IP address for virbr0: 192.168.122.1
  Processes:    179

  Graph this data and manage this system at:
    https://landscape.canonical.com/

New release '16.04.6 LTS' available.
Run 'do-release-upgrade' to upgrade to it.

The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.

On va ici se faire le notre… sous Debian…un peu dédié à quand même…

Sous Debian donc, le message original affiché est le contenu du fichier /etc/motd. On va ne plus l'afficher ; pour cela, on le renomme, pour le garder quand même:

# mv /etc/motd /etc/motd.original

Sous Debian toujours, pour personnaliser le message, il existe un répertoire /etc/update-motd.d/ dans lequel sont définis des programmes ou scripts qui seront exécuter dans l'ordre alphabétique de leur nom. Par défaut il existe un fichier 10-uname qu'on va «virer» aussi: on va se contenter de faire en sorte qu'il ne soit plus exécutable:

# chmod -x /etc/update-motd.d/10-uname 

Finalement, on dépose dans ce dossier /etc/update-motd.d/ notre propre script 50-visto dont le contenu est le suivant:

/etc/update-motd.d/50-visto
#!/bin/bash
# --------------------------------------------------------------------------- #
# Définitions des variables
# --------------------------------------------------------------------------- #
# System Params
load=`cat /proc/loadavg | awk '{ printf("%5.2f - %5.2f - %5.2f", $1,$2,$3) }'`
memory_pourcent=`free -m | awk '/Mem/ { printf("%5.2f", $3/$2*100) }'`
memory_total=`free --giga | awk '/Mem/ { printf("%s", $2) }'`
memory_usage=`printf "%s%% occupés sur %sG" "$memory_pourcent" "$memory_total"`
swap_usage=`free -m | awk '/Swap/ { printf("%5.2f%%", $3/$2*100) }'`
nbprocess=`ps ax | wc -l | tr -d " "`
nbprocess=`printf "%5d" "$nbprocess"`
 
## uptime: The current time, how long the system has been running, how many users are currently logged on,
#  and the system load averages for the past 1, 5, and 15 minutes.
# ==> L'heure actuelle, la durée d'utilisation du système, le nombre d'utilisateurs actuellement connectés 
#  et la charge moyenne du système pour les 1, 5 et 15 dernières minutes.
upSeconds="$(cut -d. -f1 /proc/uptime)"
secs=$((${upSeconds}%60))
mins=$((${upSeconds}/60%60))
hours=$((${upSeconds}/3600%24))
days=$((${upSeconds}/86400))
UPTIME=`printf "%d jours, %02dh%02dm" "$days" "$hours" "$mins"`
 
## Espaces disques
#--output source,fstype,itotal,iused,iavail,ipcent,size,used,avail,pcent,file,target
mount_os=`df -H --output=fstype,size,pcent,target / | sed '1d'`
mount_virtu=`df -H --output=fstype,size,pcent,target /mnt/env-lxc | sed '1d'`
mount_raid=`df -H --output=fstype,size,pcent,target /mnt/raid_data | sed '1d'`
 
## réseau: @ip connues
ip_list=$(ip addr | grep 'inet ' | awk '{ printf("%-12s %s\n", $NF,$2) }' | grep -v 'lo')
IFS=$'\n'; arrIP=($ip_list); unset IFS;
 
echo -ne "
\\e[40;91m          \`                 \`\`   \\e[0m\\e[49;92mMachine     \\e[2m\\e[49;92m `uname -n` \\e[0m
\\e[40;91m      \`.\`  \`.+\`          ./os:   \\e[0m\\e[49;92m\\e[2mSystème     \\e[49;92m `cat /etc/issue.net` \\e[0m
\\e[40;91m    \`:\`  .\`\` -+       \`-oso-     \\e[0m\\e[49;92m\\e[2mNoyau       \\e[49;92m `uname -r` \\e[0m
\\e[40;91m    :-  \`\`   \`+     \`:ooo-       \\e[0m\\e[49;93mCharge     \\e[2m\\e[49;93m $load (1, 5, 15 min)\\e[0m
\\e[40;91m    \`/   :-.--    \`/ooo-         \\e[0m\\e[49;93m\\e[2mMémoire     \\e[49;93m$memory_usage \\e[0m
\\e[40;91m     -+.        \`/soo:\`          \\e[0m\\e[49;93m\\e[2mSwap        \\e[49;93m$swap_usage\\e[0m
\\e[40;91m      \`/:.    \`/sss+.            \\e[0m\\e[49;93m\\e[2mProcessus   \\e[49;93m$nbprocess\\e[0m
\\e[40;91m   \`\`\`   \`.  -syys:              \\e[0m\\e[40;95mDisques     \\e[2m Type Taille Occ.  Monté sur \\e[0m
\\e[40;91m :oyhy+    \`oyyyo.               \\e[0m\\e[40;95m\\e[2mOS           \\e[40;95m$mount_os \\e[0m
\\e[40;91m\`/yhhhho\` -yyyy/                 \\e[0m\\e[40;95m\\e[2mVirtu.       \\e[40;95m$mount_virtu \\e[0m
\\e[40;91m  \`+hhhho+yyyy:\\e[0m\\e[2m_                 \\e[0m\\e[40;95m\\e[2mRAID         \\e[40;95m$mount_raid \\e[0m
\\e[40;91m    /hhhhhhhy.\\e[0m\\e[2m(_)___| |_ ___     \\e[0m\\e[49;96mRéseau     \\e[0m
\\e[40;91m     +hhhhhy. \\e[0m\\e[2m| / __| __/ _ \    \\e[0m\\e[49;96m\\e[2m${arrIP[0]}\\e[0m
\\e[40;91m      ohhs/\`  \\e[0m\\e[2m| \__ \ || (_) |   \\e[0m\\e[49;96m\\e[2m${arrIP[1]}\\e[0m
\\e[40;91m      \`/.     \\e[0m\\e[2m|_|___/\__\___/    \\e[0m\\e[49;96m\\e[2m${arrIP[2]}\\e[0m
 
                                 => En ligne depuis: $UPTIME\\e[0m 
\n"
 
exit 0

Le plus «pénible» à lire – et à faire – est l'affichage avec la commande finale echo -ne “…. Mais une fois qu'on a fait abstraction des codes de couleurs et de caractères en \\e[, on se contente en fait d'afficher des variables, résultats des commandes systèmes qui permettent de récupérer les informations souhaitées.

En fait ce qui rend les choses peu lisibles, c'est bien sûr l'affichage du logo.

Pour cet exemple:

  • on donne ce fichier image: «à manger» à l'outil https://www.text-image.com/convert/ascii.html de conversion d'image cité plus haut;
  • on utilise l'autre outil http://www.network-science.de/ascii/ pour ajouter le texte “isto”
  • et on adopte un bon éditeur de texte gérant le mode colonne (Sublime Text pour tout dire)
  • on fera attention aux caractères de l'image ASCII qui ont du sens pour bash et qu'il faudra «protéger» avec \: par exemple ` deviendra \`
  • quand c'est codé, on rend le fichier exécutable:
    $ sudo chmod +x /etc/update-motd.d/50-visto

woula, woula… Mais attention avec ce genre de jouet: on a tendance à rapidement faire des choses un peu lourdes et éventuellement peu lisibles et/ou trop «flashy» 8-o (c'est peut-être un peu le cas ici d'ailleurs !):

Tadam !

Pétard, i glande ce serveur…

services/autres/tuto_perso1.txt · Dernière modification: 06/11/2019 20:09 de Cram28