126

我有一个从 git 私有存储库下载的自动构建服务。问题是当它试图克隆存储库时,它需要提供密码,因为它不会被记住;所以因为没有人工交互,所以它永远等待密码。如何强制它从 id_rsa.pub 中记住?

4

7 回答 7

258

对于 Windows 用户,请注意,这是我设置 Git Bash 环境以在启动时登录一次的方式。我编辑我的~/.bashrc文件:

eval `ssh-agent`
ssh-add

所以当我启动 Git Bash 时,它看起来像:

Welcome to Git (version 1.7.8-preview20111206)
(etc)
Agent pid 3376
Enter passphrase for /c/Users/starmonkey/.ssh/id_dsa:
Identity added: /c/Users/starmonkey/.ssh/id_dsa (/c/Users/starmonkey/.ssh/id_dsa)

现在我可以 ssh 到其他服务器,而无需每次都登录。

于 2012-01-25T22:12:00.790 回答
61

这个答案解释了如何获取永久存储的 GitHub 用户名和密码,而不是 SSH 密钥密码。

在 Windows 中,只需运行

$ git config --global credential.helper wincred

这意味着下次推送时,您将照常输入您的用户名和密码,但它们将保存在 Windows 凭据中。之后,您无需再次输入它们。

如,每次都无需输入用户名和密码即可推送到 GitHub(Windows 上的 Git Bash)

于 2015-12-07T08:24:08.523 回答
9

我不想在打开新终端时输入我的 SSH 密码;不幸的是, starmonkey 的解决方案需要为每个会话输入密码。相反,我的.bash_profile文件中有这个:

# Note: ~/.ssh/environment should not be used, as it
#       already has a different purpose in SSH.

env=~/.ssh/agent.env

# Note: Don't bother checking SSH_AGENT_PID. It's not used
#       by SSH itself, and it might even be incorrect
#       (for example, when using agent-forwarding over SSH).

agent_is_running() {
    if [ "$SSH_AUTH_SOCK" ]; then
        # ssh-add returns:
        #   0 = agent running, has keys
        #   1 = agent running, no keys
        #   2 = agent not running
        ssh-add -l >/dev/null 2>&1 || [ $? -eq 1 ]
    else
        false
    fi
}

agent_has_keys() {
    ssh-add -l >/dev/null 2>&1
}

agent_load_env() {
    . "$env" >/dev/null
}

agent_start() {
    (umask 077; ssh-agent >"$env")
    . "$env" >/dev/null
}

if ! agent_is_running; then
    agent_load_env
fi

# If your keys are not stored in ~/.ssh/id_rsa or ~/.ssh/id_dsa, you'll need
# to paste the proper path after ssh-add
if ! agent_is_running; then
    agent_start
    ssh-add
elif ! agent_has_keys; then
    ssh-add
fi

unset env

这也会记住我的新终端会话密码;我只需要在启动后打开第一个终端时输入一次。

我想归功于我从哪里得到这个;这是对别人作品的修改,但我不记得它来自哪里。感谢匿名作者!

2019-07-01 更新:我不认为这一切都是必要的。.bash_profile我现在通过确保我的文件运行 ssh-agent来始终如一地工作:

eval $(ssh-agent)

然后我设置一个ssh这样的配置文件:

touch ~/.ssh/config
chmod 600 ~/.ssh/config
echo 'AddKeysToAgent yes' >> ~/.ssh/config
于 2016-11-02T14:27:30.103 回答
5

如果我正确理解了这个问题,那么您已经在构建服务中使用了授权的 SSH 密钥,但是您希望避免为每个克隆都输入密码?

我可以想到两种方法:

  1. 如果您的构建服务以交互方式启动:在您启动构建服务之前,请ssh-agent以足够长的超时时间(-t选项)开始。然后使用ssh-add(msysGit 应该有这些)在启动构建服务之前添加您需要的所有私钥。您仍然需要输入所有密码,但每次服务启动只需输入一次。

  2. 如果您想完全避免输入密码,您可以随时从 SSH 密钥中删除密码,如https://serverfault.com/questions/50775/how-do-i-change-my-中所述private-key-passphrase,通过设置一个空的新密码。这应该完全消除密码提示,但它甚至比前一个选项更不安全。

于 2011-05-15T12:34:31.277 回答
1

当我尝试推送我的代码时,出现以下错误:

$ git push origin dev

remote: Too many invalid password attempts. Try logging in through the website with your password.
fatal: unable to access 'https://naushadqamar-1@bitbucket.org/xxxx/xxxx-api.git/': The requested URL returned error: 403

经过几个小时的研究,我发现我需要使用以下命令:

$ git config --global credential.helper cache

执行上述命令后,我得到了输入我的 GitHub 用户名和密码的提示。提供正确的凭据后,我可以推送我的代码。

于 2017-04-02T14:55:36.887 回答
0

正确的解决方案是:

  1. 运行 Windows 默认终端 - cmd 并获取主配置文件的目录

    echo %USERPROFILE%
    
  2. 在上面的目录中运行 Git Bash 并.bashrc使用命令创建文件

    echo "" > .bashrc
    
  3. .bashrc使用您喜欢的文本编辑器打开文件,然后将GitHub 帮助中的代码粘贴到该文件中:

    env=~/.ssh/agent.env
    ...
    COPY WHOLE CODE FROM URL - I can't add it to Stack Overflow because it breaks layout... OMG!
    
  4. 重新启动 Git Bash,它会询问您的密码(仅第一次)并完成。再也不用密码了。

于 2018-07-22T08:02:13.393 回答
-1

您需要在要连接到存储库服务器的用户authorized_keys的文件夹下创建文件。.ssh例如,假设您使用用户名buildservicerepo.server您可以运行:

cd ~buidservice
mkdir ./ssh
cat id_rsa.pub >> .ssh/authorized_keys

然后,您必须检查以下事项:

  1. 相应id_rsa的私钥显示在 中builservice@build.server:~/.shh/id_rsa

  2. repo.server 的指纹存储在buildservice@build.server:~/.ssh/known_hosts文件中。通常,这将在第一次尝试ssh连接到repo.server.

于 2011-04-20T09:36:40.227 回答