112 lines
3.5 KiB
Bash
112 lines
3.5 KiB
Bash
#!/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" <<EOF
|
|
FLUSH PRIVILEGES;
|
|
ALTER USER 'root'@'localhost' IDENTIFIED BY '$NEW_PASS';
|
|
FLUSH PRIVILEGES;
|
|
EOF
|
|
|
|
# Nettoyage complet du mode sans échec
|
|
echo "[+] Arrêt complet du mode sans échec et des processus MySQL/MariaDB..."
|
|
kill -9 $SAFE_PID
|
|
killall -9 mysqld_safe mariadbd mysqld || true
|
|
sleep 5
|
|
|
|
# Redémarrage du service
|
|
echo "[+] Redémarrage du service $DB_SERVICE..."
|
|
systemctl start "$DB_SERVICE"
|
|
|
|
# Vérification du bon démarrage
|
|
echo "[+] Attente du démarrage complet de MariaDB..."
|
|
for i in {1..10}; do
|
|
if systemctl is-active --quiet "$DB_SERVICE"; then
|
|
echo "[+] MariaDB est démarré."
|
|
break
|
|
fi
|
|
sleep 1
|
|
done
|
|
|
|
if ! systemctl is-active --quiet "$DB_SERVICE"; then
|
|
echo "[❌] MariaDB ne démarre pas. Voir journalctl -xeu $DB_SERVICE"
|
|
systemctl status "$DB_SERVICE"
|
|
exit 1
|
|
fi
|
|
|
|
# Test de connexion avec le nouveau mot de passe
|
|
echo "[+] Test de connexion réel avec le nouveau mot de passe root..."
|
|
if mysql -uroot -p"$NEW_PASS" -e "SELECT 'Connexion réussie' AS Status;" >/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 |