Git一直要求我输入ssh密钥的密码短语。

831
我按照github教程创建了密钥,将其注册到了github,并尝试显式地使用ssh-agent——但每次我尝试pull或push时,git仍然会要求我输入密码。原因是什么?

相关:https://dev59.com/f2Uq5IYBdhLWcg3wJM9A - Jeff
24个回答

1567

一旦你使用以下命令启动了SSH代理:

eval $(ssh-agent)

请选择以下一种方式:

  1. 将您的私钥添加到其中:

     ssh-add
    

    这将只要求您输入一次密钥短语,然后如果您已经将公共密钥上传到Github,就可以允许您进行推送。

    要在macOS上永久添加和保存您的密钥:

     ssh-add -K  
    

    通过将它存储在用户的钥匙串中,这将使其在你关闭并重新打开后仍然存在。

    如果您看到有关deprecated标志的警告,请尝试新的变体:

     ssh-add --apple-use-keychain 
    
  2. 在Ubuntu(或等效系统)上永久添加和保存密钥:

  3.   ssh-add ~/.ssh/id_rsa
    

34
退出服务器,重新通过ssh登录,运行"git pull"命令,再次提示输入密码。 - code-8
44
ssh-add -K 命令会将其持久化,通过将其存储在用户的钥匙串中,在您关闭并重新打开它后仍然有效。 - Kirk
83
@Kirk 运行 ssh-add -K 命令会返回以下内容: 未知选项 -- K 用法:ssh-add [选项] [文件...] 选项: -l 列出所有密钥的指纹。 -L 列出所有密钥的公共参数。 -k 仅加载密钥而非证书。 -c 要求确认才能使用身份验证。 -t life 添加身份验证时设置生存时间(以秒为单位)。 -d 删除身份验证。 -D 删除所有身份验证。 -x 锁定代理。 -X 解锁代理。 -s pkcs11 从 PKCS#11 提供程序添加密钥。 - Sandeep C
36
不管怎样,我仍然需要输入密码短语。 - IgorGanapolsky
29
-K 是苹果电脑特有的。请参考 https://help.github.com/articles/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent/#adding-your-ssh-key-to-the-ssh-agent。 - bkdir
显示剩余17条评论

346

自从我从OS X El Capitan(10.11)升级到macOS Sierra(10.12)以后,每次重启后都会发生这种情况。使用ssh-add的解决方法只能暂时起作用,不能在另一次重启后持久化。

永久解决方案是编辑(或创建)~/.ssh/config文件并启用UseKeychain选项。

Host *
    UseKeychain yes

相关文章:自从我更新到Sierra后,macOS一直在询问我的ssh密码


2
对我有用,谢谢... 我已经执行了 ssh-add -K /Users/***/.ssh/git/id_rsa 但是在终端重启后仍然无法工作... 谢谢。 - nawlbergs
3
想知道为什么会发生这种情况吗?请阅读关于OpenSSH更改的技术笔记https://developer.apple.com/library/content/technotes/tn2449/_index.html - samwize
谢谢,已接受的解决方案不够,但是您的解决方案解决了问题!(我使用的是Mac M1)。 - Jonathan F.
1
按照 GitHub 的教程,我在 ~/.ssh/config 文件中进行了配置,但是却没有起作用。只有在添加了这个答案中的几行代码后才成功。可能是因为 Host *.github.com 对于 github.com 并不起作用。 - olessia
1
谢谢。我将min设置为“Host github”,这对我很有效。我不想使用“Host *”,因为我还要使用SSH连接到另一台设置不同的RaspberryPi。 - samjewell

84
如果你已经尝试过ssh-add,但仍然提示输入密码短语,则尝试使用ssh-add -K。这将把您的密码短语添加到钥匙串中。 更新:如果您正在使用macOS Sierra,则可能需要执行另一步骤,因为上面的内容可能不再适用。将以下内容添加到您的~/.ssh/config:
Host *
  UseKeychain yes

3
仍提示我输入密码短语。 - IgorGanapolsky
@IgorGanapolsky 你使用的是macOS Sierra吗?如果是的话,请查看我刚刚添加到答案中的内容。希望能对你有所帮助。 - Darryl Young
4
好的,我会尽力进行翻译,请问您需要将其翻译成哪种语言呢? - IgorGanapolsky
1
这个也适用于BitBucket Cloud。我在GitKraken中遇到了问题,但这解决了我的问题。 - Malachi

68
我会尝试以下步骤:

  1. 启动GitBash
  2. 编辑~/.bashrc文件
  3. 在文件中添加以下行
SSH_ENV=$HOME/.ssh/environment

# start the ssh-agent
function start_agent {
    echo "Initializing new SSH agent..."
    # spawn ssh-agent
    /usr/bin/ssh-agent | sed 's/^echo/#echo/' > ${SSH_ENV}
    echo succeeded
    chmod 600 ${SSH_ENV}
    . ${SSH_ENV} > /dev/null
    /usr/bin/ssh-add
}

if [ -f "${SSH_ENV}" ]; then
     . ${SSH_ENV} > /dev/null
     ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {
        start_agent;
    }
else
    start_agent;
fi
  1. 保存并关闭文件
  2. 关闭GitBash
  3. 重新打开GitBash
  4. 输入您的密码短语

6
供将来参考,这也适用于 zsh。只需将此添加到.zshrc文件中即可。 - Arda
3
我认为这个假设你的密钥文件名叫做 id_rsa。如果你有自定义的名称,你应该使用例如 /usr/bin/ssh-add ~/.ssh/custom_filename - Juha Untinen
2
你能解释一下这个脚本发生了什么事吗? - LeeR
2
@Lee 如果ssh-agent尚未运行,则它会启动ssh-agent,这可以确保在每次推送时不会要求您输入ssh密码(或多或少)。 - Roland
1
这只是在每次登录时运行ssh-agent并添加密钥。您仍然必须每次登录输入密码。因此,例如,如果您有脚本ssh-ing并执行GIT命令,则这完全没有用。 - trainoasis
显示剩余4条评论

56

4
如果你使用的不是默认的RSA文件名,请确保在第二个命令中使用它:ssh-add /c/Users/you_user/.ssh/id_rsa_abcxyz - Alejandro B.
17
只有在 GitBash 处于活动状态时,这才对我起作用。一旦我关闭它,我就需要再次提供凭据。 - Brooklyn99

47

尝试将以下内容添加到你的~/.ssh/config文件中:

Host *
   AddKeysToAgent yes
   UseKeychain yes
   IdentityFile ~/.ssh/id_rsa

假设您的私钥名称为id_rsa


21
"UseKeychain yes" 只适用于 Mac。 - oz123
5
@Oz123 Windows 的等价物是什么? - IgorGanapolsky
1
@Oz123 我认为在Windows上的等效命令是AddKeysToAgent,可以查看这个答案 https://dev59.com/GFQK5IYBdhLWcg3wHsZJ - fedeteka
这个答案比其他答案更通用(适用于任何操作系统,除了UseKeyChain部分)。在我看来,我应该是被接受的答案。谢谢@IgorGanapolsky - gfd
非常好。如果您在Gitlab、Github等网站上拥有账户,并且您正在本地管理项目以推送到这些网站,那么您该如何指定多个ssh密钥呢? - Emmanuel Goldstein
针对您的情况,您需要单独指定每个 主机 名称,而不是使用 Host * - IgorGanapolsky

21

以前使用-K标志添加密钥,但现在:

ssh-add --apple-use-keychain

-K 和 -A 标志已经被弃用,分别被 --apple-use-keychain 和 --apple-load-keychain 标志所取代。


LATER EDIT: 你可能需要将 ssh-add --apple-load-keychain -q 添加到你的 .bash_profile.bashrc.zshrc 或等效文件中。


这对我有用。我尝试通过SSH导入私有的Github存储库。 - naheed.shamim
3
我不得不这样做,并且还要将 ssh-add --apple-load-keychain -q 添加到我的 .bash_profile 中(如果您使用 zsh,则添加到 .zshrc)。 - André Willik Valenti
我也是,我不得不将@AndréWillikValenti所说的内容添加到我的.zshrc文件中。 - alexventuraio
谢谢 @alexventuraio,我已经将那个步骤添加到原始答案中了。 - André Willik Valenti

18

15

如果您没有使用GitBash并且正在Windows上 - 您需要使用此命令启动ssh-agent

start-ssh-agent.cmd
如果您的ssh代理未设置,则可以以管理员身份打开PowerShell并将其设置为手动模式。
Get-Service -Name ssh-agent | Set-Service -StartupType Manual

我已经启动了代理,但每次它仍然要求我输入密码。 - Luigi Plinge

12

如果上述解决方案对我无效,一个需要检查的事项是您是否确实拥有公钥(通常为id_rsa.pub)。虽然这种情况不太常见,但这是我的问题原因。

要从您的私钥创建公钥,请执行以下操作:

ssh-keygen -y -f ~/.ssh/id_rsa > ~/.ssh/id_rsa.pub

这对我有用!谢谢! :) - wislon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接