Avant d'exécuter un script
Lis le script, adapte les variables, puis teste-le sur une machine de laboratoire. Pour Bash :
chmod +x script.sh, puis sudo ./script.sh seulement si les commandes exigent root.1. Ajouter un utilisateur Linux
Crée le compte, l'ajoute à un groupe d'administration ou métier et force le changement de mot de passe à la première connexion.
#!/bin/bash
set -euo pipefail
UTILISATEUR="${1:-}"
GROUPE="${2:-partage}"
if [[ -z "$UTILISATEUR" ]]; then
echo "Usage : $0 utilisateur [groupe]"
exit 1
fi
getent group "$GROUPE" >/dev/null || groupadd "$GROUPE"
if id "$UTILISATEUR" >/dev/null 2>&1; then
echo "Le compte $UTILISATEUR existe déjà."
else
useradd -m -s /bin/bash "$UTILISATEUR"
passwd "$UTILISATEUR"
chage -d 0 "$UTILISATEUR"
fi
usermod -aG "$GROUPE" "$UTILISATEUR"
id "$UTILISATEUR"
sudo ./ajouter-utilisateur.sh alice partageExemple2. Créer plusieurs utilisateurs depuis un CSV
Format conseillé : login;nom_complet;groupe. Le mot de passe n'est pas conservé en clair dans le CSV.
#!/bin/bash
set -euo pipefail
FICHIER="${1:-utilisateurs.csv}"
while IFS=';' read -r LOGIN NOM_COMPLET GROUPE; do
[[ -z "$LOGIN" || "$LOGIN" == "login" ]] && continue
getent group "$GROUPE" >/dev/null || groupadd "$GROUPE"
if ! id "$LOGIN" >/dev/null 2>&1; then
useradd -m -s /bin/bash -c "$NOM_COMPLET" -G "$GROUPE" "$LOGIN"
TEMP_MDP=$(openssl rand -base64 12)
echo "$LOGIN:$TEMP_MDP" | chpasswd
chage -d 0 "$LOGIN"
printf '%s;%s\n' "$LOGIN" "$TEMP_MDP" >> mots-de-passe-temporaires.csv
fi
done < "$FICHIER"
chmod 600 mots-de-passe-temporaires.csv
Le fichier des mots de passe temporaires est sensible : remets chaque mot de passe par un canal sûr, puis supprime le fichier.
3. Tester une liste de serveurs
#!/bin/bash
set -u
FICHIER="${1:-serveurs.txt}"
while IFS= read -r SERVEUR; do
[[ -z "$SERVEUR" || "$SERVEUR" =~ ^# ]] && continue
if ping -c 1 -W 1 "$SERVEUR" >/dev/null 2>&1; then
echo "[OK] $SERVEUR répond"
else
echo "[KO] $SERVEUR ne répond pas"
fi
done < "$FICHIER"4. Tester un port TCP
#!/bin/bash
HOTE="${1:?Indiquer un hôte}"
PORT="${2:?Indiquer un port}"
if timeout 3 bash -c "</dev/tcp/$HOTE/$PORT" 2>/dev/null; then
echo "[OK] $HOTE:$PORT est accessible"
else
echo "[KO] $HOTE:$PORT est fermé ou filtré"
fi
./test-port.sh dc01.warx.home 445Tester SMB5. Sauvegarde datée avec rsync
#!/bin/bash
set -euo pipefail
SOURCE="/srv/donnees/"
DESTINATION="/mnt/sauvegardes/donnees/"
LOG="/var/log/sauvegarde-donnees.log"
mkdir -p "$DESTINATION"
rsync -aHAX --delete "$SOURCE" "$DESTINATION" >> "$LOG" 2>&1
echo "$(date '+%F %T') : sauvegarde terminée" >> "$LOG"
--delete supprime dans la destination ce qui n'existe plus dans la source. Tester d'abord avec --dry-run.6. Vérifier et relancer un service
#!/bin/bash
SERVICE="${1:?Indiquer un service}"
if systemctl is-active --quiet "$SERVICE"; then
echo "[OK] $SERVICE est actif"
else
echo "[ALERTE] $SERVICE est arrêté, tentative de redémarrage"
systemctl restart "$SERVICE"
systemctl --no-pager --full status "$SERVICE"
fi7. Rapport réseau rapide
#!/bin/bash
RAPPORT="rapport-reseau-$(hostname)-$(date +%F-%H%M).txt"
{
echo "=== Hôte ==="; hostnamectl
echo "=== Adresses ==="; ip -br address
echo "=== Routes ==="; ip route
echo "=== DNS ==="; resolvectl status 2>/dev/null || cat /etc/resolv.conf
echo "=== Ports en écoute ==="; ss -lntup
echo "=== Services en échec ==="; systemctl --failed --no-pager
} > "$RAPPORT"
echo "Rapport créé : $RAPPORT"