Optimiser votre environnement de travail sous Linux

Quelques conseils pour optimiser votre environnement de travail sous Linux


Dans cet article, je vais partager quelques conseils pour optimiser votre environnement de travail sous Linux. Tout ce que nous allons aborder ici représente des éléments que j'ai personnellement mis en place et que j'utilise quotidiennement. Nous explorerons la configuration de plusieurs accès SSH, la personnalisation de notre Interface de Ligne de Commande CLI avec bash, et comment abandonner l'utilisation de zsh et Oh My Zsh.

Configuration de plusieurs accès SSH dans votre environnement Linux

Pour ce premier conseil, nous allons nous intéresser à SSH. Il vous est peut-être déjà arrivé d'avoir plusieurs accès SSH avec des informations de connexion différentes telles que l'adresse du serveur, l'utilisateur, les clés privées et publiques, etc. Et vous avez probablement utilisé SSH en spécifiant toutes les informations de connexion, comme dans l'exemple ci-dessous :

ssh -i path-to-ssh-public-key user@host:port

Si vous avez plusieurs accès à différents serveurs SSH, vous devez probablement faire quelque chose de similaire à ceci :

ssh -i path-to-ssh-public-key-server-1 user-server-1@host-server-1:port-server-1 ssh -i path-to-ssh-public-key-server-2 user-server-2@host-server-2:port-server-2 ssh -i path-to-ssh-public-key-server-3 user-server-3@host-server-3:port-server-3

Si vous êtes un peu paresseux, vous avez peut-être configuré des aliases. C'est bien, mais non optimal ! Nous allons voir comment configurer notre client SSH de manière à simplifier tout cela. Allez, c'est parti !

Tout d'abord, vous allez créer le fichier .ssh/config avec les permissions suivantes : 0600 ou, si vous préférez, - rw- --- ---. Ensuite, vous allez l'éditer avec votre éditeur préféré : vim. 😉

Dans ce fichier, nous allons ajouter des blocs de configuration ssh comme suit :

Host <<nom-super-nom-d-host>> Property value Property value

Vous voyez, ce n'est pas compliqué du tout ! Prenons un exemple plus concret avec un compte Gitlab auto-hébergé, un compte Gitlab, un compte Github, et deux accès à un serveur virtuel :

Host my-private-gitlab.com PreferredAuthentications publickey User git HostName my-private-gitlab.com IdentityFile ~/.ssh/id_my-private-gitlab.com Host github User git HostName github.com IdentityFile ~/.ssh/id_github.com Host gitlab PreferredAuthentications publickey User git HostName gitlab.com IdentityFile ~/.ssh/id_gitlab.com Host my-private-server-1 User root HostName my-private-server-1.com IdentityFile ~/.ssh/id_my-private-server.com Host my-private-server-2 User root HostName my-private-server-2.com IdentityFile ~/.ssh/id_my-private-server.com

Ici, pour chaque bloc de configuration, nous définissons les propriétés Host, User, HostName, IdentityFile et, dans le cas de Gitlab, PreferredAuthentications.

Et voilà ! Si nous testons la connexion avec Github et Gitlab, cela donne ceci :

# Test de connexion github $ ssh -i ~/.ssh/id_github.com -T git@github.com Hi nicolas-grevin! You've successfully authenticated, but GitHub does not provide shell access. $ ssh -T github Hi nicolas-grevin! You've successfully authenticated, but GitHub does not provide shell access. # Test de connexion gitlab $ ssh -i ~/.ssh/id_gitlab.com -T git@gitlab.com Welcome to GitLab, @ngrevin! $ ssh -T gitlab Welcome to GitLab, @ngrevin!

Tout fonctionne bien, et on peut voir que la propriété Host agit comme un "alias" SSH permettant d'utiliser une configuration spécifique. Donc, cette commande ssh -i ~/.ssh/id_gitlab.com -T git@gitlab.com revient à faire ssh gitlab.com.

Je conseille quand même de mettre l'alias que vous souhaitez, mais aussi l'adresse de l'hôte entier pour éviter tout problème de connexion avec des programmes tiers. Surtout que la propriété accepte plusieurs valeurs.

Pour aller encore plus loin, vous pouvez avoir des configurations partagées en découpant les blocs de configuration. Voici un exemple :

Host my-private-gitlab github gitlab my-private-gitlab.com github.com gitlab.com User git Host my-private-gitlab gitlab my-private-gitlab.com gitlab.com PreferredAuthentications publickey Host my-private-gitlab my-private-gitlab.com HostName my-private-gitlab.com IdentityFile ~/.ssh/id_my-private-gitlab.com Host github github.com HostName github.com IdentityFile ~/.ssh/id_github.com Host gitlab gitlab.com HostName gitlab.com IdentityFile ~/.ssh/id_gitlab.com* Host my-private-server-1 my-private-server-2 my-private-server-1.com my-private-server-2.com User root IdentityFile ~/.ssh/id_my-private-server.com Host my-private-server-1 my-private-server-1.com HostName my-private-server-1.com Host my-private-server-2 my-private-server-2.com HostName my-private-server-2.com

Cela évite de répéter les propriétés dans chaque bloc tout en laissant la possibilité d'en réécrire une. Et voilà, maintenant vous savez comment configurer votre client SSH. Si vous souhaitez aller plus loin, voici la documentation complète de ssh_config : man openBSD ssh_config.

Configurer son CLI

Avant d'entrer dans le vif du sujet, clarifions certaines définitions.

Un terminal est un appareil physique situé à l'extrémité d'un réseau informatique (téléphone, ordinateur). Un émulateur de terminal est le logiciel qui nous permet d'exécuter des lignes de commande pour interagir avec le système d'exploitation. Par souci de simplicité, on l'appelle couramment un terminal. Un shell est le logiciel qui fournit l'interface utilisateur du système d'exploitation. Littéralement, c'est la coquille (shell) du noyau (kernel) Linux. On le trouve sous deux formes :

  • le CLI (Command Line Interface) qui est une interface en ligne de commande.
  • le GUI (Graphical User Interface) qui est une interface graphique.

Donc, pour schématiser tout ça, on a le terminal qui contient le kernel Linux. Le kernel fournit un shell pour communiquer avec lui. Le shell peut être soit une interface graphique GUI soit une interface en ligne de commande CLI. Et l'émulateur de terminal est un logiciel graphique qui permet d'exécuter des lignes de commande.

flowchart LR
    subgraph Terminal
			subgraph Kernel
		    subgraph Shell
					GUI
					CLI
				end
			end
    end

		et[Émulateur de terminal]

		GUI --> et
		et --> CLI

Voilà le petit dépoussiérage fait. Bon pour l'émulateur de terminal, nous utiliserons la forme simple et courante qui est terminal. Maintenant, passons au vif du sujet : la configuration de son CLI avec bash. Nous allons découvrir les fichiers de configuration ainsi que des bonnes pratiques pour ne pas perdre votre configuration.

Sur les systèmes Linux, il y a deux fichiers à connaître : ~/.profile (ou ~/.bash_profile) et ~/.bashrc. Et voici à quoi ils servent. Le fichier ~/.profile (ou ~/.bash_profile selon les distributions Linux) est exécuté lors de l'ouverture d'un login-shell. Ce qui signifie que ce fichier est exécuté uniquement lors de l'ouverture d'un shell par un utilisateur connecté. Le fichier ~/.bashrc est exécuté lors de l'ouverture d'un non-login shell, contrairement au fichier ~/.profile. Il est utilisé pour les utilisateurs non connectés.

Lorsque vous démarrez un terminal, le fichier ~/.profile est chargé. Et dans le fichier ~/.profile, vous trouvez les lignes suivantes qui indiquent que le fichier .bashrc est chargé s'il est trouvé. Voici ces quelques lignes :

if [ -n "$BASH_VERSION" ]; then # include .bashrc if it exists if [ -f "$HOME/.bashrc" ]; then . "$HOME/.bashrc" fi fi

Et voici schématiquement ce qu'il se passe :

flowchart LR
    subgraph shell
			subgraph login
				direction TB
				sl{{Start}}-->|1st load|pl[~/.profile]
				sl-->|2nd load|bl[~/.bashrc]
			end
			subgraph non-login
				direction TB
				snl{{Start}}-->|1st load|bnl[~/.bashrc]
			end
    end

Maintenant que l'on a vu le fonctionnement, voici une "bonne pratique", du moins la pratique que j'utilise pour pouvoir réutiliser ma configuration en cas de réinstallation. Je crée un fichier ~/.bashrc personnalisé dans lequel je fais la configuration de mes différents programmes, et que j'inclus dans mon ~/.profile.

if [ -n "$BASH_VERSION" ]; then # include .bashrc if it exists if [ -f "$HOME/.bashrc" ]; then . "$HOME/.bashrc" fi if [ -f "$HOME/.bashrc_custom" ]; then . "$HOME/.bashrc_custom" fi fi

Et voici le début de mon fichier ~/.bashrc_custom :

# /* vim: set filetype=sh : */ # set PATH so it includes user's private bin if it exists if [ -d "$HOME/bin" ] then PATH="$HOME/bin:$PATH" fi # set PATH so it includes user's private bin if it exists if [ -d "$HOME/.local/bin" ] then PATH="$HOME/.local/bin:$PATH" fi # set PATH so it includes user's private npm-global if it exists if [ -d "$HOME/.npm-global" ] then PATH="$HOME/.npm-global/bin:$PATH" fi # ...

Si l'on reprend le graphique ci-dessus en incluant ce fichier, voilà ce que cela donne :

flowchart LR
    subgraph shell
			subgraph login
				direction TB
				sl{{Start}}-->|1st load|pl[~/.profile]
				sl-->|2nd load|bl[~/.bashrc]
				sl-->|3rd load|bcl[~/.bashrc_custom]
			end
			subgraph non-login
				direction TB
				snl{{Start}}-->|1st load|bnl[~/.bashrc]
				snl-->|2nd load|bcnl[~/.bashrc_custom]
			end
    end

Comme vous pouvez le voir, il n'y a rien de très compliqué, mais plutôt une logique de découpage bien pensée. Cette technique permet de versionner et de retrouver très rapidement une configuration grâce à un gist de Github ou un snippets de Gitlab.

Dans la même logique de découpage, on peut faire la même chose avec les alias bash. Effectivement, dans le fichier ~/.bashrc, nous avons quelques lignes qui chargent le fichier ~/.bash_aliases. Et comme pour notre fichier précédent, nous pouvons le versionner et retrouver très rapidement une configuration grâce à un gist de Github ou un snippets de Gitlab.

Si l'on reprend le graphique ci-dessus en incluant ce fichier, voilà ce que ça donne :

flowchart LR
    subgraph shell
			subgraph login
				direction TB
				sl{{Start}}-->|1st load|pl[~/.profile]
				sl-->|2nd load|bl[~/.bashrc]
				bl-->|load|cal[~/.bash_aliases]
				sl-->|3rd load|bcl[~/.bashrc_custom]
			end
			subgraph non-login
				direction TB
				snl{{Start}}-->|1st load|bnl[~/.bashrc]
				bnl-->|load|canl[~/.bash_aliases]
				snl-->|2nd load|bcnl[~/.bashrc_custom]
			end
    end

Et voilà pour la configuration de notre CLI avec bash.

Dites stop à zsh et Oh My Zsh sous Linux

Il est fréquent de voir beaucoup de personnes utiliser zsh et Oh My Zsh sans vraiment comprendre ce que c'est.

Alors, zsh ou Z shell est un shell en lignes de commande (CLI) comme sh, bash, ksh, ash, et bien d'autres. zsh ajoute des fonctionnalités à votre CLI, notamment pour la complétion des commandes, l'ajout de fonctions, et bien plus encore.

Pensez-vous réellement exploiter les fonctionnalités de zsh ? Je doute que cela soit le cas ! De surcroît, l'utilisation de zsh peut entraîner des problèmes de portabilité lors de la rédaction de scripts shell, car vous introduisez des fonctionnalités spécifiques à votre interface en ligne de commande (CLI) que tout le monde ne possède pas. C'est un peu comparable à créer un programme conçu pour un système Linux, mais destiné aux utilisateurs de Windows. La nécessité d'installer et d'utiliser zsh se présente principalement si vous optez pour Oh My Zsh.

Si vous utilisez Oh My Zsh, alors l'utilisation de zsh est obligatoire. Oh My Zsh est un framework pour la gestion de la configuration de zsh, et il utilise certaines fonctionnalités spécifiques de zsh pour fournir des fonctionnalités étendues, des thèmes et des plugins. Donc, dans ce cas, vous n'avez pas vraiment le choix et vous devez utiliser zsh. Cependant, si vous préférez rester avec Bash ou tout autre shell, vous n'avez pas besoin d'installer zsh ou Oh My Zsh. C'est une question de préférence personnelle et de besoins spécifiques.

Mais pourquoi utiliser Oh My Zsh ? Pour avoir 300 alias et n'en utiliser que deux ? Pour personnaliser votre terminal ?

Je vais vous montrer deux choses à faire qui vous permettront d'accomplir la même chose, voire plus, de manière plus simple.

Utilisez vos alias

J'en ai parlé un peu plus tôt. Mais si vous voulez personnaliser votre CLI avec des alias, il vous suffit de créer un fichier ~/.bash_aliases et vous pouvez créer vos propres alias.

Les plugins Oh My Zsh définissent la plupart du temps des alias que vous devez apprendre et dont vous ne savez pas réellement ce qu'ils font. Regardez par vous-même le plugin history.

Alors, regardez les commandes que vous utilisez le plus et créez vos propres alias dans le fichier ~/.bash_aliases.

Pour rappel, un alias se définit comme ceci :

alias my_aliase_name='my_command and my args --or options'

D'une part, vous simplifiez les commandes que vous allez exécuter, d'autre part, vous définissez vous-même les alias que vous voulez. C'est vous qui avez le pouvoir !

⚠️ Mais attention aux alias ! Trop d'alias tue l'alias et vous risquez de ne plus savoir les commandes de base et d'être perdu dans le cas où vous devez agir sur un serveur où le strict minimum est installé ou sur la machine d'un de vos collègues.

Personnalisez votre terminal avec Starship

Si vous utilisez Oh My Zsh pour personnaliser votre terminal, vous utilisez probablement les thèmes déjà existants ? Sauf si vous êtes un professionnel du script en sh ou zsh. Quand on regarde comment sont faits certains thèmes, il faut être accroché pour comprendre ce qu'il se passe (exemple du thème agnoster).

prompt_status() { local -a symbols [[ $RETVAL -ne 0 ]] && symbols+="%{%F{red}%}✘" [[ $UID -eq 0 ]] && symbols+="%{%F{yellow}%}⚡" [[ $(jobs -l | wc -l) -gt 0 ]] && symbols+="%{%F{cyan}%}⚙" [[ -n "$symbols" ]] && prompt_segment black default "$symbols" }

Si vous n'êtes pas un professionnel du script, alors starship.rs est là pour vous. Starship est un programme développé en Rust, disponible sous Linux, macOS et Windows, et facilement installable et configurable avec un fichier TOML. Pour Linux, pour installer Starship, il vous suffira d'exécuter quelques commandes :

curl -sS https://starship.rs/install.sh | sh #### echo 'export STARSHIP_CONFIG=$HOME/.config/starship.toml' >> ~/.bashrc echo 'export STARSHIP_CACHE=~/.starship/cache' >> ~/.bashrc echo 'eval "$(starship init bash)"' >> ~/.bashrc #### # Ou ajouter les lignes suivantes dans ~/.bashrc_custom ### if command -v starship 1> /dev/null then export STARSHIP_CONFIG=$HOME/.config/starship.toml export STARSHIP_CACHE=~/.starship/cache eval "$(starship init bash)" fi

Il faudra aussi télécharger les packs d'icônes nerdfront si vous le souhaitez.

Suite à cela, il ne vous restera qu'à créer et implémenter le fichier ~/.config/starship.toml, qu'il sera aussi possible de versionner. Voici un exemple de configuration pour l'utilisation de la mémoire, l'horloge, le temps d'exécution d'une commande et le formatage du répertoire.

[memory_usage] format = "$symbol[${ram} - ${ram_pct}( | ${swap} - ${swap_pct})]($style) " threshold = 0 symbol = "󰍛 " style = "bold dimmed white" disabled = false [time] time_format = "%T" format = "[](bold yellow) [$time](yellow) " disabled = false [cmd_duration] min_time = 1_000 format = "[󰔚 $duration]($style) " disabled = false [directory] truncation_length = 10 truncate_to_repo = true format = "[$path]($style)[$lock_symbol]($lock_style) "

Et voilà à quoi pourrait ressembler votre terminal :

terminal

La documentation est très riche, et il y a de nombreuses possibilités avec différents modules déjà développés.

Conclusion : vous êtes prêt à améliorer votre expérience de travail sous Linux

Voilà pour quelques conseils qui peuvent améliorer votre expérience de travail sur votre terminal.

Il reste encore beaucoup à explorer pour créer un environnement de travail exceptionnel. Si vous désirez approfondir davantage, je vous recommande d'explorer les éditeurs de texte intégrés à votre terminal, tels que Neovim ou LunarVim, au multiplexeur de terminaux tmux, d'explorer l'isolation par conteneurisation, et bien sûr, de plonger dans le scripting shell.

Même si vous n'êtes pas un barbu dans une cave sombre, vous pouvez reprendre le contrôle de votre terminal. 😜

Sources

Auteur(s)

Nicolas Grévin

Nicolas Grévin

Ingénieur DevOps SRE spécialisé en conteneurisation, Kubernetes, CI/CD, cloud, Infrastructure as Code et outillage. Engagé dans la Green IT et développeur passionné.

Voir le profil

Vous souhaitez en savoir plus sur le sujet ?
Organisons un échange !

Notre équipe d'experts répond à toutes vos questions.

Nous contacter

Découvrez nos autres contenus dans le même thème

Retour sur le Forum PHP 2018

Retour sur le Forum PHP 2018

Cet article vous propose un retour sur le Forum PHP qui s'est tenu les 25 et 26 octobre derniers

Introduction à Gitlab CI/CD

Introduction à Gitlab CI/CD

Cet article présente une partie des possibilités qu’offre GitLab CI/CD. Vous retrouverez aussi sur la plateforme Codelabs deux tutoriels liés à cet article, qui vous montreront deux cas d'utilisation.