引出问题
做数据加工的同学有时需要通过shell脚本执行sql语句操作MySQL, 对于下面的命令应该并不陌生。
1 | mysql -h${mysql_host} -P${mysql_port} -u${mysql_user} -p${mysql_password} ${mysql_dbname} -e "source ./sql/sql1.sql" |
如果直接将密码写到命令行将出现如下的警告
Warning: Using a password on the command line interface can be insecure.

那么用shell脚本操作MySQL时如何避免将密码明文写到shell脚本中呢? 本文提供2种思路
解决思路
思路1 defaults-extra-file 选项
defaults-extra-file 是 mysql 命令的一个选项,它允许你指定一个包含额外配置信息的配置文件,对于在执行mysql命令时提供一些额外的配置非常有用。
具体命令
1 | mysql --defaults-extra-file=./my.cnf -e "source ./sql/sql1.sql" |
可以看到这里并没有在命令行中指定数据库连接信息,而是将这些信息配置在配置文件./my.cnf中
my.cnf
1 | [client] |
思路2 MySQL 安全登陆工具 mysql_config_editor
mysql_config_editor 是MySQL自带的一款用于安全加密登录的工具,可以在一些场合避免使用明文密码;另外如果使用mysql命令登录数据库也可以避免每次都输入一堆参数。
具体使用方式
步骤1: 先用 mysql_config_editor 添加一个login-path
1 | mysql_config_editor set -G test-login-path1 -h ${mysql_host} -P ${mysql_port} -u ${mysql_user} -p |
- 该命令用
mysql_config_editor创建一个名为test-login-path1的login-path - 其会将登录MySQL的 username、password、port等信息加密存入一个隐藏文件 ~/.mylogin.cnf
- 该文件可作为连接MySQL服务器的认证凭证,以后在命令行或者脚本中可免于输入明文密码,安全方便
步骤2: 连接数据库时指定login-path即可,不需要再指定数据库信息
如下演示2个使用 –login-path 参数的命令
登录mysql的场景
1 | mysql --login-path=test-login-path1 |
连接mysql 并执行sql语句的场景
1 | mysql --login-path=test-login-path1 -e "source ./sql/sql1.sql" |
是不是挺方便? 这样既避免了敏感信息的暴露,也避免了重复输入登录信息,方便了运维人员的工作。
总结
本文详细探讨了两种连接 MySQL 时避免将密码以明文形式写入shell 脚本的策略。通过采纳这些最佳实践,我们在完成工作的基础上,进一步加强了对敏感信息的保护。这些技巧的应用不仅提升了系统的安全水平,还展现了对隐私和敏感信息负责任的态度, 快点实践起来吧!
微信端的朋友也可关注我的公众号
