近日,有网友通过邮件问了我一个问题,就是如何使用 shell 脚本操作 MySQL 数据库,前提是不能把数据库的连接信息暴露出来。
不能暴露数据库连接信息,那么就需要对数据进行加密和解密,可以使用 base64 命令来实现。但是,不能直接在脚本中进行加密,否则,就要在脚本中提供原始的信息了。因此,首先要做的是生成这些加密数据,至于这些数据是保存在文件中,还是数据库中,那就看个人需要了。
这里,我把加密信息保存到 SQLite 数据库中。编写一个 shell 脚本,用来实现这一功能,代码如下:
#!/bin/bash
# 作者:靑龍一笑(C.S.Ricen)
# 功能:将 MySQL 数据库信息进行加密,并写入到 SQLite 数据库中
# MySQL 数据库的连接信息
HOST="10.8.16.18"
PORT="3369"
USER="root"
PASS="p2021#DB"
DBNAME="test"
# 对 MySQL 数据库连接信息进行加密
CIPHER_HOST=`echo ${HOST} | base64 -i`
CIPHER_PORT=`echo ${PORT} | base64 -i`
CIPHER_USER=`echo ${USER} | base64 -i`
CIPHER_PASS=`echo ${PASS} | base64 -i`
CIPHER_DBNAME=`echo ${DBNAME} | base64 -i`
# 将加密后的数据库连接信息写入到 SQLite 数据库中
sqlite3 dbinfo.dat << EOF
create table mdb (host char, port char, user char, pass char, dbname char);
insert into mdb values ("${CIPHER_HOST}", "${CIPHER_PORT}", "${CIPHER_USER}", "${CIPHER_PASS}", "${CIPHER_DBNAME}");
.quit
EOF
exit 0
执行完这个 shell 脚本,会在当前目录下生成一个名为 dbinfo.dat 的数据库文件。把这个 shell 脚本从服务器上移走,只留下 dbinfo.dat 文件即可。
如果当前所在的服务器不是 MySQL 数据库服务器,为了能够远程连接到 MySQL 数据库,还需要 MySQL 客户端工具,可以从 MySQL 官网上下载 MySQL 数据库的二进制安装包(例如:mysql-5.6.51-linux-glibc2.12-x86_64.tar.gz)。不用安装,只需要解压这个安装包,然后把 bin 目录下的两个可执行文件(mysql 和 mysqldump)拷贝到当前脚本所在的目录下。
接下来,编写操作数据库的 shell 脚本,代码如下:
#!/bin/bash
# 作者:靑龍一笑(C.S.Ricen)
# 功能:操作 MySQL 数据库
# 引入 MySQL 客户端工具
export PATH=.:${PATH}
# 读取 SQLite 数据库数据
SQLITE_COMMAND="sqlite3 dbinfo.dat"
###### 注意语法格式 ######
# done 和 < 之间没有空格 #
# 两个 < 之间有一个空格 #
# < 和 ( 之间没有空格 #
##########################
while read line
do
DBINFO=${line}
done< <(echo "select * from mdb;" | ${SQLITE_COMMAND})
# 提取数据库连接信息
HOST=`echo ${DBINFO} | awk -F '|' '{print $1}'`
PORT=`echo ${DBINFO} | awk -F '|' '{print $2}'`
USER=`echo ${DBINFO} | awk -F '|' '{print $3}'`
PASS=`echo ${DBINFO} | awk -F '|' '{print $4}'`
DBNAME=`echo ${DBINFO} | awk -F '|' '{print $5}'`
# 对 SQLite 中的数据库信息进行解密
PLAIN_HOST=`echo ${HOST} | base64 -d`
PLAIN_PORT=`echo ${PORT} | base64 -d`
PLAIN_USER=`echo ${USER} | base64 -d`
PLAIN_PASS=`echo ${PASS} | base64 -d`
PLAIN_DBNAME=`echo ${DBNAME} | base64 -d`
# 执行 MySQL 查询语句
MYSQL_COMMAND="mysql -h${PLAIN_HOST} -P${PLAIN_PORT} -u${PLAIN_USER} -p${PLAIN_PASS} ${PLAIN_DBNAME}"
# 第 0 行
row=0
###### 注意语法格式 ######
# done 和 < 之间没有空格 #
# 两个 < 之间有一个空格 #
# < 和 ( 之间没有空格 #
##########################
while read line
do
# 变量 row 自增
let row+=1
if [ ${row} -eq 1 ]; then
# 由于第 1 行是数据库的字段名,需要跳过
continue
fi
# 从第 2 行开始取各字段数据
ID=${line[0]}
NAME=${line[1]}
SEX=${line[2]}
AGE=${line[3]}
# 输出字段的值
echo ${ID} ${NAME} ${SEX} ${AGE}
done< <(echo "select * from person;" | ${MYSQL_COMMAND})
# 变量 row 自减
let row-=1
echo 总共有 ${row} 条记录。
# 执行 MySQL 插入语句
mysql -h${PLAIN_HOST} -P${PLAIN_PORT} -u${PLAIN_USER} -p${PLAIN_PASS} ${PLAIN_DBNAME} -e "insert into person (name, sex, age) values ('赵六', '男', '39'),('孙七', '男', '16');"
# 备份 MySQL 数据库
mysqldump -h${PLAIN_HOST} -P${PLAIN_PORT} -u${PLAIN_USER} -p${PLAIN_PASS} ${PLAIN_DBNAME} > ${PLAIN_DBNAME}.sql
exit 0
执行结果如下:
Warning: Using a password on the command line interface can be insecure.
1 张三 男 26
2 李四 男 19
3 王五 男 32
总共有 3 条记录。
Warning: Using a password on the command line interface can be insecure.
Warning: Using a password on the command line interface can be insecure.
Copyright © 2005-2023 by www.ricensoftwares.com.cn All Rights Reserved.