使用 ssh 密钥进行 cron git 推送

问题描述 投票:0回答:3

我为github帐户设置了ssh密钥,因此不必每次都输入密码,效果很好。这是我使用的脚本:

#!/bin/bash
git push origin master

但是当我使用 cron 运行它时,它不会使用我的 ssh 密钥。这是输出:

Permission denied (publickey)
fatal: The remote end hung up unexpectedly

我四处寻找并找到了一些文章,但没有一篇能解决我的问题。以下是我找到的文章(以及更多):

https://askubuntu.com/questions/110565/why-is-git-not-using-my-pubkey-with-crontab

https://unix.stackexchange.com/questions/35466/how-to-perform-git-push-using-crontab

通过 cron 进行 git 推送

任何人都可以给我一步一步的说明来解决这个问题吗?

git ssh cron
3个回答
5
投票

根据您的评论,我真的不明白为什么您的脚本在 cron 中不起作用。我们可以尝试一些方法来解决问题。

~/.ssh/config
中为运行 cron 作业的用户添加配置,如下所示:

Host github-project1
User git
HostName github.com
IdentityFile /path/to/github.project1.key
#or like this:
#IdentityFile ~/.ssh/github.project1.key

然后在你的 git 工作树中添加一个新的遥控器,如下所示:

git remote add github-project1 github-project1:USER/PROJECT.git

在网址

github-project1:user/project.git
中,仅将
USER
PROJECT
更改为适合您的项目的值,但保留
github-project1
不变:它必须与
Host 中的 
ssh
 设置的值相匹配
我们刚刚添加的配置。

最后,更改脚本以使用这个新的遥控器:

#!/bin/bash
git push github-project1 master

首先在 shell 中测试脚本,然后在 cron 中测试。


4
投票

正如你的线程之一中提到的,你需要将执行你的cron脚本的root用户指向右侧

HOME
(包含
$HOME/.ssh/id_rsa(.pub)
,你的公钥和私钥的用户。

#!/bin/bash
HOME=/home/yourAccount git push origin master

如果这不起作用,请开始调试 ssh 命令:

#!/bin/bash HOME=/home/yourAccount ssh -Tvvv yourGitServer

并首先使用简单的私钥(不受密码保护)进行检查。

然后,如果您需要密码,请确保您的
ssh-agent 正在运行,以便缓存所述密码(或使用钥匙串,如我之前提到的)。

根据

您的日志,建议使用公共 ssh 密钥,但被拒绝。

debug1: Trying private key: /home/jack/.ssh/id_rsa debug3: no such identity: /home/jack/.ssh/id_rsa

仔细检查“

BitBucket为Git设置SSH”,并确保您的id_rsa

id_rsa.pub
在那里,
具有正确的保护

另请检查您的

id_rsa.pub

 是否已添加到您的 BitBucket 帐户(如 
one 行)。

https://confluence.atlassian.com/download/attachments/304578655/ssh_key.png?version=2&modificationDate=1379979345091&api=v2&effects=drop-shadow


0
投票
救生员 -->

http://blog.jocairns.com/2013/12/understanding-ssh-agent-and-ssh-add/

如果你对此感到疯狂,请检查 ssh-agent 使用的 2 个环境变量

SSH_AGENT_PID SSH_AUTH_SOCK
这不是在标准 cron 作业中设置的,因为,即使对于正确的用户,并且在从 cron 运行时提供可访问的 ssh 私钥(通常是 

~/.ssh/id_rsa ),这是另一个没有变量的 shell,所以你无法连接到 ssh-agent!

另请检查 -->

ssh-agent 是如何设置和使用 SSH_AUTH_SOCK 的?

概念证明:

如果在你的 cron 作业中不使用 git+ssh,你首先从终端获取

echo $SSH_AGENT_PID ## e.g. 17622

echo $SSH_AUTH_SOCK ## e.g /tmp/ssh-Yz33IjKwDPkq/agent.17621
然后你在失败的 git pull/push cron 作业之前导出它们

export SSH_AGENT_PID=17622 ; export SSH_AUTH_SOCK=/tmp/ssh-Yz33IjKwDPkq/agent.17621 ; myGitCronJob.sh
你(可能)会成功!
然后你可以让进程对于每次执行/登录都是“可移植的”

注意:还有其他因素,例如多个 ssh-agent 进程,如果您添加了正确的密钥和可能的其他变量(如 HOME)

© www.soinside.com 2019 - 2024. All rights reserved.