Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
git push在cron作业中不工作_Git_Bash_Github_Cron - Fatal编程技术网

git push在cron作业中不工作

git push在cron作业中不工作,git,bash,github,cron,Git,Bash,Github,Cron,我目前正在清理CentOS 6服务器上其他人留下的混乱。有一个应用程序需要每6小时备份到github帐户。有一个脚本负责准备数据,并负责git add和git commit git推送由一个“expect”脚本处理。这样做是为了在ssh请求时将密码短语传递给git push。用户不希望使用空的密码短语 当root用户从bashshell中的命令行运行脚本时,脚本运行良好。我可以看到传输到github的文件 当脚本在root用户创建的crontab下运行时,脚本似乎在运行,但git推送没有发生。如

我目前正在清理CentOS 6服务器上其他人留下的混乱。有一个应用程序需要每6小时备份到github帐户。有一个脚本负责准备数据,并负责git add和git commit

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

当root用户从bashshell中的命令行运行脚本时,脚本运行良好。我可以看到传输到github的文件

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

有人能告诉我这里缺少什么吗?有可能在这样的脚本中实现git推送吗

问候


Richard

问题应该是当git push尝试运行时,ssh代理没有正确地将密码短语传递给ssh

如所示,您不能简单地在cron中调用
ssh-agent-s
,否则它将简单地创建另一个实例,其中没有密钥

为了解决这个问题,我需要找到一种方法,避免启动另一个
ssh代理
进程,而是在每次登录时访问一个seahorse启动的进程。
我对crontab做了一个更改,搜索现有的ssh代理进程ID和身份验证套接字,并将它们导入cron环境。这是一种黑客行为,但它确实有效(与上次不同)。
在尝试连接到SSH服务器之前,只需将以下内容添加到脚本中(或者执行我所做的操作,并将它们直接放入cron作业中,用分号分隔):

澄清:

只需将以下内容添加到脚本中

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

将它们放在cron作业中,用分号分隔

如果脚本足够小,则可以完全删除脚本,并使cron作业成为一系列命令:请参阅“”


该语法只是您可以使用的方法之一。

当您手动执行命令时,是否以root用户身份运行该命令?不是sudo?命令在cron下失败的通常原因是它取决于在.profile中设置的环境变量,因为它不是由cron作业运行的。当我手动运行命令时,我以root身份运行它。我同意环境变量可能是从cronjob运行命令失败的原因。在标准CentOS安装中,似乎没有为root登录设置太多环境变量。我遇到问题的脚本中的所有命令都是用它们的绝对路径调用的,并且不依赖于路径变量。这不能通过设置一个运行类似于
openvt-c8/bin/sh-c'umask 077的
rc
-脚本来改进吗;ssh-agent-s>/root/agent.env&&source/root/agent.env&&ssh在启动时添加/path/to/the/key'
,然后cron作业脚本将在尝试连接服务器之前执行
source/root/agent.env
。@kostix这听起来是一个很好的改进。你测试过了吗?没有,我自己会使用一个保护良好的解密密钥。但是,如果OP想要/需要输入密码,一个专用的开机设置对我来说似乎是件好事。顺便说一句,我的评论并不是要改进你的答案,而是试图给OP带来一些新的想法。让我们看看OP是怎么想的。答案是不够的,没有解释如何用分号分隔“将它们放在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` 
crontab -l | { cmd1; cmd2 ; cmd3; } | crontab -