我为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 中不起作用。我们可以尝试一些方法来解决问题。
在
~/.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 中测试。
正如你的线程之一中提到的,你需要将执行你的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 正在运行,以便缓存所述密码(或使用钥匙串,如我之前提到的)。
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 行)。
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)