Recherche de site Web

Comment analyser et modifier les fichiers de configuration Linux en utilisant sed et awk


Les fichiers de configuration Linux sont souvent en texte clair, ce qui les rend facilement modifiables à l'aide d'outils en ligne de commande. Parmi les plus puissants de ces outils se trouvent sed et awk.

Alors que les débutants peuvent s'appuyer sur l'édition manuelle avec vi ou nano, les administrateurs système expérimentés se tournent fréquemment vers ces outils pour l'analyse automatisée et la réécriture des fichiers de configuration.

Ces outils vous permettent de faire correspondre des motifs, d'extraire des champs et même d'effectuer des changements en temps réel dans les fichiers de configuration, le tout depuis la ligne de commande ou des scripts.

Dans cet article, nous allons explorer comment utiliser sed et awk pour lire, analyser et réécrire des fichiers de configuration de manière efficace. Nous passerons en revue des exemples pratiques qui peuvent aider à automatiser des tâches fastidieuses comme la mise à jour des adresses IP, le changement de paramètres ou l'extraction de valeurs.

Commençons par un exemple simple : remplacer un paramètre de configuration en utilisant sed.

Exemple 1 : Mettre à jour un paramètre avec la commande sed

Supposons que vous vouliez mettre à jour la directive ListenPort dans un fichier de configuration tel que /etc/ssh/sshd_config, vous pouvez le faire avec :

sed -i 's/^#\?ListenPort.*/ListenPort 2222/' /etc/ssh/sshd_config

Voici ce que cela fait :

  • -i indique à sed de modifier le fichier sur place.
  • ^#\? correspond aux lignes qui peuvent ou non commencer par un commentaire (#).
  • ListenPort.* correspond au reste de la ligne, qu'il s'agisse de la valeur par défaut ou d'une valeur personnalisée.
  • La ligne entière est remplacée par ListenPort 2222.

Cette approche confirme que même si la directive est commentée ou déjà définie sur une autre valeur, elle sera mise à jour correctement.

Exemple 2 : Extraire des valeurs avec la commande awk

Pour extraire des valeurs spécifiques d'un fichier de configuration, awk est un excellent choix. Par exemple, si vous souhaitez récupérer la valeur de la directive PermitRootLogin dans le fichier de configuration SSH, utilisez :

awk '$1 == "PermitRootLogin" { print $2 }' /etc/ssh/sshd_config

Voici ce que cela fait :

  • $1 == "PermitRootLogin" correspond aux lignes où le premier champ est exactement PermitRootLogin.
  • { print $2 } affiche le deuxième champ, qui est la valeur réelle attribuée à cette directive.

Cette commande analyse le fichier pour toute ligne commençant par PermitRootLogin et affiche la valeur correspondante, généralement yes, no ou prohibit-password.

Exemple 3 : Suppression d'une ligne de paramètre en utilisant la commande sed

Par exemple, si vous devez supprimer toute ligne qui commence par UseDNS dans le fichier /etc/ssh/sshd_config, vous pouvez le faire rapidement et efficacement en utilisant la commande sed.

sed -i '/^UseDNS/d' /etc/ssh/sshd_config

Ce que cela fait :

  • ^UseDNS correspond aux lignes qui commencent par UseDNS.
  • La commande d indique à sed de supprimer ces lignes.
  • Le drapeau -i applique les modifications directement au fichier.

Cela est pratique lorsqu'une configuration obsolète ou indésirable est présente à plusieurs endroits, et que vous voulez qu'elle soit supprimée.

Exemple 4 : Génération d'un rapport avec la commande awk

Supposons que vous ayez un fichier de configuration personnalisé qui énumère les services avec leur statut, comme ceci :

apache2 running  
mysql stopped  
nginx running  
ssh running

Vous pouvez utiliser awk pour générer rapidement un résumé de tous les services qui sont actuellement en cours d'exécution.

awk '$2 == "running" { print $1 }' /etc/myapp/services.conf

Voici ce que cela fait :

  • $2 == "running" correspond aux lignes où le deuxième champ est “running“.
  • { print $1 } affiche le nom du service.

Cela produit une liste uniquement des services qui sont actuellement en cours d'exécution. Vous pouvez développer cela en ajoutant des compteurs ou en enregistrant la sortie dans un fichier journal pour les scripts de surveillance.

Exemple 5 : Insérer une ligne avant ou après une correspondance en utilisant sed

Si vous avez besoin d'ajouter une nouvelle ligne après une directive spécifique dans un fichier de configuration, utilisez sed comme ceci :

sed -i '/^PermitRootLogin/a Banner /etc/issue.net' /etc/ssh/sshd_config

Voici ce que cela fait :

  • /^PermitRootLogin/ correspond à la ligne contenant PermitRootLogin.
  • a ajoute la ligne après la correspondance.
  • La bannière /etc/issue.net est la ligne qui est insérée.

C'est utile lorsque vous voulez garder les options de configuration liées regroupées de manière logique.

Bonus : Combiner awk et sed dans les scripts Shell

Les utilisateurs avancés peuvent même combiner awk et sed dans des scripts bash pour automatiser des tâches de configuration en masse. Par exemple, analyser tous les fichiers .conf dans un répertoire et réécrire un paramètre particulier dans chaque fichier — par exemple, mettre à jour une directive comme MaxConnections avec une nouvelle valeur.

Voici un script simple qui fait exactement cela :

#!/bin/bash

Define the new value for the parameter
NEW_VALUE=500

Loop through all .conf files in /etc/myapp/
for file in /etc/myapp/*.conf; do
  # Check if the file contains the MaxConnections directive
  if awk '$1 == "MaxConnections"' "$file" > /dev/null; then
    # Use sed to replace the existing value
    sed -i 's/^MaxConnections.*/MaxConnections '"$NEW_VALUE"'/' "$file"
    echo "Updated MaxConnections in $file"
  else
    # If the directive doesn't exist, append it to the end
    echo "MaxConnections $NEW_VALUE" >> "$file"
    echo "Added MaxConnections to $file"
  fi
done

Voici ce que fait ce script :

  • NEW_VALUE pour contenir la valeur mise à jour du paramètre.
  • Il parcourt chaque fichier .conf dans le répertoire /etc/myapp/.
  • awk vérifie si la directive MaxConnections existe déjà.
  • S'il existe, sed met à jour la valeur sur place.
  • Sinon, la directive est ajoutée à la fin du fichier.

Ce type de script est incroyablement utile pour gérer de grands environnements où plusieurs fichiers de configuration nécessitent des mises à jour cohérentes sans avoir à éditer chacun manuellement.

En conclusion

Les deux, sed et awk, sont des outils indispensables pour les administrateurs Linux qui gèrent des systèmes à grande échelle. En les maîtrisant, vous pouvez éviter les modifications manuelles répétitives et garantir que vos changements de configuration sont fiables et reproductibles.