You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DSM7环境下含SSH的脚本手动执行正常,同用户通过crontab执行失败问题求助

DSM7环境下含SSH的脚本手动执行正常,同用户通过crontab执行失败问题求助

碰到过好多次这种crontab和手动执行环境不一致的坑了,咱们一步步来排查解决这个Host key verification failed导致rsync报错255的问题:

  • 环境变量不匹配是核心元凶
    手动登录时,SSH会自动读取你用户家目录(比如/var/services/homes/你的用户名)下的.ssh/known_hosts文件,但crontab运行时默认不会加载用户的.profile或.bashrc配置,导致它找不到这个验证文件,甚至HOME变量都可能不是你的用户目录。
    解决办法有两个:

    1. 在脚本里的rsync命令中明确指定known_hosts路径:
      rsync -e "ssh -o UserKnownHostsFile=/var/services/homes/你的用户名/.ssh/known_hosts" 源目录 目标用户@目标主机:目标目录
      
    2. 在crontab的任务开头先加载用户环境配置,比如:
      * * * * * source /var/services/homes/你的用户名/.profile && /path/to/your/script.sh
      
  • 检查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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.16 12:09:52