使用Bash从表更新用户密码:MySQL查询执行报错求助
解决Bash脚本中MySQL更新密码报错的问题
踩过类似的坑,大概率是密码里的特殊字符被Bash给解析乱了,或者你读取/传递密码的方式不对,给你几个实用的解决方向:
1. 先确保密码读取的姿势正确
如果你的密码里包含$、!、*这类Bash特殊字符,用普通的read命令会把它们转义或者吃掉,一定要加-r选项防止反斜杠被转义,再加-s隐藏输入更安全:
# 读取密码,-r保留原始字符,-s隐藏输入 read -r -s -p "请输入新密码:" new_pass echo # 换行用的,不然光标会留在输入行末尾
2. 用对应MySQL版本的正确语法更新密码
不同版本的MySQL更新密码的语法不一样,别用错了:
- MySQL 5.7及更早版本:用
SET PASSWORD配合PASSWORD()函数mysql -e "SET PASSWORD FOR '你的用户名'@'localhost' = PASSWORD('$new_pass');" - MySQL 8.0及以上版本:
PASSWORD()函数被弃用,改用ALTER USERmysql -e "ALTER USER '你的用户名'@'localhost' IDENTIFIED BY '$new_pass';"
3. 处理含特殊字符的密码(关键!)
如果密码里有单引号'、美元符$这类会搞砸SQL的字符,得先转义:
处理单引号
如果密码里有单引号,直接代入SQL会导致语法错误,用sed把单引号替换成双单引号(MySQL识别这个作为转义):
# 转义密码里的单引号 escaped_pass=$(echo "$new_pass" | sed "s/'/''/g") # 再执行更新 mysql -e "ALTER USER '你的用户名'@'localhost' IDENTIFIED BY '$escaped_pass';"
避免Bash解析美元符
如果密码里有$,直接用双引号包裹SQL时,Bash会把$xxx当成变量解析,这时候可以先把密码用单引号赋值,或者用heredoc传递SQL(注意EOF不要加引号,让变量正常展开):
# 用单引号赋值,避免Bash解析$ new_pass='my$secret!pass123' mysql -e "ALTER USER '你的用户名'@'localhost' IDENTIFIED BY '$new_pass';"
4. 先测试再执行
不确定问题出在哪的话,先把要执行的SQL打印出来看看,就能知道是不是Bash篡改了密码:
echo "ALTER USER '你的用户名'@'localhost' IDENTIFIED BY '$new_pass';"
如果打印出来的密码和你输入的不一样,那就是读取或者转义的问题,对着调整就行。
内容的提问来源于stack exchange,提问作者ZackAttack
相关产品推荐
相关产品推荐

