🔐 Automatisierte Passwort-Generierung für lokale Projekte
Beim Automatisieren meiner WordPress-Umgebung bin ich über ein Problem gestolpert, das ich so nicht erwartet hatte.
Ich konnte mich plötzlich nicht mehr in MySQL einloggen – weder über phpMyAdmin noch über die CLI.
Nur noch:
sudo mysql
Nach einigem Debugging kam dann die eigentliche Ursache:
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
🧠 Das Problem: MySQL Password Policy
Neuere MySQL-Versionen erzwingen standardmäßig eine Passwort-Policy.
Das bedeutet:
- einfache Passwörter werden abgelehnt
- manchmal ohne offensichtlichen Hinweis im Workflow
- bestehende Passwörter funktionieren weiter
- neue schlagen plötzlich fehl
👉 Genau das macht es so verwirrend.
💡 Die Lösung: Automatisierte, policy-sichere Passwörter
Anstatt manuell Passwörter zu wählen, habe ich ein Skript gebaut, das:
- sichere Passwörter generiert
- diese in einer
.envspeichert - konsistent von anderen Skripten genutzt werden kann
🔧 Das Skript
#!/usr/bin/env bash
set -euo pipefailNAME=""
FORCE=false
PRINT=falsefor arg in "$@"; do
case $arg in
--force) FORCE=true ;;
--print-password) PRINT=true ;;
--help)
echo "Usage: generate_credentials <name> [--force] [--print-password]"
exit 0
;;
*)
NAME="$arg"
;;
esac
doneif [[ -z "$NAME" ]]; then
echo "❌ Kein Name angegeben"
exit 1
fiWP_DIR="$HOME/www/$NAME"
ENV_FILE="$WP_DIR/.env"mkdir -p "$WP_DIR"if [[ -f "$ENV_FILE" && "$FORCE" = false ]]; then
echo "⚠️ .env existiert bereits"
echo "👉 Nutze --force zum Überschreiben"
exit 1
figenerate_password() {
while true; do
pw=$(tr -dc 'A-Za-z0-9!@#$%^*()_+=' < /dev/urandom | head -c 20) if [[ "$pw" =~ [A-Z] ]] &&
[[ "$pw" =~ [a-z] ]] &&
[[ "$pw" =~ [0-9] ]] &&
[[ "$pw" =~ [^A-Za-z0-9] ]]; then
echo "$pw"
return
fi
done
}DB_PASSWORD=$(generate_password)cat > "$ENV_FILE" <<EOF
DB_NAME=$NAME
DB_USER=$NAME
DB_PASSWORD=$DB_PASSWORD
EOFchmod 600 "$ENV_FILE"echo "✅ .env erstellt"
echo "👤 Benutzer: $NAME"if [[ "$PRINT" = true ]]; then
echo "🔑 Passwort: $DB_PASSWORD"
else
echo "🔑 Passwort: *********"
fi
🧠 Was ich dabei gelernt habe
1. Regex in Bash ist… speziell
Ich wollte ursprünglich explizit Sonderzeichen prüfen:
[!@#$%^&*()_+=]
👉 führt zu Syntaxfehlern (&!)
Die bessere Lösung:
[^A-Za-z0-9]
👉 „alles außer Buchstaben und Zahlen“
2. .env nicht einfach erweitern
Ein klassischer Fehler:
DB_PASSWORD=abc
DB_PASSWORD=xyz
DB_PASSWORD=123
👉 passiert schnell, wenn man >> statt > nutzt
Deshalb:
cat > file
👉 bewusst überschreiben
3. set -euo pipefail verstehen
Das ist kein magischer Copy-Paste, sondern extrem sinnvoll:
-e→ stoppt bei Fehlern-u→ verhindert nicht gesetzte Variablenpipefail→ erkennt Fehler in Pipes
👉 macht Bash-Skripte deutlich robuster
4. Idempotenz ist wichtiger als man denkt
Mein Skript bricht ab, wenn .env existiert:
--force
👉 bewusstes Überschreiben statt Chaos
🔗 Integration in andere Skripte
Die .env kann einfach geladen werden:
source .env
Und dann z. B.:
wp config create \
--dbname="$DB_NAME" \
--dbuser="$DB_USER" \
--dbpass="$DB_PASSWORD"
🚀 Fazit
Mit einem kleinen Skript habe ich:
- konsistente Credentials
- weniger Fehler
- reproduzierbare Setups
Und vor allem:
👉 ein Problem gelöst, das extrem schwer zu debuggen war

Schreibe einen Kommentar