Réseau et scripting shell
Réseau et scripting shell
Les bases du réseau sous Linux
Configuration réseau
# Voir les interfaces réseau
ip addr show
ip a # Raccourci
# Voir la table de routage
ip route show
# Voir les connexions actives
ss -tuln # Ports en écoute
ss -tupn # Avec les processus associés
# Tester la connectivité
ping google.com
ping -c 4 192.168.1.1 # 4 pings seulement
# Résolution DNS
nslookup google.com
dig google.com
host google.com
Outils réseau essentiels
# Télécharger un fichier
wget https://example.com/fichier.tar.gz
curl -O https://example.com/fichier.tar.gz
# Requêtes HTTP avec curl
curl https://api.example.com/users
curl -X POST -H "Content-Type: application/json" \
-d '{"name": "Jean"}' \
https://api.example.com/users
# Transférer des fichiers via SSH
scp fichier.txt user@serveur:/home/user/
scp -r dossier/ user@serveur:/tmp/
# Synchroniser des fichiers
rsync -avz ./projet/ user@serveur:/var/www/projet/
SSH — connexion sécurisée
# Se connecter à un serveur distant
ssh user@serveur.example.com
ssh -p 2222 user@serveur.com # Port personnalisé
# Générer une paire de clés SSH
ssh-keygen -t ed25519 -C "sacha@example.com"
# Copier la clé publique sur le serveur
ssh-copy-id user@serveur.com
# Configuration SSH (~/.ssh/config)
# ~/.ssh/config
Host prod
HostName 10.0.1.50
User deploy
Port 2222
IdentityFile ~/.ssh/id_prod
Host staging
HostName 10.0.2.50
User deploy
IdentityFile ~/.ssh/id_staging
# Utilisation simplifiée
ssh prod # Au lieu de ssh -p 2222 deploy@10.0.1.50
Pare-feu avec UFW
# Activer le pare-feu
sudo ufw enable
# Règles de base
sudo ufw allow ssh # Port 22
sudo ufw allow 80/tcp # HTTP
sudo ufw allow 443/tcp # HTTPS
sudo ufw allow from 192.168.1.0/24 # Autoriser un sous-réseau
# Voir les règles
sudo ufw status verbose
# Supprimer une règle
sudo ufw delete allow 80/tcp
Le scripting Bash
Le scripting permet d'automatiser des tâches répétitives. C'est une compétence essentielle en administration système.
Premier script
#!/bin/bash
# Mon premier script
# Usage: ./hello.sh [nom]
nom=${1:-"Monde"} # Premier argument, "Monde" par défaut
echo "Bonjour, $nom !"
# Rendre exécutable et lancer
chmod +x hello.sh
./hello.sh
./hello.sh Sacha
Variables et types
#!/bin/bash
# Variables simples
nom="Sacha"
age=25
repertoire="/var/log"
# Utiliser des variables
echo "Je suis $nom, j'ai $age ans"
echo "Les logs sont dans ${repertoire}"
# Résultat d'une commande
date_actuelle=$(date +"%Y-%m-%d")
nb_fichiers=$(ls | wc -l)
echo "Aujourd'hui : $date_actuelle, $nb_fichiers fichiers ici"
# Variables d'environnement
echo "Home : $HOME"
echo "Utilisateur : $USER"
echo "Shell : $SHELL"
echo "PATH : $PATH"
# Exporter une variable
export API_URL="http://localhost:3000"
Conditions
#!/bin/bash
# Tester un fichier
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é"
fi
# Comparaisons numériques
cpu_usage=$(top -bn1 | grep "Cpu(s)" | awk '{print int($2)}')
if [ "$cpu_usage" -gt 80 ]; then
echo "⚠ CPU élevé : ${cpu_usage}%"
fi
# Comparaisons de chaînes
if [ "$USER" = "root" ]; then
echo "Vous êtes root !"
fi
# Tests sur les fichiers
# -f : fichier existe -d : répertoire existe
# -r : lisible -w : modifiable
# -x : exécutable -s : taille > 0
Boucles
#!/bin/bash
# Boucle for
for serveur in web1 web2 web3 db1; do
echo "Ping de $serveur..."
ping -c 1 "$serveur" > /dev/null 2>&1 && echo " ✓ OK" || echo " ✗ Échec"
done
# Boucle sur des fichiers
for fichier in /var/log/*.log; do
taille=$(du -h "$fichier" | cut -f1)
echo "$fichier : $taille"
done
# Boucle while
compteur=0
while [ $compteur -lt 5 ]; do
echo "Itération $compteur"
compteur=$((compteur + 1))
done
# Lire un fichier ligne par ligne
while IFS= read -r ligne; do
echo "Traitement : $ligne"
done < liste-serveurs.txt
Fonctions
#!/bin/bash
# Définir une fonction
log() {
local niveau=$1
local message=$2
echo "[$(date +'%Y-%m-%d %H:%M:%S')] [$niveau] $message"
}
verifier_service() {
local service=$1
if systemctl is-active --quiet "$service"; then
log "INFO" "$service est actif"
return 0
else
log "ERREUR" "$service est inactif !"
return 1
fi
}
# Utilisation
log "INFO" "Début de la vérification"
verifier_service "nginx"
verifier_service "postgresql"
Script pratique : sauvegarde automatisée
#!/bin/bash
# backup.sh — Sauvegarde automatisée d'un répertoire
set -euo pipefail # Arrêter sur erreur, variable non définie, erreur dans un pipe
# Configuration
SOURCE="/var/www/html"
DESTINATION="/backups"
DATE=$(date +"%Y%m%d_%H%M%S")
ARCHIVE="backup_${DATE}.tar.gz"
RETENTION=7 # Garder les sauvegardes des 7 derniers jours
# Vérifications
if [ ! -d "$SOURCE" ]; then
echo "Erreur : $SOURCE n'existe pas" >&2
exit 1
fi
mkdir -p "$DESTINATION"
# Créer la sauvegarde
echo "Sauvegarde de $SOURCE..."
tar -czf "${DESTINATION}/${ARCHIVE}" -C "$(dirname "$SOURCE")" "$(basename "$SOURCE")"
# Vérifier la taille
taille=$(du -h "${DESTINATION}/${ARCHIVE}" | cut -f1)
echo "Archive créée : ${ARCHIVE} ($taille)"
# Nettoyer les anciennes sauvegardes
echo "Suppression des sauvegardes de plus de $RETENTION jours..."
find "$DESTINATION" -name "backup_*.tar.gz" -mtime +$RETENTION -delete
echo "Sauvegarde terminée avec succès !"
Cron — planifier des tâches
# Éditer la crontab
crontab -e
# Format : minute heure jour mois jour_semaine commande
# Exemples :
# Tous les jours à 2h du matin
0 2 * * * /home/sacha/scripts/backup.sh >> /var/log/backup.log 2>&1
# Toutes les 15 minutes
*/15 * * * * /home/sacha/scripts/check-health.sh
# Chaque lundi à 8h
0 8 * * 1 /home/sacha/scripts/rapport-hebdo.sh
# Le premier de chaque mois
0 0 1 * * /home/sacha/scripts/nettoyage-mensuel.sh
# Voir les tâches planifiées
crontab -l
Bonnes pratiques de scripting
- Toujours commencer par
#!/bin/bash— le shebang indique l'interpréteur - Utiliser
set -euo pipefailpour arrêter à la première erreur - Quoter les variables :
"$variable"au lieu de$variable - Utiliser
localdans les fonctions pour éviter les effets de bord - Tester avec
shellcheck— un linter pour scripts Bash - Commenter le pourquoi, pas le quoi
- Toujours rediriger les logs dans les tâches cron