BASH脚本传递数组中MySQL参数失败:WordPress数据库连接求助
解决BASH脚本连接MySQL读取WordPress wp-options表的密码识别问题
嘿,我可太懂这种明明账号密码都对,但MySQL就是不认账的憋屈了!大概率是你在bash脚本里传递密码的姿势不对,或者数组变量处理有坑,我给你拆解几个常见问题和解决办法:
最容易踩的低级坑:MySQL命令行传密码的格式
很多人会犯这个错:在-p后面加空格再写密码,比如mysql -u user -p password——这绝对会失败!MySQL会把password当成数据库名,而不是密码!
正确的写法是:
-p和密码之间没有空格,比如-p"${db_pass}"- 或者用更清晰的
--password="${db_pass}"参数
如果密码里包含特殊字符(比如!@#$%^&*()),bash会自动解析这些字符,所以必须用双引号把密码包裹起来,避免被当成shell命令或者变量。
数组变量的隐藏问题:可能带了换行/空格
你说数组是从文件读取的,那很可能数组元素后面带了换行符或者多余的空格!比如用read或者readarray读取文件时,没处理换行,导致密码实际是yourpass\n,MySQL自然认不出来。
解决办法:用xargs或者tr清理多余字符:
# 假设数组索引0是库名,1是用户名,2是密码 db_name=$(echo "${db_info[0]}" | xargs) db_user=$(echo "${db_info[1]}" | xargs) db_pass=$(echo "${db_info[2]}" | xargs) # xargs会自动去掉首尾的空格、换行、制表符
更安全且靠谱的方案:用MYSQL_PWD环境变量
命令行传密码不仅容易踩坑,还会在ps命令里暴露密码,非常不安全。推荐用MySQL官方支持的MYSQL_PWD环境变量来传递密码:
完整可运行的示例脚本
#!/bin/bash # 从文件读取数据库信息到数组(每行一个值:库名、用户名、密码) readarray -t db_info < db_credentials.txt # 清理数组元素的多余字符 db_name=$(echo "${db_info[0]}" | xargs) db_user=$(echo "${db_info[1]}" | xargs) db_pass=$(echo "${db_info[2]}" | xargs) # 设置环境变量传递密码(避免命令行暴露,同时解决特殊字符问题) export MYSQL_PWD="${db_pass}" # 执行查询命令,读取wp-options的home和site_url字段 mysql -u "${db_user}" -D "${db_name}" -e " SELECT option_name, option_value FROM wp_options WHERE option_name IN ('home', 'site_url'); " # 可选:如果不需要保留环境变量,执行完可以unset unset MYSQL_PWD
额外排查点(如果以上都不行)
- 检查MySQL用户的权限:确保该用户有访问目标数据库和wp-options表的权限,并且允许从当前主机连接(比如
user@localhost而不是user@%) - MySQL 8.0+认证问题:如果是MySQL 8.0以上,默认用
caching_sha2_password认证插件,有些旧版的mysql客户端不支持,你可以把用户改成mysql_native_password:ALTER USER 'your_user'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_pass'; FLUSH PRIVILEGES;
内容的提问来源于stack exchange,提问作者Sparky1




