SSH主机密钥正常但Rsync脚本执行失败:主机密钥验证错误
解决rsync脚本报错Host key verification failed的问题
我之前也踩过这个坑!你遇到的问题本质是脚本运行的上下文和你手动SSH时的环境不一致,导致rsync调用的SSH找不到正确的主机密钥配置。下面是一步步的排查和解决方法:
检查脚本运行的用户身份
手动SSH时你用的是当前登录的用户(比如ubuntu),但脚本可能是用root或者其他用户运行的(比如通过cron定时任务)。不同用户的~/.ssh/known_hosts文件是独立的,脚本用户的这个文件里没有目标服务器的主机密钥,就会触发验证失败。
解决方法:- 切换到脚本运行的用户,手动SSH一次目标服务器并接受密钥:
sudo -u 脚本运行用户名 ssh user@远程服务器IP - 或者直接在rsync命令里指定手动操作时的
known_hosts路径:rsync -avz -e "ssh -o UserKnownHostsFile=/home/你的手动登录用户名/.ssh/known_hosts" user@远程服务器IP:/备份路径 /本地存储路径
- 切换到脚本运行的用户,手动SSH一次目标服务器并接受密钥:
确保脚本使用正确的SSH密钥
如果手动SSH时你指定了特定的密钥文件(比如~/.ssh/id_rsa_backup),但脚本里没配置这个,也可能间接导致密钥验证报错。
解决方法:在rsync的SSH参数里同时指定密钥和known_hosts文件:rsync -avz -e "ssh -i /home/你的手动登录用户名/.ssh/id_rsa_backup -o UserKnownHostsFile=/home/你的手动登录用户名/.ssh/known_hosts" user@远程服务器IP:/备份路径 /本地存储路径处理cron环境的特殊情况
如果脚本是通过cron定时运行的,cron的环境变量和你登录shell的环境差异很大,可能找不到SSH的配置目录。
解决方法:- 在脚本开头添加环境变量配置:
export HOME=/home/你的手动登录用户名 export PATH=/usr/bin:/bin:/usr/sbin:/sbin - 或者在cron任务里使用完整的命令路径,比如:
0 2 * * * /usr/bin/rsync -avz -e "ssh -o UserKnownHostsFile=/home/你的手动登录用户名/.ssh/known_hosts" user@远程服务器IP:/备份路径 /本地存储路径
- 在脚本开头添加环境变量配置:
预加载主机密钥到脚本用户的known_hosts
可以在脚本开头加入自动扫描并添加主机密钥的命令,避免手动操作:# 提前将目标服务器的主机密钥添加到脚本用户的known_hosts ssh-keyscan -H 远程服务器IP >> /home/脚本运行用户名/.ssh/known_hosts
核心逻辑就是:脚本运行时的用户、环境变量和你手动操作时不匹配,导致SSH无法读取到已经验证过的主机密钥。只要对齐这两者的上下文,问题就能解决。
内容的提问来源于stack exchange,提问作者Coder99
相关产品推荐
相关产品推荐

