You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Shell脚本中执行含特殊字符密码的MySQL命令失败排查

解决Shell脚本中带特殊字符的mysql参数问题

问题出在你用普通变量存储命令参数的方式——Shell在解析普通变量时,会把变量里的内容按空格拆分,而且你加的单引号只是普通字符,不会被Shell当作参数边界来处理,导致你的密码被拆成了多个无效参数,mysql自然识别失败返回帮助。

正确的做法是用数组来存储命令参数,数组能完美保留每个参数的完整性,哪怕参数里包含空格、&这类特殊字符:

修改后的代码示例

# 用数组存储mysql参数,每个参数单独作为数组元素
DBPARAMS=(-u "$user" --password="${password}")

# 执行命令时展开数组,注意用[@]和双引号
echo "$sql" | mysql "${DBPARAMS[@]}" --disable-pager -h "$dbhost" -P "$dbport" || die "Cannot run mysql"

为什么数组能解决问题

${DBPARAMS[@]}在Shell中展开时,数组的每个元素会被当作独立的命令行参数传递给mysql。比如你的密码adm in & cd /root & touch hacked &会被完整地作为--password的参数值,不会被拆分成多个部分,mysql就能正确解析了。

之前用普通变量的方式,Shell会把DBPARAMS的内容拆成-u、用户名、--password='adm、in、&、cd等一堆零散的参数,mysql根本无法识别这些混乱的输入,所以直接返回了帮助信息。

内容的提问来源于stack exchange,提问作者str028

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 20:07:37