Git push不能在cron job中工作



我目前正在清理别人在CentOS 6服务器上留下的烂摊子。有一个应用程序需要每6小时备份到github帐户。有一个脚本负责准备数据,它负责git添加和git提交。

git推送由一个"expect"脚本负责。这样做是为了在ssh请求时将密码传递给git推送。用户不希望使用空密码短语。

当root用户在bash shell中从命令行运行该脚本时运行良好。我可以看到文件传输到github。

当脚本在root创建的crontab下运行时,脚本看起来在运行,但是git push并没有发生。如果我在脚本失败后手动运行git推送,我注意到应该发生的推送与我从命令行调用的手动推送一起发生。似乎应该在脚本中发生的推送已经被缓存,而不是推送到github。

谁能建议我在这里错过了什么?有可能让git push在这样的脚本中工作吗?

理查德

问题应该是当git push试图运行时,ssh-agent没有正确地将密码短语传递给ssh。

正如后续博客文章所示,您不能简单地在cron中调用ssh-agent -s,否则它会简单地创建另一个实例,其中没有键。

为了修复它,我需要找到一种方法来防止启动另一个ssh-agent进程,而是每次登录时都可以访问一个海马启动。
我对crontab进行了更改,它将搜索现有的ssh-agent进程ID和身份验证套接字,并将它们导入到cron环境中。这是一种hack,但它确实有效(不像上次)。
在尝试连接到SSH服务器之前,只需将以下内容添加到脚本中(或者像我所做的那样,将它们直接放入cron作业中,以分号分隔):

export SSH_AGENT_PID=`ps -a | grep ssh-agent | grep -o -e [0-9][0-9][0-9][0-9]`
export SSH_AUTH_SOCK=`find /tmp/ -path '*keyring-*' -name '*ssh*' -print 2>/dev/null` 

澄清:

只需在脚本中添加以下内容

这意味着上面的两行是作为cron作业声明的脚本的一部分,并由该cron作业调用。

将它们直接放入cron作业中,以分号分隔

如果脚本足够小,您可以完全摆脱脚本,并使您的cron作业成为一系列命令:参见"使用crontab运行两个命令"。

crontab -l | { cmd1; cmd2 ; cmd3; } | crontab -

这种语法只是将以编程方式命令添加到cron作业的方法之一。

最新更新