Ich habe eine CakePHP database.php-Konfigurationsdatei, die ich nutzen möchte, um eine Befehlszeilen mysql
Client-Instanz zu öffnen.
Das Ziel wäre, in der Lage zu sein, ein Shell-Skript wie ./db-login.sh
vom Projektstamm auszuführen und die Datenbankdetails (Host, Port, Datenbankname, Benutzername, Passwort) aus der PHP-Konfigurationsdatei abzurufen und sie als Argumente an die Befehlszeile von mysql
zu übergeben. Dies soll verhindern, dass die Details jedes Mal eingegeben werden müssen.
Es ist möglich, eine Shell-Alias zu erstellen, bei dem die Werte fest codiert sind: Ich möchte jedoch ein portables Skript, das bei jedem meiner Cake-Projekte enthalten sein könnte. Ich möchte auch die Aufgabe, die DB-Anmeldeinformationen in Bash-Variablen zu erhalten, getrennt vom Starten des mysql
Clients halten. Dadurch würde es möglich sein, die DB-Anmeldeinformationen leicht in anderen Shell-Skripts wiederzuverwenden (wie z.B. ein mysqldump
Backup-Skript).
Hier ist, was ich bisher habe:
database.php
Betrachte diese Datei als unveränderlich für die Zwecke dieser Frage. Sie muss genau so existieren, wie du sie siehst.
'localhost',
'login' => 'cakephpuser',
'password' => 'c4k3 roxx!',
'database' => 'my_cakephp_project',
);
}
db-cred.sh
Wirkt als Zwischenstelle zur Umwandlung der PHP-Variablen in bash (freundliche) Variablen.
#!/usr/bin/env php
default['password']) ? "\"$db->default['password']\"" : '');
echo <<
``
db-login.sh
#!/usr/bin/env bash
# Verwendet Cakes database.php-Datei, um mysql auf der Befehlszeile mit den korrekten Argumenten anzumelden.
# Widerlich, aber nichts anderes funktioniert!
eval $( db-cred.sh )
# Versuche, eine geeignete Passwort-Klausel zu setzen.
PATTERN=" |'"
if [ -n "$DB_PASS" ]; then
if [[ $DB_PASS =~ $PATTERN ]]; then
PASS_CLAUSE=" -p'${DB_PASS}'"
else
PASS_CLAUSE=" -p${DB_PASS}"
fi
else
PASS_CLAUSE=""
fi
# Einen groben Überblick über das, was wir gleich ausführen werden.
echo mysql --host=${DB_HOST} --database=${DB_NAME} --user=${DB_USER}${PASS_CLAUSE}
# MySQL aufrufen.
mysql --host=${DB_HOST} --database=${DB_NAME} --user=${DB_USER}${PASS_CLAUSE}
Dinge, die Hilfe benötigen:
- Das Skript
db-login.sh
verwendet eval, um die Variablen einzulesen. Yuck. - Das MySQL-Passwort wird auf der Befehlszeile preisgegeben. Dies ist kein Ausschlusskriterium, aber wenn es einen sauberen/portablen Weg gibt, dies zu vermeiden, bin ich dafür offen.
- Leerzeichen und Anführungszeichen im mysql-Passwort werden nicht ordnungsgemäß an bash übergeben.
- Ein Passwort wie
my Pass
wird dazu führen, dass DB_PASS indb-login.sh
aufmy
gesetzt wird. - Das Umrahmen des Strings in
db-cred.sh
führt stattdessen zu"my
.
- Ein Passwort wie
- Auch meine Versuche,
PASS_CLAUSE
zu umrahmen, sind nicht wirksam: Nur Passwörter ohne Leerzeichen/Anführungszeichen können sich erfolgreich ammysql
Client anmelden.
``