通过SSH调用MySQL的Bash脚本返回权限拒绝错误求助
解决Bash脚本中MySQL远程登录的权限错误与警告问题
我一眼就看出问题出在here-doc的变量解析上,咱们一步步拆解解决:
核心原因:密码中的$被Bash意外解析
你的脚本用了<< EOF的here-doc语法,这种模式下本地Bash会自动解析内容里的变量(比如$xxx格式的内容)。你的密码_kHaTX(!G_$=Y5Xa里包含$=Y5Xa,Bash会把它当作一个变量去尝试展开,但这个变量根本不存在,所以实际传到MySQL的密码变成了_kHaTX(!G_——少了后面的关键部分,自然就触发ERROR 1045的权限拒绝错误了。
快速修复方法
方法1:禁用here-doc的变量解析(推荐)
把<< EOF改成<< 'EOF',用单引号包裹分界符,这样here-doc里的所有内容都会原样传递给远程SSH的shell,不会被本地Bash解析变量:
#!/bin/bash ssh user@myhost.com << 'EOF' /usr/bin/mysql -h localhost -u root -p_kHaTX(!G_$=Y5Xa show databases; EOF
方法2:转义密码中的$符号
如果不想修改分界符,就把密码里的$转义成\$,让Bash把它当作普通字符处理:
#!/bin/bash ssh user@myhost.com << EOF /usr/bin/mysql -h localhost -u root -p_kHaTX(!G_\$=Y5Xa show databases; EOF
处理命令行密码的安全警告
关于[Warning] Using a password on the command line interface can be insecure这个警告,更安全的做法是在远程主机上配置MySQL的客户端配置文件:
- 登录到
myhost.com,创建~/.my.cnf文件:
[client] user=root password=_kHaTX(!G_$=Y5Xa host=localhost
- 设置文件权限为600(避免其他用户读取敏感信息):
chmod 600 ~/.my.cnf
- 之后脚本里的MySQL命令可以简化成:
#!/bin/bash ssh user@myhost.com << 'EOF' /usr/bin/mysql show databases; EOF
这样既消除了警告,也避免了在脚本里明文写密码,安全性更高。
内容的提问来源于stack exchange,提问作者user9048585
相关产品推荐
相关产品推荐

