在Windows上使用Git Bash时,如何防止每次都要输入用于解密私钥的密码?


125

我有一个自动构建服务,可以从git私有存储库下载。问题在于,当它尝试克隆存储库时,需要提供密码,因为它不会被记住。因此,由于没有人为干预,它将永远等待密码。如何强制从id_rsa.pub记住它?

Answers:


255

对于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)

现在,我无需每次登录即可连接到其他服务器。


9
如果没有〜/ .bashrc文件,则只需创建一个新的文本文件(记事本或其他编辑器),然后添加提及的starmonkey两行即可。
pbz 2012年

7
“〜”是指您的“主目录”。在Windows中,您可以通过打开命令外壳(cmd)并键入“ echo%USERPROFILE%”来找到它。
Hawkeye Parker

14
对我来说,这种语法不起作用。我不得不写eval $(ssh-agent)
2014年

1
我的问题是我需要指定ssh-add使用的文件。可能是因为我有多个,并且没有使用默认名称。示例ssh-add ~/.ssh/myfile_rsa
语法错误

1
copy > ~/.bashrc在git bash中在Windows中创建bashrc文件,忽略该错误
Ruben

61

该答案说明了如何获取GitHub用户名和密码来永久存储,而不是SSH密钥密码。

在Windows中,只需运行

$ git config --global credential.helper wincred

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

与之类似推送到GitHub时无需每次输入用户名和密码(Windows上为Git Bash)


2
执行此命令后,您需要输入用户名和密码。
Stephen Tun Aung

5
这与SSH密钥有关,还是仅与HTTPS(用户名和密码)身份验证有关?问题似乎与使用SSH密钥有关。
肖恩

对我来说工作得很好,我想我正在使用HTTPS(用户名和密码)身份验证。
乔纳坦

运行此命令完全不会产生任何输出。
user9993

@ user9993不会。这是一个配置更改,因此尽管不进行任何输出,但git将根据配置指令集更改其行为。
starbeamrainbowlabs

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

每次我仍然会被要求输入密码。
Ryan

1
@Ryan希望我刚刚添加的更新能够解决您的问题。我在conan.is/blogging/clojure-on-windows.html上的博客文章中更新了信息,我自己也在stackoverflow.com/questions/52423626/上
柯南

谢谢,我会检查一下。
瑞安

@Conan每个bash会话更新的解决方案工作。关闭正在运行的bash会话并打开一个新会话后,再次提示我输入密码。
Tushar Raj

5

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

我可以想到两种方法:

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

  2. 如果您想完全不必输入密码,则可以始终从SSH密钥中删除密码,如/server/50775/how-do-i-change-my-私钥密码,通过设置一个空的新密码。这应该完全消除了密码提示,但它的安全性甚至比以前的选项低。


感谢第二种选择,我需要它。
Stanislav Verjikovskiy 2014年

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用户名和密码。提供正确的凭据后,我可以推送我的代码。


这只是生成的“ git:'credential-cache'不是git命令”。但是,“ git config --global credential.helper存储”可以工作-可能不是最好的,但是我被迫使用HTTPS而不是我偏爱的SSH,只是希望它能工作。
特里·布朗

0

正确的解决方案是:

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

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

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

    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,它要求您输入密码(仅第一次)并完成。没有密码再次困扰。


-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


我忘了说。在Windows下,您的主目录可能是C:\ Users \ Username
beduin 2011年

5
嗯.. Git bash拥有了所有内容,请仔细阅读问题标题。同样从问题中,我假设已经生成了密钥对(因为有人询问如何强制回购服务器记住id_rsa.pub。)很抱歉格式化。
beduin 2011年

1
好的,以前从未听说过'git bash'。对不起,关于
sehe 2011年

我假设这是使用msysgit。我正在添加标签。
亚当·迪米特鲁克

3
警告!使用cat id_rsa.pub > .ssh/authorized_keys将覆盖任何现有的授权密钥。使用>>添加的,而不是覆盖。
大卫·派森(DavidPärsson)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.