当前位置:首页 > Linux
使用 shell 脚本进行数据加密并操作数据库
来源:靑龍一笑的博客  作者:靑龍一笑  发布时间:2021-12-20 16:29:53  点击量:331  评论:0

    近日,有网友通过邮件问了我一个问题,就是如何使用 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

    执行结果如下:

[root@RicenOS scripts]# ./oper_mysql_db.sh 
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.
版权所有 © 2005-2023 靑龍一笑的博客  Powered by C.S.Ricen
Copyright © 2005-2023 by www.ricensoftwares.com.cn  All Rights Reserved.

欢迎光临本站,这里是靑龍一笑的博客。

因资金匮乏,本站已迁到国外的免费空间,可能导致本站的访问速度较慢,由此给您带来的不便,敬请谅解。

您可以通过下方的“支持本站建设”链接,给本站提供资金支持。

Free Web Hosting