我有一个CakePHP database.php 配置文件,我想利用它来打开命令行mysql
客户端实例。
目标是能够像./db-login.sh
从项目根目录一样运行 shell 脚本,并让它从 PHP 配置文件中提取数据库详细信息(主机、端口、数据库名称、用户名、密码)并将它们作为参数传递给mysql
命令行. 这是为了避免每次都输入详细信息。
我知道可以创建一个硬编码值的 shell 别名:我想要一个可以包含在我的任何Cake 项目中的可移植脚本。我还希望将数据库凭据放入 bash 变量的任务与启动mysql
客户端分开。mysqldump
这将打开在其他 shell 脚本(例如备份脚本)中轻松重用数据库凭据的能力。
这是我到目前为止所拥有的:
数据库.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 设置为my
indb-login.sh
。 db-cred.sh
而是在产生中引用字符串"my
。
- 像这样的密码
- 同样,我的引用尝试
PASS_CLAUSE
无效:只有没有空格/引号的密码才能成功登录mysql
客户端。