コマンドラインクライアントインスタンスを開くために利用したいCakePHP database.php 構成ファイルがあります。mysql
目標は、プロジェクト ルートなどからシェル スクリプトを実行し./db-login.sh
、PHP 構成ファイルからデータベースの詳細 (ホスト、ポート、データベース名、ユーザー名、パスワード) を取得して、mysql
引数としてコマンド ラインに渡すことができるようにすることです。 . これは、毎回詳細を入力する手間を省くためです。
値がハードコーディングされたシェル エイリアスを作成できることは理解しています。Cake プロジェクトに含めることができる移植可能なスクリプトが必要です。mysql
また、クライアントの起動とは別に、DB 資格情報を bash 変数に取得するタスクを保持したいと考えています。mysqldump
これにより、他のシェル スクリプト (バックアップ スクリプトなど) で DB 資格情報を簡単に再利用できるようになります。
これが私がこれまでに持っているものです:
データベース.php
この質問の目的のために、このファイルは不変であると考えてください。あなたが見ているとおりに存在しなければなりません。
<?php
class DATABASE_CONFIG {
public $default = array(
'host' => 'localhost',
'login' => 'cakephpuser',
'password' => 'c4k3 roxx!',
'database' => 'my_cakephp_project',
);
}
db-cred.sh
PHP 変数を bash (フレンドリ) 変数に変換するミドルウェアとして機能します。
#!/usr/bin/env php
<?php
include 'database.php';
$db = new DATABASE_CONFIG();
// Selectively wrap quotes. Has no real effect(?)
$p = (!empty($db->default['password']) ? "\"$db->default['password']\"" : '');
echo <<<EOD
DB_HOST="{$db->default['host']}"
DB_NAME="{$db->default['database']}"
DB_USER="{$db->default['login']}"
DB_PASS={$p}
EOD;
db-login.sh
#!/usr/bin/env bash
# Uses Cake's database.php file to log into mysql on the
# command line with the correct arguments.
# Holy yuck, but nothing else works!
eval $( db-cred.sh )
# Try to set an appropriate password clause.
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
# Get a rough look at what we're about to run.
echo mysql --host=${DB_HOST} --database=${DB_NAME} --user=${DB_USER}${PASS_CLAUSE}
# Call MySQL.
mysql --host=${DB_HOST} --database=${DB_NAME} --user=${DB_USER}${PASS_CLAUSE}
助けが必要なこと:
db-login.sh
スクリプトは eval を使用して変数を吸い込みます。うん。- MySQL のパスワードがコマンド ラインで漏洩します。これはディールブレーカーではありませんが、それを回避するためのクリーンでポータブルな方法があれば、私はそれを受け入れます。
- mysql パスワードのスペースと引用符は、bash に正しく渡されません。
- のようなパスワード
my Pass
により、DB_PASS が in に設定さmy
れdb-login.sh
ます。 - 代わりに
db-cred.sh
生成される文字列を引用します。"my
- のようなパスワード
- 同様に、私の引用の試み
PASS_CLAUSE
は効果的ではありません: スペース/引用符のないパスワードのみがmysql
クライアントに正常にログインします。