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

Nous utilisons Microsoft Clarity pour comprendre comment le site est utilisé et l'améliorer. En poursuivant votre navigation, vous l'acceptez. Vous pouvez le désactiver à tout moment.