求助:Bash脚本无法连接远程MySQL,手动连接却正常
问题分析:Bash脚本连接MySQL报"No route to host"但手动执行成功
这问题挺典型的——脚本里连不上但手动操作没问题,基本都是执行上下文或者变量加载的差异在搞鬼,我帮你梳理几个最可能的原因和排查方向:
1. 环境变量未在脚本上下文加载
手动执行命令时,你的shell会话(比如bash)已经加载了$MYSQL_HOME、$MYSQL_UNIX_PORT这些关键变量,但脚本执行时可能没拿到这些值:
- 如果脚本是通过cron、系统服务或者非交互式shell调用的,默认不会加载
~/.bashrc、~/.bash_profile这类个人配置文件里的变量。 - 排查方式:在脚本开头加上
set -x开启调试模式,或者直接打印变量值,比如:
执行脚本后看输出,如果变量为空或者值不对,就是这个问题。echo "MYSQL_HOME: $MYSQL_HOME" echo "MYSQL_UNIX_PORT: $MYSQL_UNIX_PORT" echo "MYSQL_USER: $MYSQL_USER" - 解决办法:要么在脚本里手动export这些变量,要么在脚本开头source你的配置文件,比如:
source ~/.bash_profile
2. 脚本中变量引用格式错误
检查脚本里的命令参数是否有解析问题:
- 比如
-u$MYSQL_USER如果MYSQL_USER变量为空或者包含空格,会导致参数解析错误;建议给变量加上双引号,比如-u"$MYSQL_USER"、-p"$MYSQL_PWD",避免特殊字符或空格干扰。 - 确认脚本里的
$x变量是不是真的被正确赋值为10.5.5.233和10.5.5.234——比如从配置文件读取时有没有带多余的换行符、空格?可以在循环里加echo "当前连接主机:$x"验证。
3. 执行用户身份差异
脚本可能用了和你手动执行时不同的用户身份(比如root vs 普通业务用户),部分系统的防火墙/SELinux规则会限制不同用户的网络访问权限:
- 排查方式:切换到脚本执行的用户,手动执行命令试试:
如果这个命令也报错,那就是用户权限/防火墙规则的问题。su - <脚本执行用户> -c '$MYSQL_HOME/bin/mysql --socket=$MYSQL_UNIX_PORT -u$MYSQL_USER -p$MYSQL_PWD --host 10.5.5.233 --connect-timeout=5 -e "show master status"'
4. 快速验证技巧
把脚本里的连接命令完整复制出来,用脚本的执行环境跑一遍,比如:
bash -x your_script.sh
通过调试日志对比手动执行的命令参数,就能快速找到差异点——比如变量值不对、参数少了引号、主机IP有拼写错误等。
内容的提问来源于stack exchange,提问作者Murat
相关产品推荐
相关产品推荐

