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
相关产品推荐
相关产品推荐

