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

  1. Toujours commencer par #!/bin/bash — le shebang indique l'interpréteur
  2. Utiliser set -euo pipefail pour arrêter à la première erreur
  3. Quoter les variables : "$variable" au lieu de $variable
  4. Utiliser local dans les fonctions pour éviter les effets de bord
  5. Tester avec shellcheck — un linter pour scripts Bash
  6. Commenter le pourquoi, pas le quoi
  7. Toujours rediriger les logs dans les tâches cron