Passwort-Generierung & .env-Handling

🔐 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 .env speichert
  • 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 Variablen
  • pipefail → 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

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert