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.shTout script Bash commence par le shebang qui indique quel interpreteur utiliser :
#!/bin/bashScript 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.shPour 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>&1Script 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
doneScript 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."
fiScript 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"
doneScript 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 -1Script 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 pipesConventions 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.shpour vérifiér la syntaxe - Utiliser
shellcheckpour detecter les problemes courants
# Installer shellcheck
sudo apt install shellcheck
# Verifier un script
shellcheck mon-script.sh