Aller au contenu

Recherche avec grep, find et variables d'environnement

Tu viens d’être embauché comme admin système junior dans une entreprise qui opère une boutique en ligne. On te remet l’accès au serveur web avec ses logs, ses fichiers de configuration et ses scripts. Ton superviseur te demande d’analyser ce qui se passe sur le serveur.

Pour commencer, entre dans le dossier du serveur :

Fenêtre de terminal
cd serveur-web

Le serveur contient les dossiers suivants :

serveur-web/
├── config/ ← configuration prod et dev
├── logs/ ← journaux du serveur
├── rapports/ ← rapports de trafic et d'incidents
├── scripts/ ← scripts d'administration
├── sauvegardes/ ← sauvegardes de la base de données
└── README.txt

grep cherche un mot ou un motif dans un fichier et affiche les lignes qui correspondent.

Requête : « Vérifie s’il y a eu des erreurs aujourd’hui. »
Cherche le mot ERROR dans le fichier de log des erreurs.

Fenêtre de terminal
grep "ERROR" logs/erreurs.log

Lance la commande. Tu devrais voir les lignes qui contiennent des erreurs.

Refais la même recherche, mais affiche aussi le numéro de ligne pour chaque résultat. Ça aide à localiser l’erreur dans le fichier.

Indice

L’option -n ajoute le numéro de ligne devant chaque résultat.

Solution
Fenêtre de terminal
grep -n "ERROR" logs/erreurs.log

Cherche les lignes contenant WARNING dans le même fichier. Combien y en a-t-il?

Solution
Fenêtre de terminal
grep "WARNING" logs/erreurs.log

Tu peux compter visuellement, ou utiliser grep -c :

Fenêtre de terminal
grep -c "WARNING" logs/erreurs.log

Ton superviseur veut savoir si quelqu’un a essayé d’accéder à la section /admin. Cherche le mot admin dans le log d’accès. La recherche doit être insensible à la casse (trouver admin, Admin, ADMIN).

Indice

L’option -i rend la recherche insensible à la casse.

Solution
Fenêtre de terminal
grep -in "admin" logs/acces.log

Combien de requêtes ont reçu une réponse 404 (page introuvable) dans le log d’accès?

Solution
Fenêtre de terminal
grep -c "404" logs/acces.log

Cherche le mot timeout dans tous les fichiers du dossier logs/, avec les numéros de ligne.

Indice

L’option -r cherche récursivement dans un dossier. Tu peux aussi lister les fichiers avec grep "motif" logs/*.

Solution
Fenêtre de terminal
grep -rn "timeout" logs/

Ou plus simplement :

Fenêtre de terminal
grep -n "timeout" logs/*

Combien de lignes au total contiennent le mot TODO dans tout le serveur?

Indice

Le pipe (|) envoie la sortie d’une commande vers une autre. wc -l compte les lignes.

grep -r "TODO" . | wc -l
Solution
Fenêtre de terminal
grep -r "TODO" . | wc -l

find cherche des fichiers par nom, type ou taille. wc compte les lignes, les mots ou les caractères. Ensemble, ils te permettent de faire l’inventaire d’un serveur.

Trouve tous les fichiers .log sur le serveur.

Fenêtre de terminal
find . -name "*.log"

Trouve tous les fichiers .sh (les scripts bash).

Solution
Fenêtre de terminal
find . -name "*.sh"

Exercice 2.3 Trouver les fichiers de configuration

Section intitulée « Exercice 2.3 Trouver les fichiers de configuration »

Trouve tous les fichiers .env.

Solution
Fenêtre de terminal
find . -name "*.env"

Trouve tous les dossiers (pas les fichiers) du serveur.

Indice

-type d limite aux dossiers. -type f limiterait aux fichiers.

Solution
Fenêtre de terminal
find . -type d

Combien de lignes contient le fichier logs/acces.log? Chaque ligne correspond à une requête HTTP.

Fenêtre de terminal
wc -l logs/acces.log

Combien de lignes contiennent tous les fichiers de logs combinés?

Solution
Fenêtre de terminal
wc -l logs/*

La dernière ligne affiche le total.

Exercice 2.7 Stocker un résultat dans une variable

Section intitulée « Exercice 2.7 Stocker un résultat dans une variable »

Stocke le nombre de requêtes (lignes dans acces.log) dans une variable et affiche un message.

Indice

$(commande) exécute la commande et retourne le résultat. Attention : wc -l affiche aussi le nom du fichier. Pour avoir seulement le nombre, utilise un pipe : cat fichier | wc -l.

Solution
Fenêtre de terminal
NB_REQUETES=$(cat logs/acces.log | wc -l)
echo "Nombre de requêtes aujourd'hui : $NB_REQUETES"

Crée un inventaire du serveur qui affiche :

  • Le nombre de fichiers .log
  • Le nombre de fichiers .sh
  • Le nombre de fichiers .env
  • Le nombre de fichiers .sql
  • Le nombre total de lignes dans les logs
Solution
Fenêtre de terminal
NB_LOGS=$(find . -name "*.log" | wc -l)
NB_SCRIPTS=$(find . -name "*.sh" | wc -l)
NB_CONFIG=$(find . -name "*.env" | wc -l)
NB_SAUVEGARDES=$(find . -name "*.sql" | wc -l)
LIGNES_LOGS=$(cat logs/*.log | wc -l)
echo "=== Inventaire du serveur ==="
echo "Logs : $NB_LOGS fichiers ($LIGNES_LOGS lignes)"
echo "Scripts : $NB_SCRIPTS fichiers"
echo "Configuration: $NB_CONFIG fichiers"
echo "Sauvegardes : $NB_SAUVEGARDES fichiers"

Partie 3 Configurer le serveur avec des variables d’environnement

Section intitulée « Partie 3 Configurer le serveur avec des variables d’environnement »

Les variables d’environnement configurent le comportement du serveur. Le dossier config/ contient deux fichiers : serveur.env (production) et serveur-dev.env (développement).

Affiche la valeur de quelques variables système de ta machine :

Fenêtre de terminal
echo "Utilisateur : $USER"
echo "Répertoire : $HOME"
echo "Shell : $SHELL"

Crée une variable MON_SERVEUR avec la valeur "boutique-test" et affiche-la.

Rappel important

Pas d’espaces autour du =. MON_SERVEUR="valeur" est correct. MON_SERVEUR = "valeur" provoque une erreur.

Solution
Fenêtre de terminal
MON_SERVEUR="boutique-test"
echo "Serveur : $MON_SERVEUR"

Affiche la valeur de SERVEUR_PORT. Si elle n’existe pas encore, affiche 8080 par défaut.

Indice

${VARIABLE:-defaut} retourne la valeur de VARIABLE si elle est définie, sinon retourne defaut.

Solution
Fenêtre de terminal
echo "Port : ${SERVEUR_PORT:-8080}"

La variable n’existe pas encore, donc tu verras 8080.

Exercice 3.4 Charger la configuration de production

Section intitulée « Exercice 3.4 Charger la configuration de production »

Charge le fichier config/serveur.env et affiche les valeurs.

  1. Regarde ce que le fichier contient :

    Fenêtre de terminal
    cat config/serveur.env
  2. Charge les variables dans ton shell :

    Fenêtre de terminal
    source config/serveur.env
  3. Vérifie que ça a fonctionné :

    Fenêtre de terminal
    echo "Nom : $SERVEUR_NOM"
    echo "Port : $SERVEUR_PORT"
    echo "Base : $DB_HOTE:$DB_PORT/$DB_NOM"

Charge la configuration de développement (serveur-dev.env) et compare avec la production. Qu’est-ce qui change?

Solution
Fenêtre de terminal
# D'abord, regarde les différences
echo "=== Production ==="
cat config/serveur.env
echo ""
echo "=== Développement ==="
cat config/serveur-dev.env

Ou, pour charger la config dev :

Fenêtre de terminal
source config/serveur-dev.env
echo "Nom : $SERVEUR_NOM"
echo "Port : $SERVEUR_PORT"
echo "Base : $DB_HOTE"
echo "Cache: $CACHE_ACTIF"

Différences notables : le port change (3000 → 3001), la base de données est locale (localhost au lieu de db-prod), le cache est désactivé, les sauvegardes sont désactivées, et le niveau de log est debug au lieu de info.

Après avoir chargé serveur.env, le port est 3000. Change-le à 4000 sans modifier le fichier, puis vérifie.

Solution
Fenêtre de terminal
source config/serveur.env
echo "Avant : $SERVEUR_PORT"
SERVEUR_PORT=4000
echo "Après : $SERVEUR_PORT"

Charge la config de production et affiche un message différent selon que le cache est actif ou non.

Solution
Fenêtre de terminal
source config/serveur.env
if [ "$CACHE_ACTIF" = "oui" ]; then
echo "Cache activé (durée : ${CACHE_DUREE}s)"
else
echo "Cache désactivé"
fi

Essaie ensuite avec la config dev :

Fenêtre de terminal
source config/serveur-dev.env
if [ "$CACHE_ACTIF" = "oui" ]; then
echo "Cache activé (durée : ${CACHE_DUREE}s)"
else
echo "Cache désactivé"
fi

Combine tout ce que tu as appris pour créer un mini tableau de bord :

  1. Charge la config de production
  2. Affiche le nom du serveur et le port
  3. Compte les requêtes du jour (lignes dans acces.log)
  4. Compte les erreurs et les avertissements
  5. Affiche si le cache et les sauvegardes sont actifs
  6. Écris le résumé dans tableau-de-bord.txt
Solution
Fenêtre de terminal
source config/serveur.env
NB_REQUETES=$(cat logs/acces.log | wc -l)
NB_ERREURS=$(grep -c "ERROR" logs/erreurs.log)
NB_WARNINGS=$(grep -c "WARNING" logs/erreurs.log)
NB_SAUVEGARDES=$(find sauvegardes -name "*.sql" | wc -l)
echo "═══════════════════════════════════"
echo " Tableau de bord — $SERVEUR_NOM"
echo "═══════════════════════════════════"
echo " Port : $SERVEUR_PORT"
echo " Base : $DB_HOTE:$DB_PORT"
echo " Requêtes : $NB_REQUETES"
echo " Erreurs : $NB_ERREURS"
echo " Avert. : $NB_WARNINGS"
echo " Cache : $CACHE_ACTIF"
echo " Sauvegardes : $SAUVEGARDE_AUTO ($NB_SAUVEGARDES fichiers)"
echo "═══════════════════════════════════"
# Écrire dans un fichier
echo "Tableau de bord — $(date)" > tableau-de-bord.txt
echo "Serveur : $SERVEUR_NOM (port $SERVEUR_PORT)" >> tableau-de-bord.txt
echo "Requêtes : $NB_REQUETES" >> tableau-de-bord.txt
echo "Erreurs : $NB_ERREURS" >> tableau-de-bord.txt
echo "Avert. : $NB_WARNINGS" >> tableau-de-bord.txt
echo "Cache : $CACHE_ACTIF" >> tableau-de-bord.txt
echo "Sauvegardes: $SAUVEGARDE_AUTO" >> tableau-de-bord.txt