1942

我遇到了以下错误:

$ git push heroku master
Warning: Permanently added the RSA host key for IP address '50.19.85.132' to the list of known hosts.
!  Your key with fingerprint b7:fd:15:25:02:8e:5f:06:4f:1c:af:f3:f0:c3:c2:65 is not authorized to access bitstarter.

我尝试添加密钥,但出现以下错误:

$ ssh-add ~/.ssh/id_rsa.pub
Could not open a connection to your authentication agent.
4

38 回答 38

2878

你开始了ssh-agent吗?

您可能需要ssh-agent在运行ssh-add命令之前启动:

eval `ssh-agent -s`
ssh-add

请注意,这将在 Windows 上启动 msysgit Bash的代理。如果您使用不同的 shell 或操作系统,您可能需要使用命令的变体,例如其他答案中列出的那些。

请参阅以下答案:

  1. ssh-add 抱怨:无法打开与您的身份验证代理的连接
  2. Git push 需要用户名和密码(包含如何使用 ssh-agent 的详细说明)
  3. 如何运行(git/ssh)身份验证代理?.
  4. 无法打开与您的身份验证代理的连接

要自动启动 ssh-agent 并允许单个实例在多个控制台窗口中工作,请参阅登录时启动 ssh-agent

为什么我们需要 useeval而不是 just ssh-agent

要找出原因,请参阅此评论

公钥与私钥

此外,每当我使用 时ssh-add,我总是向它添加私钥。该文件~/.ssh/id_rsa.pub看起来像一个公钥,我不确定这是否有效。你有~/.ssh/id_rsa档案吗?如果您在文本编辑器中打开它,它会说它是私钥吗?

于 2013-07-25T03:37:31.447 回答
646

我尝试了其他解决方案无济于事。我进行了更多研究,发现以下命令有效。我正在使用 Windows 7 和Git Bash

eval $(ssh-agent)

更多信息在:https ://coderwall.com/p/rdi_wq (网络存档版本

于 2014-02-20T13:34:35.193 回答
299

以下命令对我有用。我正在使用 CentOS。

exec ssh-agent bash
于 2013-12-05T15:10:28.707 回答
246

无法打开与您的身份验证代理的连接

要解决此错误:

重击:

$ eval `ssh-agent -s`

tcsh:

$ eval `ssh-agent -c`

然后ssh-add照常使用。


热点提示:

我总是忘记为上述 ssh-agent 命令键入什么内容,因此我在.bashrc文件中创建了一个别名,如下所示:

alias ssh-agent-cyg='eval `ssh-agent -s`'

现在ssh-agent我可以使用而不是使用ssh-agent-cyg

例如

$ ssh-agent-cyg
SSH_AUTH_SOCK=/tmp/ssh-n16KsxjuTMiM/agent.32394; export SSH_AUTH_SOCK;
SSH_AGENT_PID=32395; export SSH_AGENT_PID;
echo Agent pid 32395;
$ ssh-add ~/.ssh/my_pk

修复的原始来源:

http://cygwin.com/ml/cygwin/2011-10/msg00313.html

于 2013-07-17T08:54:25.880 回答
230

MsysGit 或 Cygwin

如果您使用的是 Msysgit 或 Cygwin,您可以在SSH-Agent 的 msysgit 和 cygwin 和 bash中找到一个很好的教程:

  1. 添加一个名为.bashrc您的主文件夹的文件。

  2. 打开文件并粘贴:

    #!/bin/bash
    eval `ssh-agent -s`
    ssh-add
    
  3. 这假设您的密钥位于常规~/.ssh/id_rsa位置。如果不是,请在ssh-add命令后包含完整路径。

  4. 添加或创建~/.ssh/config包含内容的文件

    ForwardAgent yes
    

    在原始教程中,ForwardAgent参数是Yes,但这是一个错字。全部使用小写,否则会出错。

  5. 重新启动 Msysgit。它会要求您输入一次密码,仅此而已(直到您结束会话,或者您的 ssh-agent 被杀死。)

Mac/OS X

如果您不想在每次打开终端时都启动新的 ssh-agent,请查看Keychain。我现在在 Mac 上,所以我在 Mac OS X 上使用了教程 ssh-agent 和 zsh 和钥匙串来设置它,但我确信谷歌搜索会有很多关于 Windows 的信息。

更新:在 Mac 上更好的解决方案是将您的密钥添加到 Mac OS 钥匙串:

ssh-add -K ~/.ssh/id_rsa

就那么简单。

于 2012-04-09T17:43:54.207 回答
210

ssh-agent bash
ssh-add

要获取更多详细信息,您可以搜索

ssh-agent

或运行

man ssh-agent
于 2018-10-11T02:26:37.440 回答
129

ssh-add 和 ssh(假设您使用的是 openssh 实现)需要一个环境变量才能知道如何与 ssh 代理通信。如果您在与您现在使用的不同的命令提示符窗口中启动代理,或者如果您启动不正确,则 ssh-add 和 ssh 都不会看到该环境变量集(因为环境变量是在本地设置的命令提示它已设置)。

你没有说你使用的是哪个版本的 ssh,但如果你使用的是 cygwin,你可以使用Cygwin 上的 SSH 代理的这个配方:

# Add to your Bash config file
SSHAGENT=/usr/bin/ssh-agent
SSHAGENTARGS="-s"
if [ -z "$SSH_AUTH_SOCK" -a -x "$SSHAGENT" ]; then
    eval `$SSHAGENT $SSHAGENTARGS`
    trap "kill $SSH_AGENT_PID" 0
fi

这将为您打开的每个新命令提示符窗口自动启动一个代理(如果您在一个会话中打开多个命令提示符,这是次优的,但至少它应该可以工作)。

于 2010-11-03T11:53:19.340 回答
124

我在 Linux 上遇到了同样的问题,这就是我所做的:

基本上,命令 ssh-agent 启动代理,但它并没有真正设置环境变量以使其运行。它只是将这些变量输出到 shell。

你需要:

eval `ssh-agent`

然后做 ssh-add。请参阅无法打开与您的身份验证代理的连接

于 2013-07-19T06:12:03.987 回答
115

ssh-agent -s我以前没有使用 ,而是eval `ssh-agent -s` 解决了这个问题。

这是我一步一步执行的(在Git Bash上的第 2 步):

  1. 清理了我的.ssh文件夹C:\user\<username>\.ssh\
  2. 生成一个新的 SSH 密钥: ssh-keygen -t rsa -b 4096 -C "xyz@abc.com"
  3. 检查是否有任何进程 ID(ssh 代理)正在运行。 ps aux | grep ssh
  4. (可选)如果在步骤 3 中找到任何内容,请杀死那些 kill <pids>
  5. 启动 SSH 代理 $ eval `ssh-agent -s`
  6. 将步骤 2 中生成的 SSH 密钥添加到 SSH 代理 ssh-add ~/.ssh/id_rsa
于 2016-01-07T10:31:20.923 回答
108

尝试执行以下步骤:

  1. 打开Git Bash并运行:cd ~/.ssh

  2. 尝试运行代理:eval $(ssh-agent)

  3. 现在,您可以运行以下命令:ssh-add -l

于 2013-11-26T13:47:33.637 回答
59

在 Windows 10 中,我尝试了此处列出的所有答案,但它们似乎都不起作用。事实上,他们提供了线索。要解决一个问题,只需要三个命令。这个问题的思路是 ssh-add 需要 SSH_AUTH_SOCK 和 SSH_AGENT_PID 环境变量设置为当前的 ssh-agent sock 文件路径和 pid 号。

ssh-agent -s > temp.txt

这会将 ssh-agent 的输出保存在一个文件中。文本文件内容将是这样的:

SSH_AUTH_SOCK=/tmp/ssh-kjmxRb2764/agent.2764; export SSH_AUTH_SOCK;
SSH_AGENT_PID=3044; export SSH_AGENT_PID;
echo Agent pid 3044;

从文本文件中复制“/tmp/ssh-kjmxRb2764/agent.2764”之类的内容,然后直接在控制台中运行以下命令:

set SSH_AUTH_SOCK=/tmp/ssh-kjmxRb2764/agent.2764

从文本文件中复制“3044”之类的内容,然后直接在控制台中运行以下命令:

set SSH_AGENT_PID=3044

现在,当为当前控制台会话设置环境变量(SSH_AUTH_SOCK 和 SSH_AGENT_PID)时,运行 ssh-add 命令,它不会再次连接到 ssh 代理失败。

于 2015-06-12T13:58:51.757 回答
35

我遇到的一件事是eval使用 Cygwin 对我不起作用,对我有用的是ssh-agent ssh-add id_rsa.

之后我遇到了我的私钥太开放的问题,我设法找到了解决方案(从这里):

chgrp Users id_rsa

chmod 600 id_rsa

最后我能够使用:

ssh-agent ssh-add id_rsa
于 2014-05-28T04:17:27.367 回答
33

对于 Windows 用户,我发现 cmdeval `ssh-agent -s` 不起作用,但使用Git Bash可以得到一种享受:

eval `ssh-agent -s`; ssh-add KEY_LOCATION

并确保没有禁用 Windows 服务“OpenSSH 密钥管理”。

于 2019-03-20T15:17:57.627 回答
28

为了放大n3o对 Windows 7 的回答...

我的问题确实是没有设置一些必需的环境变量,n3o 是正确的, ssh-agent 告诉你如何设置这些环境变量,但实际上并没有设置它们。

由于 Windows 不允许您执行“评估”,因此请改为执行以下操作:

将 ssh-agent 的输出重定向到批处理文件

ssh-agent > temp.bat

现在使用记事本等文本编辑器来编辑 temp.bat。对于前两行中的每一行:

  • 在行首插入单词“set”和一个空格。
  • 删除第一个分号和后面的所有内容。

现在删除第三行。您的 temp.bat 应如下所示:

set SSH_AUTH_SOCK=/tmp/ssh-EorQv10636/agent.10636
set SSH_AGENT_PID=8608

运行temp.bat。这将设置 ssh-add 工作所需的环境变量。

于 2013-12-19T14:57:13.297 回答
20

我刚刚得到这个工作。打开你的~/.ssh/config文件。

附加以下 -

Host github.com
 IdentityFile ~/.ssh/github_rsa

给我提示为 Git 设置 SSH的页面 说,单个空格缩进很重要……尽管我在 Heroku 的配置中没有该空间并且工作正常。

于 2014-02-25T03:42:47.197 回答
19

如果您按照这些说明进行操作,您的问题将得到解决。

如果您使用的是 Mac 或 Linux 计算机,请键入:

eval "$(ssh-agent -s)"

如果您使用的是 Windows 计算机,请键入:

ssh-agent -s
于 2014-11-08T13:20:31.150 回答
19

我在Ubuntu上遇到了同样的问题,其他解决方案对我没有帮助。

我终于意识到我的问题是什么。我已经在/root/.ssh文件夹中创建了我的 SSH 密钥,所以即使我ssh-add以 root 身份运行,它也无法完成它的工作并一直说:

无法打开与您的身份验证代理的连接。

/home/myUsername/我在文件夹中创建了我的 SSH 公钥和私钥,并使用了

ssh-agent /bin/sh

然后我跑了

ssh-add /home/myUsername/.ssh/id_rsa

问题就这样解决了。

注意:要在 Git 中访问您的存储库,请在创建 SSH 密钥时添加您的 Git 密码ssh-keygen -t rsa -C "your Git email here"

于 2019-01-16T12:12:57.767 回答
15

让我提供另一种解决方案。如果您刚刚安装了 Git 1.8.2.2 或更高版本,并且想要启用 SSH,请按照精心编写的说明进行操作。

一直到步骤 5.6,您可能会遇到轻微的障碍。如果 SSH 代理已在运行,则在重新启动 bash 时可能会收到以下错误消息

Could not open a connection to your authentication agent

如果这样做,请使用以下命令查看是否有多个 ssh-agent 进程正在运行

ps aux | grep ssh

如果您看到多个 ssh-agent 服务,则需要终止所有这些进程。按如下方式使用 kill 命令(PID 在您的计算机上将是唯一的)

kill <PID>

例子:

kill 1074

删除所有 ssh-agent 进程后,运行px aux | 再次grep ssh命令以确保它们已消失,然后重新启动 Bash。

瞧,你现在应该得到这样的东西:

Initializing new SSH agent...
succeeded
Enter passphrase for /c/Users/username/.ssh/id_rsa:

现在您可以继续步骤 5.7 及以后的步骤。

于 2013-05-02T18:35:03.917 回答
14

这将运行 SSH 代理并仅在您第一次需要它时进行身份验证,而不是每次打开 Bash 终端时。它可以用于一般使用 SSH 的任何程序,包括ssh它自己和scp. 只需将其添加到/etc/profile.d/ssh-helper.sh

ssh-auth() {
    # Start the SSH agent only if not running
    [[ -z $(ps | grep ssh-agent) ]] && echo $(ssh-agent) > /tmp/ssh-agent-data.sh

    # Identify the running SSH agent
    [[ -z $SSH_AGENT_PID ]] && source /tmp/ssh-agent-data.sh > /dev/null

    # Authenticate (change key path or make a symlink if needed)
    [[ -z $(ssh-add -l | grep "/home/$(whoami)/.ssh/id_rsa") ]] && ssh-add
}

# You can repeat this for other commands using SSH
git() { ssh-auth; command git "$@"; }

注意:这是对此问题的回答,已与此问题合并。这个问题是针对 Windows 7 的,这意味着我的答案是针对 Cygwin/MSYS/MSYS2。这似乎适用于某些 Unix,我不希望 SSH 代理需要像这样管理

于 2014-06-22T01:22:35.760 回答
12

在 Windows 10 中,使用命令提示符终端,以下对我有用:

ssh-agent cmd 
ssh-add

在此之后,您应该被要求输入密码:

Enter passphrase for /c/Users/username/.ssh/id_rsa:
于 2021-01-25T13:00:55.753 回答
12

ssh-agent许多答案都回答了运行的基本解决方案。然而,运行ssh-agent多次(每个打开的终端或每个远程登录)将创建许多ssh-agent在内存中运行的副本。~/.profile建议避免该问题的脚本很长,需要编写和/或复制分隔文件或需要在or中写入太多字符串~/.schrc。让我建议简单的两个字符串解决方案:

对于shbash等:

# ~/.profile
if ! pgrep -q -U `whoami` -x 'ssh-agent'; then ssh-agent -s > ~/.ssh-agent.sh; fi
. ~/.ssh-agent.sh

对于cshtcsh等:

# ~/.schrc
sh -c 'if ! pgrep -q -U `whoami` -x 'ssh-agent'; then ssh-agent -c > ~/.ssh-agent.tcsh; fi'
eval `cat ~/.ssh-agent.tcsh`

这里有什么:

  • ssh-agent按名称和当前用户搜索进程
  • 如果未找到当前用户进程,则通过调用ssh-agent并运行自身来创建适当的 shell 脚本文件ssh-agentssh-agent
  • 评估创建的配置适当环境的 shell 脚本

没有必要保护创建的 shell 脚本~/.ssh-agent.tcsh~/.ssh-agent.sh其他用户的访问,因为:首先与ssh-agent其他用户无法访问的受保护套接字进行通信,然后其他用户可以ssh-agent通过枚举目录中的文件找到简单的套接字/tmp/。至于对ssh-agent进程的访问,它是同样的事情。

于 2017-10-13T19:40:20.387 回答
10

尝试以下操作:

ssh-agent sh -c 'ssh-add && git push heroku master'
于 2015-03-26T21:13:48.177 回答
10

连接服务器时使用参数-A,例如:

ssh -A root@myhost

从手册页:

-A Enables forwarding of the authentication agent connection.  
   This can also be specified on a per-host basis in a configuration file.

   Agent forwarding should be enabled with caution.  Users with the ability to bypass file permissions on the remote host (for the agent's
   UNIX-domain socket) can access the local agent through the forwarded 
   connection.  An attacker cannot obtain key material from the agent,
   however they can perform operations on the keys that enable them to
   authenticate using the identities loaded into the agent.
于 2016-08-09T13:31:12.390 回答
7

当我启动 ssh-agent 时,它已经在运行时,我遇到了这个问题。变得困惑。要查看是否是这种情况,请使用

eval $(ssh-agent)

看看这是否与您认为的一样。就我而言,它与我刚开始的不同。

要进一步验证您是否运行了多个 ssh-agent,您可以查看:

ps -ef | grep ssh
于 2014-07-04T08:48:24.773 回答
7

阅读user456814 的答案以获得解释。在这里,我只尝试自动化修复。

如果您使用带有 Bash 的Cygwin终端,请将以下内容添加到$HOME/.bashrc文件中。这只会在第一个 Bash 终端中启动ssh-agent一次,并将密钥添加到ssh-agent。(我不确定 Linux 是否需要这样做。)

###########################
# start ssh-agent for
# ssh authentication with github.com
###########################
SSH_AUTH_SOCK_FILE=/tmp/SSH_AUTH_SOCK.sh
if [ ! -e $SSH_AUTH_SOCK_FILE ]; then
    # need to find SSH_AUTH_SOCK again.
    # restarting is an easy option
    pkill ssh-agent
fi
# check if already running
SSH_AGENT_PID=`pgrep ssh-agent`
if [ "x$SSH_AGENT_PID" == "x" ]; then
#   echo "not running. starting"
    eval $(ssh-agent -s) > /dev/null
    rm -f $SSH_AUTH_SOCK_FILE
    echo "export SSH_AUTH_SOCK=$SSH_AUTH_SOCK" > $SSH_AUTH_SOCK_FILE
    ssh-add $HOME/.ssh/github.com_id_rsa 2>&1 > /dev/null
#else
#   echo "already running"
fi
source $SSH_AUTH_SOCK_FILE

不要忘记在“ssh-add”命令中添加正确的密钥。

于 2015-07-09T05:48:04.137 回答
6

您必须在添加之前运行此命令:

eval `ssh-agent -s`

然后你必须以这种方式执行命令:

ssh-add ~/.ssh/id_rsa
于 2021-11-20T08:58:19.750 回答
5

Windows 8.1 E 上使用Git Bash,我的解决方案如下:

eval $(ssh-agent) > /dev/null
ssh-add ~/.ssh/id_rsa
于 2014-06-25T18:47:21.500 回答
5

当我试图让它在 Windows 上工作以通过 SSH 连接到存储时,我遇到了类似的问题。

这是对我有用的解决方案。

  1. 原来我在我的 Windows 机器上运行 Pageant ssh 代理 - 我会检查你在运行什么。我怀疑它是 Pageant,因为它是 PuTTY 和 WinSCP 的默认设置。

  2. ssh-add 不适用于此类代理的命令行

  3. 您需要通过 Pageant UI 窗口添加私钥,您可以通过双击任务栏中的 Pageant 图标(一旦它启动)来获得。

  4. 在将密钥添加到 Pageant 之前,您需要将其转换为PPK格式。此处提供完整说明如何将 SSH 密钥转换为 ppk 格式

  5. 这就对了。将密钥上传到 stash 后,我就可以使用 Sourcetree 创建本地存储库并克隆远程存储库。

于 2014-11-17T14:14:01.153 回答
5

对于 Windows 10 中内置的 Bash,我将其添加到文件.bash_profile中:

if [ -z $SSH_AUTH_SOCK ]; then
    if [ -r ~/.ssh/env ]; then
            source ~/.ssh/env
            if [ `ps -p $SSH_AGENT_PID | wc -l` = 1 ]; then
                    rm ~/.ssh/env
                    unset SSH_AUTH_SOCK
            fi
    fi
fi

if [ -z $SSH_AUTH_SOCK ]; then
    ssh-agent -s | sed 's/^echo/#echo/'> ~/.ssh/env
    chmod 600 ~/.ssh/env
    source ~/.ssh/env > /dev/null 2>&1
fi
于 2016-04-26T16:07:14.453 回答
4

我通过强制停止(杀死)git 进程(ssh 代理),然后卸载 Git,然后再次安装 Git 解决了该错误。

于 2014-04-19T10:18:33.103 回答
4

如果您使用 PuTTY,可能需要将“Connection/SSH/Auth/Allow agent forwarding”选项设置为“true”。

在此处输入图像描述

于 2015-01-20T21:34:10.790 回答
3

我有用。

在 CMD 窗口中,键入以下命令:

cd path-to-Git/bin # (for example,cd C:\Program Files\Git\bin)
bash
exec ssh-agent bash
ssh-add path/to/.ssh/id_rsa
于 2015-02-25T11:44:41.193 回答
2

对于 Windows 中的 PowerShell

Start-SshAgent我在使用 PowerShell 和/命令时遇到了问题Add-SshKey,所以我编写了一个快速脚本,可以帮助一些人。这旨在添加到您可以通过执行编辑的 PowerShell 配置文件中notepad $PROFILE

if ($(Get-Process ssh-agent) -eq $null)
{
     $ExecutionContext.InvokeCommand.ExpandString($(ssh-agent -c).Replace("setenv", "set"));
}

它将检测是否ssh-agent正在运行,并且仅在没有代理运行时才执行。请注意,这$ExecutionContext.InvokeCommand.ExpandString是一个非常危险的命令,因此如果您使用的是不受信任的ssh-agent.

于 2015-12-04T13:10:37.943 回答
2

还要检查您的远程 URL。使用git@github...而不是https://协议。

通过自定义端口上的 SSH参见GitExtensions 和 PuTTY

于 2015-11-25T23:47:17.053 回答
1

这是我在使用PowerShell.

将以下功能添加到您的Microsoft.PowerShell_profile.ps1

function RunSsh($userIdentity ) {
   $agent=ssh-agent
   $position=$agent[0].IndexOf("=")
   $ending=$agent[0].IndexOf(";")

   $variableStartPosition=$agent[0].IndexOf("export")
   $variableEndPosition=$agent[0].LastIndexOf(";")
   $variableName=$agent[0].Substring($variableStartPosition+7,$variableEndPosition-$variableStartPosition-7)
   [Environment]::SetEnvironmentVariable($variableName, $agent[0].Substring($position+1,$ending-$position-1))

   $position=$agent[1].IndexOf("=")
   $ending=$agent[1].IndexOf(";")

   $variableStartPosition=$agent[1].IndexOf("export")
   $variableEndPosition=$agent[1].LastIndexOf(";")
   $variableName=$agent[1].Substring($variableStartPosition+7,$variableEndPosition-$variableStartPosition-7)
   [Environment]::SetEnvironmentVariable($variableName, $agent[1].Substring($position+1,$ending-$position-1))

   if($userIdentity.Length -eq 0) {
      ssh-add
   } else {
      ssh-add $userIdentity
   }
}

现在,您可以从命令行运行RunSsh使用文件~\.ssh夹中的身份文件或传入身份文件,RunSsh C:\ssh\id_rsa其中身份文件在哪里C:\ssh\id_rsa

为此,您需要在环境变量中拥有ssh-add和。ssh-agentpath

于 2017-06-09T18:12:56.587 回答
0

甚至我也收到“无法打开与您的身份验证代理的连接”。在生成和添加 SSH 密钥时运行命令:ssh-add ~/.ssh/id_rsa.

我通过停止ssh-agent在我的机器上运行的多个实例解决了这个问题,然后从我的 Windows 机器上的控制面板中卸载了 Git,然后再次安装了 Git,现在一切正常。

于 2014-04-19T10:24:44.507 回答
0

就我而言,我的Comodo 防火墙已对 ssh 代理进行沙盒处理。一旦我禁用沙盒,我就可以克隆存储库。

仅供参考,我在 Windows 7 上使用 Comodo 防火墙。

于 2014-04-25T14:13:48.303 回答
-2
于 2021-03-16T02:20:02.773 回答