2

我目前正在清理其他人在 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 在这样的脚本中工作?

问候

理查德

4

1 回答 1

1

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

后续博客文章所示,您不能简单地调用ssh-agent -s您的 cron,或者它只会创建另一个实例,其中没有密钥。

为了解决这个问题,我需要找到一种方法来阻止启动另一个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 作业的一种方式。

于 2013-05-16T06:34:00.203 回答