MySQL报错1044/1045:交互登录成功 命令行传密码访问被拒绝
问题原因说明
密码包含美元符号是导致该问题的直接原因,同时你使用的部分传参写法本身存在语法错误:
- 语法错误问题:
mysql -u mlimon -p mySqlPassword这种写法本身不符合MySQL命令规范,-p参数后跟明文密码时,参数和密码之间不能加空格,加空格后MySQL会将后面的字符串识别为要连接的数据库名,而非密码,必然会触发权限报错。 - 特殊字符解析问题:交互输入密码时,输入内容不会经过Shell的特殊字符预处理,会原封不动传递给MySQL做校验,因此包含美元符号的密码可以正常校验通过。但直接写在命令行的参数会先经过Shell解析,美元符号
$会被Shell识别为变量前缀,触发变量替换逻辑,比如密码为abc$123时,Shell会尝试读取$123对应的变量值,无对应变量时该部分会被替换为空,最终传递给MySQL的密码为abc,和真实密码不一致,因此报权限错误。 - HereDoc写法的逻辑问题:
mysql -umlimon -p <<MY_QUERY这种写法中-p后未携带密码,MySQL会等待用户交互输入密码,非交互场景下没有输入就会直接报错。
解决方案
1. 单引号包裹密码(最便捷)
单引号会让Shell忽略内部所有特殊字符,不会触发美元符号的变量解析,注意-p和单引号之间不要加空格,示例:
# 直接登录 mysql -u mlimon -p'你的实际密码' # 批量执行SQL语句 mysql -u mlimon -p'你的实际密码' <<MY_QUERY USE mysql SHOW tables; MY_QUERY # 单条SQL执行 mysql -u mlimon -p'你的实际密码' -e "USE mysql; SHOW tables;"
2. 使用配置文件(更安全,避免明文密码泄露)
创建仅当前用户可读的MySQL客户端配置文件,例如~/.mysql_login.cnf,写入内容:
[client] user = mlimon password = 你的实际密码(无需转义特殊字符)
执行权限限制命令:chmod 600 ~/.mysql_login.cnf,避免其他用户读取密码。
后续使用时直接指定配置文件即可,不需要在命令行传密码:
mysql --defaults-extra-file=~/.mysql_login.cnf <<MY_QUERY USE mysql SHOW tables; MY_QUERY
内容的提问来源于stack exchange,提问作者mlimon
相关产品推荐
相关产品推荐

