#!/bin/bash # Basé sur un travail de Cédric Abonnel / Cédrix sous licence CC BY-NC 4.0 # Importer les fonctions communes source "$(dirname "$0")/../common/common_utils.sh" # Vérifier si le script est exécuté en root check_root # Variables NEW_PASS=$(generate_token 20) DB_SERVICE="mariadb" # Adapter si besoin MYSQL_SOCK="/var/run/mysqld/mysqld.sock" CNF_FILES=("/etc/mysql/debian.cnf" "/root/.my.cnf") MYSQLD_SAFE_LOG="/tmp/mysqld_safe.log" echo "[+] Nouveau mot de passe root généré." # Arrêt du service MySQL/MariaDB echo "[+] Arrêt du service $DB_SERVICE..." systemctl stop "$DB_SERVICE" echo "[+] Attente de l'arrêt complet du service..." while systemctl is-active --quiet "$DB_SERVICE"; do sleep 1 done echo "[+] Service arrêté." # Nettoyage des éventuels sockets ou PID bloquants echo "[+] Nettoyage des sockets et PID..." rm -f /var/run/mysqld/mysqld.pid /var/run/mysqld/mysqld.sock # Démarrage en mode sans échec echo "[+] Démarrage de MySQL en mode sans échec..." mysqld_safe --skip-grant-tables --skip-networking > "$MYSQLD_SAFE_LOG" 2>&1 & SAFE_PID=$! # Attente que mysqld_safe soit vraiment prêt echo "[+] Attente de la disponibilité de mysqld_safe..." for i in {1..10}; do if mysqladmin ping --socket="$MYSQL_SOCK" >/dev/null 2>&1; then echo "[+] mysqld_safe est prêt." break fi sleep 1 done if ! mysqladmin ping --socket="$MYSQL_SOCK" >/dev/null 2>&1; then echo "[❌] Échec du démarrage de mysqld_safe. Voir $MYSQLD_SAFE_LOG" kill -9 $SAFE_PID 2>/dev/null exit 1 fi # Réinitialisation du mot de passe root echo "[+] Réinitialisation du mot de passe root..." mysql --socket="$MYSQL_SOCK" </dev/null 2>&1; then echo "[✔] Connexion root réussie." # Mise à jour des fichiers .cnf si user = root for file in "${CNF_FILES[@]}"; do if [[ -f "$file" ]]; then if grep -q "^\s*user\s*=\s*root" "$file"; then echo "[+] Mise à jour du fichier $file (user=root détecté)." sed -i -E "s/(password\s*=\s*).*/\1$NEW_PASS/" "$file" else echo "[!] Pas de user=root dans $file, aucune modification." fi fi done echo "---------------------------------------------" echo "[✔] Mot de passe root MySQL/MariaDB réinitialisé avec succès." echo "[✔] Nouveau mot de passe root : $NEW_PASS" echo "---------------------------------------------" else echo "[❌] Échec de la connexion root après redémarrage de MariaDB." exit 1 fi