Scripting Bash et administration système Linux
🎯 Objectifs
- ✅ Écrire des scripts Bash complets et robustes
- ✅ Maîtriser les outils de traitement de texte (
awk,sed,sort,cut) - ✅ Planifier des tâches avec
cron - ✅ Gérer les services avec
systemd - ✅ Appliquer les bonnes pratiques de scripting
📌 Prérequis
Modules Linux Débutant et Linux Intermédiaire complétés (navigation, permissions, redirections, pipes).
🔧 Scripting Bash
Premier script
#!/bin/bash
# Mon premier script
echo "Bonjour, $(whoami) !"
echo "Nous sommes le $(date +%Y-%m-%d)"chmod +x mon_script.sh
./mon_script.sh💡 La première ligne
#!/bin/bash(shebang) indique quel interpréteur utiliser.
Variables
nom="DevOps" # Pas d'espace autour du =
echo "Bonjour $nom" # Double quotes : interprète les variables
echo 'Bonjour $nom' # Simple quotes : texte littéral
echo "Home : ${HOME}" # Accolades pour délimiterSubstitution de commande et arithmétique
fichiers=$(ls | wc -l)
echo "Il y a $fichiers fichiers ici"
resultat=$((5 + 3))
echo "5 + 3 = $resultat"Conditions
#!/bin/bash
if [ -f "/etc/nginx/nginx.conf" ]; then
echo "Nginx est configuré"
elif [ -f "/etc/apache2/apache2.conf" ]; then
echo "Apache est configuré"
else
echo "Aucun serveur web trouvé"
fiOpérateurs de test :
| Opérateur | Description | Exemple |
|---|---|---|
-f | Fichier existe | [ -f fichier ] |
-d | Dossier existe | [ -d dossier ] |
-z | Chaîne vide | [ -z "$var" ] |
-eq | Égal (nombres) | [ $a -eq $b ] |
-gt | Plus grand que | [ $a -gt 10 ] |
= | Égal (chaînes) | [ "$a" = "oui" ] |
Boucles
# Boucle for - liste
for service in nginx mysql redis; do
echo "Vérification de $service..."
systemctl is-active "$service"
done# Boucle for - fichiers
for f in /var/log/*.log; do
echo "$f : $(wc -l < "$f") lignes"
done# Boucle while - lire un fichier ligne par ligne
while IFS= read -r ligne; do
echo "Serveur : $ligne"
done < serveurs.txtFonctions
verifier_service() {
local service="$1"
if systemctl is-active --quiet "$service"; then
echo "✅ $service est actif"
else
echo "❌ $service est arrêté"
fi
}
verifier_service nginx
verifier_service mysql💡 Utilisez
localpour limiter la portée des variables dans les fonctions.
Arguments
#!/bin/bash
# Usage : ./deploy.sh <env> <version>
echo "Script : $0"
echo "Environnement : $1"
echo "Version : $2"
echo "Tous les args : $@"
echo "Nombre d'args : $#"
# Validation
if [ $# -lt 2 ]; then
echo "Usage: $0 <env> <version>"
exit 1
fiMode strict
Ajoutez cette ligne en haut de tous vos scripts :
set -euo pipefail| Option | Effet |
|---|---|
-e | Arrêt immédiat en cas d'erreur |
-u | Erreur si variable non définie |
-o pipefail | Erreur si une commande dans un pipe échoue |
Exemple complet - Script de backup
#!/bin/bash
set -euo pipefail
BACKUP_DIR="/backups"
SOURCE="/var/www/html"
DATE=$(date +%Y%m%d_%H%M%S)
ARCHIVE="${BACKUP_DIR}/backup_${DATE}.tar.gz"
mkdir -p "$BACKUP_DIR"
tar -czf "$ARCHIVE" -C "$(dirname "$SOURCE")" "$(basename "$SOURCE")"
# Garder les 7 derniers backups
find "$BACKUP_DIR" -name "backup_*.tar.gz" -mtime +7 -delete
echo "✅ Backup créé : $ARCHIVE"
echo " Taille : $(du -sh "$ARCHIVE" | cut -f1)"📝 Outils de Traitement de Texte
Trier, dédupliquer, couper
sort fichier.txt # Trier par ordre alphabétique
sort -rn fichier.txt # Tri numérique inversé
uniq -c # Compter les doublons (après sort)
cut -d':' -f1 /etc/passwd # Couper par délimiteur (champ 1)awk - Traitement par colonnes
# Colonne spécifique (ici la 1ère)
awk '{print $1}' access.log
# Filtrer par condition
ps aux | awk '$3 > 5.0 {print $11, $3"%"}'
# Calculer une somme
awk '{sum += $5} END {print "Total:", sum}' data.txt
# Formater la sortie
df -h | awk 'NR>1 {printf "%-20s %s\n", $6, $5}'sed - Édition de flux
# Remplacer (première occurrence par ligne)
sed 's/ancien/nouveau/' fichier.txt
# Remplacer toutes les occurrences
sed -i 's/http/https/g' config.txt
# Supprimer des lignes
sed '/^#/d' config.txt # Lignes commençant par #
sed '1,5d' fichier.txt # Lignes 1 à 5Exemple concret - Analyse de logs
# Top 10 des IPs dans un access log
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10
# Nombre de requêtes 404
grep " 404 " access.log | wc -l
# IPs avec plus de 100 requêtes
awk '{print $1}' access.log | sort | uniq -c | sort -rn \
| awk '$1 > 100 {print $2, $1 " requêtes"}'⏰ Tâches Planifiées (crontab)
Format cron
┌───── minute (0-59)
│ ┌───── heure (0-23)
│ │ ┌───── jour du mois (1-31)
│ │ │ ┌───── mois (1-12)
│ │ │ │ ┌───── jour de la semaine (0-7, 0=7=dimanche)
│ │ │ │ │
* * * * * commandeGérer les tâches
crontab -e # Éditer les tâches
crontab -l # Lister les tâchesExemples
# Backup quotidien à 2h du matin
0 2 * * * /scripts/backup.sh >> /var/log/backup.log 2>&1
# Nettoyage des logs chaque lundi à 6h
0 6 * * 1 find /var/log -name "*.log" -mtime +30 -delete
# Vérification toutes les 5 minutes
*/5 * * * * /scripts/healthcheck.sh💡 Utilisez crontab.guru pour vérifier vos expressions cron.
🖥️ Services (systemd)
Commandes principales
sudo systemctl start nginx # Démarrer
sudo systemctl stop nginx # Arrêter
sudo systemctl restart nginx # Redémarrer
sudo systemctl status nginx # État détaillé
sudo systemctl enable nginx # Activer au démarrageConsulter les logs
journalctl -u nginx # Logs d'un service
journalctl -u nginx -f # Suivre en temps réel
journalctl --since "1 hour ago" # Logs récents❌ Erreurs Courantes
| Erreur | Cause | Correction |
|---|---|---|
command not found | Script non exécutable | chmod +x script.sh |
unbound variable | Variable non définie (mode strict) | Initialiser la variable |
[: too many arguments | Variable avec espaces | Utiliser "$var" (guillemets) |
Permission denied | Droits insuffisants | chmod ou sudo |
unexpected end of file | fi, done ou } manquant | Vérifier la fermeture des blocs |
| Cron ne s'exécute pas | Chemins relatifs | Utiliser des chemins absolus |
📋 Points Clés
| Concept | À retenir |
|---|---|
| Shebang | #!/bin/bash en première ligne |
| Mode strict | set -euo pipefail toujours |
| Variables | "$var" avec guillemets doubles |
awk | Traitement par colonnes |
sed | Rechercher/remplacer dans un flux |
| Cron | crontab -e, 5 champs + commande |
| systemd | systemctl + journalctl |
🏋️ Exercices du module
- Naviguer et explorer le système de fichiers - Parcourir l'arborescence, lister des fichiers
- Gérer les fichiers et répertoires - Créer, copier, déplacer, supprimer
- Permissions et propriété des fichiers - chmod, chown, droits utilisateurs
- Processus et monitoring système - ps, top, kill, surveillance
- Flux, pipes et traitement de texte - stdin, stdout, grep, sed
- Projet Capstone : Automatisation et supervision avec Bash - Script Bash complet, awk/sed, cron et service systemd
📚 Ressources
- man bash - Manuel officiel Bash
- ExplainShell - Décortique vos commandes
- crontab.guru - Éditeur visuel de cron
- ShellCheck - Linter pour scripts Bash
🚀 Prochaines étapes
Vous maîtrisez Linux. Il est temps de versionner votre code :
- Débuter avec Git : commits, branches et premier repo - Commits, branches et bases du contrôle de version