我目前正在清理CentOS 6服务器上其他人留下的烂摊子。有一个应用程序需要每6小时备份到一个github帐户。有一个脚本负责准备数据,它负责git add和git commit。
git push由“expect”脚本处理。这样做是为了在ssh请求时将密码短语传递给git push。用户不想使用空密码。
当root用户从bash shell命令行运行时,脚本运行正常。我可以看到传输到github的文件。
当脚本在root创建的crontab下运行时,脚本似乎运行但git push不会发生。如果我手动运行git push,在脚本失败后,我注意到应该发生的推送与我从命令行调用的手动一起发生。似乎脚本中应该发生的推送已被缓存,而不是推送到github。
有谁可以建议我在这里缺少什么?是否有可能在这样的脚本中使用git push?
此致
理查德
答案 0 :(得分:1)
问题应该是当git push试图运行时,ssh-agent没有正确地将密码传递给ssh。
正如follow-up blog post所示,你不能简单地在你的cron中调用ssh-agent -s
,否则它只会创建另一个实例,而不包含任何键。
为了解决这个问题,我需要找到一种方法来避免启动另一个
ssh-agent
进程,而是每次登录时都可以访问一个海马。
我对我的crontab进行了更改,该更改将搜索现有的ssh-agent进程ID和身份验证套接字并将它们导入到cron环境中。这有点像黑客,但它确实有效(不像上次) 在尝试连接到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作业成为一系列命令:请参阅“Run two commands with a crontab”。
crontab -l | { cmd1; cmd2 ; cmd3; } | crontab -
这种语法只是add programmatically a command to a cron job的一种方式。