树莓派Crontab执行Rsync自动上传脚本失败及密钥验证问题
解决crontab调用rsync时的Host key verification failed问题
问题根源是:你用sudo crontab -e配置的任务是以root用户身份运行的,而root用户的~/.ssh/known_hosts文件里没有目标SFTP服务器的主机密钥,导致SSH连接时验证失败;但你手动运行脚本用的是普通用户,该用户的known_hosts已经通过之前的手动连接记录了服务器密钥,所以能正常执行。
以下是几种解决方法:
方法1:手动以root身份接受服务器密钥
执行以下命令,手动建立一次root用户到目标服务器的SSH连接,接受主机密钥:
sudo ssh host.com
当出现Are you sure you want to continue connecting (yes/no/[fingerprint])?提示时,输入yes并回车,之后可以输入exit退出连接。此时root用户的/root/.ssh/known_hosts会自动添加服务器的密钥,crontab任务就能正常运行了。
方法2:自动写入服务器密钥到root的known_hosts
如果不想手动交互,可以直接用ssh-keyscan获取服务器密钥并追加到root的known_hosts文件:
sudo sh -c 'ssh-keyscan host.com >> /root/.ssh/known_hosts'
注意:如果服务器有多个IP或主机别名,可以把所有需要的地址都加进去,比如ssh-keyscan host.com 192.168.1.100 >> /root/.ssh/known_hosts
方法3:改用SSH密钥对(更安全,推荐)
用sshpass明文写密码存在安全风险,建议改用SSH密钥对认证,彻底解决密码和密钥验证问题:
- 以root身份生成SSH密钥对(一路回车使用默认设置即可):
sudo ssh-keygen -t rsa - 将root的公钥复制到目标SFTP服务器:
按提示输入目标服务器的密码,完成公钥复制。sudo ssh-copy-id host.com - 修改你的upload.sh脚本,去掉sshpass部分,简化为:
#!/bin/bash rsync -avh -e ssh /local/directory host.com:/remote/directory
完成以上任意一种方法后,重新触发crontab任务测试即可生效。
内容的提问来源于stack exchange,提问作者saltysaguaro
相关产品推荐
相关产品推荐

