Linux Platform

Exemples de scripts Bash

Scripts Bash pratiques et commentes pour automatiser vos taches quotidiennes sous Linux.

Introduction aux scripts Bash

Un script Bash est un fichier texte contenant une suite de commandes exécutées par l'interpreteur Bash. Pour créer et exécuter un script :

# Creer le fichier
nano mon-script.sh
 
# Le rendre exécutable
chmod +x mon-script.sh
 
# L'exécuter
./mon-script.sh

Tout script Bash commence par le shebang qui indique quel interpreteur utiliser :

#!/bin/bash

Script 1 : Sauvegarde automatique

Ce script créé une archive compressée d'un répertoire avec la date du jour.

#!/bin/bash
 
# Configuration
SOURCE="/home/utilisateur/documents"
DEST="/home/utilisateur/sauvegardes"
DATE=$(date +%Y-%m-%d_%H%M%S)
ARCHIVE="sauvegarde_${DATE}.tar.gz"
 
# Creer le répertoire de destination s'il n'existe pas
mkdir -p "$DEST"
 
# Creer l'archive
tar -czf "${DEST}/${ARCHIVE}" -C "$(dirname "$SOURCE")" "$(basename "$SOURCE")"
 
# Verifier le résultat
if [ $? -eq 0 ]; then
    echo "Sauvegarde reussie : ${DEST}/${ARCHIVE}"
    echo "Taille : $(du -h "${DEST}/${ARCHIVE}" | cut -f1)"
else
    echo "Erreur lors de la sauvegarde" >&2
    exit 1
fi
 
# Supprimer les sauvegardes de plus de 30 jours
find "$DEST" -name "sauvegarde_*.tar.gz" -mtime +30 -delete
echo "Anciennes sauvegardes nettoyees."

Utilisation

chmod +x sauvegarde.sh
./sauvegarde.sh

Pour l'exécuter quotidiennement avec cron :

crontab -e
# Ajouter cette ligne pour une exécution a 2h du matin
0 2 * * * /home/utilisateur/sauvegarde.sh >> /var/log/sauvegarde.log 2>&1

Script 2 : Surveillancé de l'espace disque

Ce script alerte quand l'espace disque depasse un seuil configurable.

#!/bin/bash
 
SEUIL=80
MAILTO="[email protected]"
 
df -H | awk 'NR>1 {print $5 " " $6}' | while read -r usage partition; do
    pourcentage=${usage%\%}
 
    if [ "$pourcentage" -ge "$SEUIL" ]; then
        echo "ALERTE : la partition $partition est utilisée a ${usage}"
 
        # Envoyer un email si la commande mail est disponible
        if command -v mail > /dev/null 2>&1; then
            echo "La partition $partition a atteint ${usage} d'utilisation sur $(hostname)" \
                | mail -s "Alerte disque - $(hostname)" "$MAILTO"
        fi
    fi
done

Script 3 : Recherche et remplacement dans des fichiers

Ce script effectue un rechercher-remplacer recursif dans un répertoire.

#!/bin/bash
 
if [ $# -ne 3 ]; then
    echo "Usage : $0 <répertoire> <ancien_texte> <nouveau_texte>"
    exit 1
fi
 
REPERTOIRE="$1"
ANCIEN="$2"
NOUVEAU="$3"
 
# Trouver les fichiers contenant le texte
fichiers=$(grep -rl "$ANCIEN" "$REPERTOIRE" 2>/dev/null)
 
if [ -z "$fichiers" ]; then
    echo "Aucune occurrence trouvee pour '$ANCIEN'"
    exit 0
fi
 
echo "Fichiers concernes :"
echo "$fichiers"
echo ""
read -p "Confirmer le remplacement ? (o/n) " reponse
 
if [ "$reponse" = "o" ]; then
    echo "$fichiers" | while read -r fichier; do
        sed -i "s|${ANCIEN}|${NOUVEAU}|g" "$fichier"
        echo "  Modifie : $fichier"
    done
    echo "Remplacement termine."
else
    echo "Operation annulee."
fi

Script 4 : Moniteur de processus

Ce script surveille un processus et le redemarre s'il s'arrête.

#!/bin/bash
 
PROCESSUS="nginx"
COMMANDE_DEMARRAGE="sudo systemctl start nginx"
INTERVALLE=30
LOG="/var/log/moniteur-${PROCESSUS}.log"
 
while true; do
    if ! pgrep -x "$PROCESSUS" > /dev/null; then
        echo "$(date '+%Y-%m-%d %H:%M:%S') - $PROCESSUS arrête, redémarrage..." >> "$LOG"
        $COMMANDE_DEMARRAGE
 
        if pgrep -x "$PROCESSUS" > /dev/null; then
            echo "$(date '+%Y-%m-%d %H:%M:%S') - $PROCESSUS redemarre avec succès" >> "$LOG"
        else
            echo "$(date '+%Y-%m-%d %H:%M:%S') - ECHEC du redémarrage de $PROCESSUS" >> "$LOG"
        fi
    fi
    sleep "$INTERVALLE"
done

Script 5 : Nettoyage de logs

Ce script nettoie les fichiers de log anciens et les fichiers temporaires.

#!/bin/bash
 
JOURS=7
TAILLE_MIN="100M"
 
echo "=== Nettoyage système ==="
echo "Date : $(date)"
echo ""
 
# Espace avant nettoyage
echo "Espace disque avant :"
df -h / | tail -1
echo ""
 
# Nettoyer les fichiers temporaires
echo "Nettoyage de /tmp (fichiers de plus de $JOURS jours)..."
find /tmp -type f -atime +$JOURS -delete 2>/dev/null
echo "  Fait."
 
# Nettoyer les logs compressés anciens
echo "Nettoyage des logs compressés anciens..."
find /var/log -name "*.gz" -mtime +$JOURS -delete 2>/dev/null
find /var/log -name "*.old" -mtime +$JOURS -delete 2>/dev/null
echo "  Fait."
 
# Vider les journaux systemd de plus de 7 jours
if command -v journalctl > /dev/null 2>&1; then
    echo "Nettoyage du journal systemd..."
    journalctl --vacuum-time=${JOURS}d 2>/dev/null
fi
 
# Nettoyer le cache APT (Debian/Ubuntu)
if command -v apt > /dev/null 2>&1; then
    echo "Nettoyage du cache APT..."
    apt clean 2>/dev/null
fi
 
echo ""
echo "Espace disque après :"
df -h / | tail -1

Script 6 : Creation de comptes utilisateurs en lot

Ce script créé plusieurs comptes utilisateurs a partir d'un fichier CSV.

#!/bin/bash
 
if [ $# -ne 1 ]; then
    echo "Usage : $0 <fichier_utilisateurs.csv>"
    echo "Format CSV : nom,prenom,groupe"
    exit 1
fi
 
FICHIER="$1"
 
if [ ! -f "$FICHIER" ]; then
    echo "Fichier introuvable : $FICHIER"
    exit 1
fi
 
while IFS=',' read -r nom prenom groupe; do
    # Ignorer l'en-tete
    [ "$nom" = "nom" ] && continue
 
    login="${prenom,,}.${nom,,}"
    login=$(echo "$login" | tr -d ' ')
 
    # Creer le groupe s'il n'existe pas
    if ! getent group "$groupe" > /dev/null 2>&1; then
        groupadd "$groupe"
        echo "Groupe créé : $groupe"
    fi
 
    # Creer l'utilisateur
    if ! id "$login" > /dev/null 2>&1; then
        useradd -m -g "$groupe" -s /bin/bash -c "$prenom $nom" "$login"
        # Generer un mot de passe temporaire
        mdp=$(openssl rand -base64 12)
        echo "${login}:${mdp}" | chpasswd
        # Forcer le changement de mot de passe a la première connexion
        chage -d 0 "$login"
        echo "Utilisateur créé : $login (mot de passe temporaire : $mdp)"
    else
        echo "L'utilisateur $login existe deja, ignore."
    fi
done < "$FICHIER"

Fichier CSV d'exemple (utilisateurs.csv) :

nom,prenom,groupe
Dupont,Jean,développeurs
Martin,Marie,administrateurs
Bernard,Pierre,développeurs

Script 7 : Verification de la connectivité réseau

Ce script teste la connectivité vers plusieurs hotes et services.

#!/bin/bash
 
HOTES=("8.8.8.8" "1.1.1.1" "google.com" "github.com")
SERVICES=("google.com:443" "github.com:22")
 
echo "=== Test de connectivité réseau ==="
echo "Date : $(date)"
echo ""
 
# Test ping
echo "--- Tests PING ---"
for hôte in "${HOTES[@]}"; do
    if ping -c 1 -W 2 "$hote" > /dev/null 2>&1; then
        latence=$(ping -c 1 -W 2 "$hote" | grep "time=" | sed 's/.*time=\([^ ]*\).*/\1/')
        echo "  [OK] $hôte (${latence} ms)"
    else
        echo "  [KO] $hôte - injoignable"
    fi
done
 
echo ""
 
# Test de ports
echo "--- Tests PORTS ---"
for service in "${SERVICES[@]}"; do
    hote="${service%%:*}"
    port="${service##*:}"
    if timeout 3 bash -c "echo > /dev/tcp/$hote/$port" 2>/dev/null; then
        echo "  [OK] $hote:$port - ouvert"
    else
        echo "  [KO] $hote:$port - ferme ou filtre"
    fi
done
 
echo ""
 
# Informations réseau
echo "--- Configuration réseau ---"
echo "  Passerelle : $(ip route | grep default | awk '{print $3}')"
echo "  DNS : $(grep nameserver /etc/resolv.conf | head -1 | awk '{print $2}')"
echo "  IP locale : $(hostname -I | awk '{print $1}')"

Script 8 : Rapport système

Ce script genere un rapport complet sur l'état du système.

#!/bin/bash
 
RAPPORT="/tmp/rapport-système-$(date +%Y%m%d).txt"
 
{
    echo "========================================="
    echo "  RAPPORT SYSTEME - $(hostname)"
    echo "  Date : $(date)"
    echo "========================================="
    echo ""
 
    echo "--- Informations système ---"
    echo "OS : $(cat /etc/os-release 2>/dev/null | grep PRETTY_NAME | cut -d'"' -f2)"
    echo "Noyau : $(uname -r)"
    echo "Architecture : $(uname -m)"
    echo "Uptime : $(uptime -p 2>/dev/null || uptime)"
    echo ""
 
    echo "--- CPU ---"
    echo "Modele : $(grep 'model name' /proc/cpuinfo | head -1 | cut -d: -f2 | xargs)"
    echo "Coeurs : $(nproc)"
    echo "Charge moyenne : $(cat /proc/loadavg | awk '{print $1, $2, $3}')"
    echo ""
 
    echo "--- Memoire ---"
    free -h | head -2
    echo ""
 
    echo "--- Espace disque ---"
    df -h | grep -E '^/dev/'
    echo ""
 
    echo "--- 10 plus gros répertoires dans / ---"
    du -h --max-depth=1 / 2>/dev/null | sort -rh | head -10
    echo ""
 
    echo "--- Utilisateurs connectes ---"
    who
    echo ""
 
    echo "--- 5 processus les plus gourmands (CPU) ---"
    ps aux --sort=-%cpu | head -6
    echo ""
 
    echo "--- Derniers redémarrages ---"
    last reboot | head -5
 
} > "$RAPPORT"
 
echo "Rapport genere : $RAPPORT"
echo "Taille : $(du -h "$RAPPORT" | cut -f1)"

Bonnes pratiques

Structure d'un script

#!/bin/bash
set -euo pipefail
 
# set -e : arrêter le script a la première erreur
# set -u : erreur si une variable n'est pas définie
# set -o pipefail : propager les erreurs dans les pipes

Conventions de style

  • Utiliser des noms de variables en MAJUSCULES pour les constantes
  • Utiliser des noms en minuscules pour les variables locales
  • Toujours entourer les variables de guillemets doubles : "$variable"
  • Commenter le but du script, pas chaque ligne evidente
  • Tester le script avec bash -n script.sh pour vérifiér la syntaxe
  • Utiliser shellcheck pour detecter les problemes courants
# Installer shellcheck
sudo apt install shellcheck
 
# Verifier un script
shellcheck mon-script.sh