使用Crontab每小时自动Git Push时SSH密码无法自动输入的问题
解决Git SSH自动认证问题,实现无密码Crontab定时备份
老兄,你这个问题我之前也碰到过——用send mypassword\r wait这种方式给Git的SSH连接传密码根本没用,因为Git调用的SSH客户端不会从这种简单的模拟输入里读取密码,而且明文写密码在脚本里绝对是个安全隐患。别慌,咱们用最标准安全的方式搞定它:
第一步:配置SSH密钥对,实现无密码认证
这是解决SSH自动认证的最优方案,步骤超简单:
- 在你的服务器上执行
ssh-keygen -t ed25519(优先用ed25519算法,比老的RSA更安全),全程按回车就行,千万不要设置密钥密码——不然定时任务执行时还是会弹窗要求输入密码。 - 找到生成的公钥文件
~/.ssh/id_ed25519.pub,把里面的内容复制到你的Git仓库服务器(比如GitHub、GitLab)的账号SSH密钥设置里。 - 测试一下:执行
ssh git@你的仓库域名,如果能直接连上不要求输密码,那这步就成功了。
第二步:修复你的backup.sh脚本
原来的脚本有两个小问题,我给你改好了:
#!/bin/bash # 先把项目目录定义成变量,维护起来更方便 PROJECT_DIR="/home/user/share/my_project" # 进入项目目录,自动提交所有变更,备注里带上准确的时间戳 cd "$PROJECT_DIR" && git commit -a -m "Hourly crontab backup: $(date '+%Y-%m-%d %H:%M:%S')" # 推送指定分支到远程仓库 git push origin branch1
- 原来的
'date'只是把字符串提交了,用$(date '+%Y-%m-%d %H:%M:%S')才能插入当前的准确时间。 - 不用重复
cd到目录,只要第一次cd成功,后面的git命令都会在这个目录执行。 - 删掉那个没用的
send命令,密钥认证已经不需要密码了。
第三步:给脚本加权限并测试
- 先给脚本添加执行权限:
chmod +x backup.sh。 - 手动运行一遍
./backup.sh,确认不需要输入密码就能完成提交和推送——这步一定要测试,没问题再配置定时任务。
第四步:配置Crontab定时任务
执行crontab -e打开定时任务编辑器,添加一行:
0 * * * * /home/user/你的脚本路径/backup.sh >> /var/log/git_backup.log 2>&1
0 * * * *代表每小时的第0分钟执行一次,刚好符合你的每小时备份需求。- 后面的
>> /var/log/git_backup.log 2>&1是把脚本的输出和错误信息都写到日志文件里,万一出问题了方便排查。
额外提醒
- 确保你的SSH密钥文件权限是
600,.ssh目录权限是700——权限太松的话SSH会拒绝使用该密钥。 - 如果非要给SSH密钥设置密码(比如担心密钥泄露),可以用
ssh-agent配合ssh-add,但配置起来比较麻烦,定时任务还要处理agent的环境变量,不太适合新手,所以还是推荐无密码密钥用于定时任务场景。
内容的提问来源于stack exchange,提问作者Shijin TR
相关产品推荐
相关产品推荐

