DSM7环境下含SSH的脚本手动执行正常,同用户通过crontab执行失败问题求助
DSM7环境下含SSH的脚本手动执行正常,同用户通过crontab执行失败问题求助
碰到过好多次这种crontab和手动执行环境不一致的坑了,咱们一步步来排查解决这个Host key verification failed导致rsync报错255的问题:
环境变量不匹配是核心元凶
手动登录时,SSH会自动读取你用户家目录(比如/var/services/homes/你的用户名)下的.ssh/known_hosts文件,但crontab运行时默认不会加载用户的.profile或.bashrc配置,导致它找不到这个验证文件,甚至HOME变量都可能不是你的用户目录。
解决办法有两个:- 在脚本里的rsync命令中明确指定known_hosts路径:
rsync -e "ssh -o UserKnownHostsFile=/var/services/homes/你的用户名/.ssh/known_hosts" 源目录 目标用户@目标主机:目标目录 - 在crontab的任务开头先加载用户环境配置,比如:
* * * * * source /var/services/homes/你的用户名/.profile && /path/to/your/script.sh
- 在脚本里的rsync命令中明确指定known_hosts路径:
检查SSH密钥及目录权限
虽然手动执行没问题,但crontab运行时的权限上下文偶尔会触发严格的SSH权限检查。确保你的.ssh目录和密钥文件权限符合要求:chmod 700 /var/services/homes/你的用户名/.ssh chmod 600 /var/services/homes/你的用户名/.ssh/id_rsa # 私钥必须是600,否则SSH会拒绝 chmod 644 /var/services/homes/你的用户名/.ssh/known_hosts用完整命令路径避免找不到命令
crontab的默认PATH环境变量非常有限,可能找不到rsync或ssh命令。你可以先手动执行which rsync和which ssh拿到完整路径,然后在脚本里替换成绝对路径,比如用/usr/bin/rsync代替rsync。应急测试方案(不推荐长期使用)
如果只是临时验证问题,可以在SSH参数里跳过主机密钥检查,但这会带来安全风险,只适合测试:rsync -e "ssh -o StrictHostKeyChecking=no" 源目录 目标用户@目标主机:目标目录排查环境差异的小技巧
写个简单的测试脚本放到crontab里,输出环境变量对比手动登录的情况:#!/bin/bash env > /tmp/crontab_env.log echo "当前HOME路径: $HOME" >> /tmp/crontab_env.log echo "SSH命令路径: $(which ssh)" >> /tmp/crontab_env.log运行后查看
/tmp/crontab_env.log,对比手动执行env的输出,就能快速找到哪里不一样了。
备注:内容来源于stack exchange,提问作者brunobhr
相关产品推荐
相关产品推荐

