scripts pour mysql

This commit is contained in:
2025-03-22 11:52:23 +01:00
parent 4ee5bcc04f
commit 9b29b85fb2
5 changed files with 323 additions and 0 deletions

View File

@@ -0,0 +1,151 @@
#!/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
echo "=== Gestion du mot de passe administrateur ==="
# Vérifier la présence de la commande mysql
if ! command -v mysql >/dev/null 2>&1; then
echo "❌ La commande 'mysql' est introuvable. Veuillez l'installer."
exit 1
fi
# Fonction de recherche dans un fichier cnf ou conf
get_password_from_cnf() {
local file=$1
if [[ -f "$file" ]]; then
PASSWORD=$(grep -m1 'password\s*=' "$file" | sed -E 's/.*password\s*=\s*//;s/"//g')
if [[ -n "$PASSWORD" ]]; then
echo "$PASSWORD"
return 0
fi
fi
return 1
}
# Tentative de récupération depuis /etc/mysql/debian.cnf
DB_ROOT_PASSWORD=$(get_password_from_cnf "/etc/mysql/debian.cnf")
if [[ -n "$DB_ROOT_PASSWORD" ]]; then
echo "✅ Mot de passe root récupéré depuis /etc/mysql/debian.cnf"
else
# Recherche dans d'autres fichiers .cnf ou .conf
for file in /etc/mysql/*.cnf /etc/mysql/conf.d/*.cnf /etc/my.cnf /etc/my.cnf.d/*.cnf; do
DB_ROOT_PASSWORD=$(get_password_from_cnf "$file")
if [[ -n "$DB_ROOT_PASSWORD" ]]; then
echo "✅ Mot de passe root trouvé dans $file"
break
fi
done
fi
# Si toujours rien, demande à l'utilisateur
if [[ -z "$DB_ROOT_PASSWORD" ]]; then
echo -n "🔐 Entrez le mot de passe root pour MariaDB : "
read -r -s USER_PASSWORD
echo
DB_ROOT_PASSWORD="$USER_PASSWORD"
fi
# Création d'un fichier temporaire sécurisé pour la connexion MySQL
TEMP_CNF=$(mktemp)
chmod 600 "$TEMP_CNF"
cat > "$TEMP_CNF" <<EOF
[client]
user=root
password=$DB_ROOT_PASSWORD
EOF
# TEST du mot de passe root
echo "🔎 Test de connexion avec le mot de passe root..."
if ! mysql --defaults-extra-file="$TEMP_CNF" -e "SELECT 1;" 2>/dev/null; then
echo "❌ Échec de la connexion avec le mot de passe root. Arrêt du script."
rm -f "$TEMP_CNF"
exit 1
fi
echo "✅ Connexion root réussie."
echo "=== Création d'une nouvelle base de données MariaDB ==="
# Lecture du nom de la base de données
read -rp "Nom de la base de données : " DB_NAME
if [[ -z "$DB_NAME" ]]; then
echo "❌ Nom de base de données requis."
rm -f "$TEMP_CNF"
exit 1
fi
# Vérification de l'existence de la base de données
DB_EXISTS=$(mysql --defaults-extra-file="$TEMP_CNF" -sse "SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME='$DB_NAME'")
if [[ "$DB_EXISTS" == "$DB_NAME" ]]; then
echo "❌ La base de données '$DB_NAME' existe déjà."
rm -f "$TEMP_CNF"
exit 1
fi
# Lecture du nom de l'utilisateur
read -rp "Nom de l'utilisateur : " DB_USER
if [[ -z "$DB_USER" ]]; then
echo "❌ Nom d'utilisateur requis."
rm -f "$TEMP_CNF"
exit 1
fi
# Vérification de l'existence de l'utilisateur
USER_EXISTS=$(mysql --defaults-extra-file="$TEMP_CNF" -sse "SELECT COUNT(*) FROM mysql.user WHERE user='$DB_USER'")
if [[ "$USER_EXISTS" -gt 0 ]]; then
echo " L'utilisateur '$DB_USER' existe déjà. Il ne sera pas recréé."
CREATE_USER_SQL=""
USER_PASS_TO_SAVE=""
else
echo "✅ L'utilisateur '$DB_USER' sera créé."
# Demande du mot de passe utilisateur ou génération
read -rsp "Mot de passe de l'utilisateur (laisser vide pour générer) : " DB_PASS
echo
if [[ -z "$DB_PASS" ]]; then
DB_PASS=$(generate_token 64)
echo "🔑 Mot de passe généré : $DB_PASS"
fi
CREATE_USER_SQL="CREATE USER '$DB_USER'@'localhost' IDENTIFIED BY '$DB_PASS';"
USER_PASS_TO_SAVE="$DB_PASS"
fi
# Création de la base et attribution des droits
SQL=$(cat <<EOF
CREATE DATABASE \`$DB_NAME\` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
$CREATE_USER_SQL
GRANT ALL PRIVILEGES ON \`$DB_NAME\`.* TO '$DB_USER'@'localhost';
FLUSH PRIVILEGES;
EOF
)
echo "✅ Exécution de la création..."
if mysql --defaults-extra-file="$TEMP_CNF" -e "$SQL"; then
echo "🎉 Base de données '$DB_NAME' créée et droits attribués à '$DB_USER'."
else
echo "❌ Erreur lors de la création."
rm -f "$TEMP_CNF"
exit 1
fi
# Sauvegarde des identifiants
if [[ -n "$USER_PASS_TO_SAVE" ]]; then
TIMESTAMP=$(date +%Y%m%d%H%M%S)
CRED_FILE="db_${DB_NAME}_${TIMESTAMP}.credentials"
umask 077 # Restriction immédiate des droits sur le fichier
{
printf "Base: %s\n" "$DB_NAME"
printf "User: %s\n" "$DB_USER"
printf "Password: %s\n" "$USER_PASS_TO_SAVE"
} > "$CRED_FILE"
echo "🔒 Identifiants sauvegardés dans $CRED_FILE"
fi
# Nettoyage du fichier temporaire de connexion
rm -f "$TEMP_CNF"