我遇到了以下错误:
$ 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.
$ ssh-agent /bin/sh
和 $ ssh-add $yourkey
git config --list
来查看您是否设置了 credential.helper
- 如果有,您应该删除此设置,因为助手没有帮助。
您是否启动了 ssh-agent?
您可能需要在运行 ssh-add
命令之前启动 ssh-agent
:
eval `ssh-agent -s`
ssh-add
请注意,这将启动 msysgit Bash on Windows 的代理。如果您使用不同的 shell 或操作系统,您可能需要使用命令的变体,例如 other answers 中列出的那些。
请参阅以下答案:
ssh-add 抱怨:无法打开与您的身份验证代理的连接 Git push 需要用户名和密码(包含有关如何使用 ssh-agent 的详细说明)如何运行 (git/ssh) 身份验证代理?无法打开与您的身份验证代理的连接
要自动启动 ssh-agent 并允许单个实例在多个控制台窗口中工作,请参阅 Start ssh-agent on login。
为什么我们需要使用 eval 而不仅仅是 ssh-agent?
要找出原因,请参阅 this comment。
公钥与私钥
此外,每当我使用 ssh-add
时,我总是向它添加私钥。文件 ~/.ssh/id_rsa.pub
看起来像一个公钥,我不确定这是否可行。您有 ~/.ssh/id_rsa
文件吗?如果您在文本编辑器中打开它,它会说它是私钥吗?
我尝试了其他解决方案无济于事。我进行了更多研究,发现以下命令有效。我正在使用 Windows 7 和 Git Bash。
eval $(ssh-agent)
更多信息请参见:https://coderwall.com/p/rdi_wq (web archive version)
以下命令对我有用。我正在使用 CentOS。
exec ssh-agent bash
ssh-add my.id_rsa
对我来说会失败。但是 exec ssh-agent zsh
提供了一个我可以毫无问题地ssh-add
的环境。我在我的码头集装箱里:)
exec ssh-agent fish
。其他解决方案都不适合我。这应该是公认的答案。我无法在 Raspbian buster 上添加我的身份。
无法打开与您的身份验证代理的连接
要解决此错误:
重击:
$ eval `ssh-agent -s`
tcsh:
$ eval `ssh-agent -c`
然后像往常一样使用 ssh-add
。
热点提示:
我总是忘记为上述 ssh-agent 命令键入什么内容,因此我在 .bashrc
文件中创建了一个别名,如下所示:
alias ssh-agent-cyg='eval `ssh-agent -s`'
现在我可以使用 ssh-agent-cyg
而不是使用 ssh-agent
例如
$ 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
ssh-agent
时,您都需要运行 eval
命令。我现在使用别名,请参阅更新的答案以了解如何执行此操作。
fatal: Could not read from remote repository.
。
MsysGit 或 Cygwin
如果您使用的是 Msysgit 或 Cygwin,您可以在 SSH-Agent in msysgit and cygwin and bash 找到一个很好的教程:
将一个名为 .bashrc 的文件添加到您的主文件夹。打开文件并粘贴: #!/bin/bash eval `ssh-agent -s` ssh-add 这假定您的密钥位于常规的 ~/.ssh/id_rsa 位置。如果不是,请在 ssh-add 命令后包含完整路径。添加或创建包含 ForwardAgent 内容的文件 ~/.ssh/config 是 在原始教程中,ForwardAgent 参数是 Yes,但这是一个错字。全部使用小写,否则会出错。重新启动 Msysgit。它会要求您输入一次密码,仅此而已(直到您结束会话,或者您的 ssh-agent 被杀死。)
Mac/OS X
如果您不想在每次打开终端时都启动新的 ssh-agent,请查看 Keychain。我现在使用的是 Mac,所以我使用教程 ssh-agent with zsh & keychain on Mac OS X 来设置它,但我确信 Google 搜索会包含大量适用于 Windows 的信息。
更新:在 Mac 上更好的解决方案是将您的密钥添加到 Mac OS 钥匙串:
ssh-add -K ~/.ssh/id_rsa
就那么简单。
eval `ssh-agent -s`
时,退出 cygwin 时进程不会停止。
ps -u $(whoami) | grep ssh-agent &> /dev/null || eval $(ssh-agent)
- 否则每次都会启动一个新的 ssh-agent。当用户有 cronjobs 时,不时地杀死我的机器。
ForwardAgent yes
不是必需的,如果它是为任何不受信任的服务器设置的,它就是一个 nontheoretical security risk。无论此设置如何,对您的密钥代理的本地访问都应该起作用。
跑
ssh-agent bash
ssh-add
要获取更多详细信息,您可以搜索
ssh-agent
或运行
man ssh-agent
ssh-copy-id
。不确定为什么我不能在不使用 ssh-agent
启动 bash 的情况下添加密钥。
ssh-agent zsh; ssh-add
ssh-add 和 ssh(假设您使用的是 openssh 实现)需要一个环境变量才能知道如何与 ssh 代理通信。如果您在与您现在使用的不同的命令提示符窗口中启动代理,或者如果您启动不正确,则 ssh-add 和 ssh 都不会看到该环境变量集(因为环境变量是在本地设置的命令提示它已设置)。
您没有说明您使用的是哪个版本的 ssh,但如果您使用的是 cygwin,则可以使用 SSH Agent on Cygwin 中的此配方:
# 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
这将为您打开的每个新命令提示符窗口自动启动一个代理(如果您在一个会话中打开多个命令提示符,这是次优的,但至少它应该可以工作)。
eval $(ssh-agent)
,我可以为每个新的终端窗口使用无密码 ssh。
我在 Linux 上遇到了同样的问题,这就是我所做的:
基本上,命令 ssh-agent 启动代理,但它并没有真正设置环境变量以使其运行。它只是将这些变量输出到 shell。
你需要:
eval `ssh-agent`
然后做 ssh-add。请参阅 Could not open a connection to your authentication agent。
我没有使用 ssh-agent -s
,而是使用 eval `ssh-agent -s`
来解决这个问题。
这是我逐步执行的操作(Git Bash 上的第 2 步):
在 C:\user\
ssh-agent -s
重新启动代理并使用 ssh-add ~/.ssh/id_rsa 添加旧密钥。如果您生成新的 SSH 密钥,那么您将需要在所有服务(例如 github、bitbucket 等)中更新该密钥。
ssh-agent -s
”和“ssh-add ~/.ssh/id_rsa”。
尝试执行以下步骤:
打开 Git Bash 并运行: cd ~/.ssh 尝试运行代理: eval $(ssh-agent) 现在,您可以运行以下命令: ssh-add -l
ps aux | grep ssh
和 kill
命令来杀死特工。之后 ssh-add
在没有 -l 开关的情况下工作(使用 -l 会出错)。 eval 'ssh-agent'
在 Rick 的回答中不起作用,我不得不在 Chechoro 的回答中使用 eval $(ssh-agent)
。
$(ssh-agent)
等价于 `ssh-agent`
,但更具可读性。
ssh-agent
时没有,但为什么呢?为什么必须使用eval
?
在 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 代理失败。
set
替换为 export
我遇到的一件事是 eval
对我使用 Cygwin 不起作用,对我有用的是 ssh-agent ssh-add id_rsa
。
之后我遇到了我的私钥太开放的问题,我设法找到了解决方案(来自 here):
chgrp Users id_rsa
也
chmod 600 id_rsa
最后我能够使用:
ssh-agent ssh-add id_rsa
eval `ssh-agent`
,在 ssh-agent
周围加上了反引号 `
,如 my answer 所示?这对我来说在 Cygwin 中工作得很好。您似乎是对的,ssh-agent ssh-add
也可以工作,至少在 msysgit Bash 中是这样。但是,请注意 id_rsa
是使用的默认键,因此您无需使用 ssh-agent ssh-add id_rsa
指定它。
对于 Windows 用户,我发现 cmd eval `ssh-agent -s`
不起作用,但使用 Git Bash 可以解决问题:
eval `ssh-agent -s`; ssh-add KEY_LOCATION
并确保没有禁用 Windows 服务“OpenSSH 密钥管理”。
要在 Windows 7 的 n3o's answer 上放大...
我的问题确实是没有设置一些必需的环境变量,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 工作所需的环境变量。
Could not open a connection to your authentication agent.
。
我刚刚得到这个工作。打开您的 ~/.ssh/config
文件。
附加以下 -
Host github.com
IdentityFile ~/.ssh/github_rsa
给我提示 Set up SSH for Git 的页面说单个空格缩进很重要......尽管我在这里有一个来自 Heroku 的配置,它没有那个空间并且工作正常。
如果您按照这些说明进行操作,您的问题将得到解决。
如果您使用的是 Mac 或 Linux 计算机,请键入:
eval "$(ssh-agent -s)"
如果您使用的是 Windows 计算机,请键入:
ssh-agent -s
我在 Ubuntu 上遇到了同样的问题,其他解决方案对我没有帮助。
我终于意识到我的问题是什么。我在 /root/.ssh
文件夹中创建了我的 SSH 密钥,所以即使我以 root 身份运行 ssh-add
,它也无法完成它的工作并一直说:
无法打开与您的身份验证代理的连接。
我在 /home/myUsername/
文件夹中创建了我的 SSH 公钥和私钥,并使用了
ssh-agent /bin/sh
然后我跑了
ssh-add /home/myUsername/.ssh/id_rsa
问题就这样解决了。
注意:要在 Git 中访问您的存储库,请在使用 ssh-keygen -t rsa -C "your Git email here"
创建 SSH 密钥时添加您的 Git 密码。
让我提供另一种解决方案。如果您刚刚安装了 Git 1.8.2.2 或更高版本,并且想要启用 SSH,请遵循写得很好的 directions。
一直到步骤 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 及以后的步骤。
这将运行 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 代理需要像这样管理。
ps -A | grep ssh-agent
或 ps h -C ssh-agent
而不是 ps | grep ssh-agent
echo ssh-auth | bash
会失败。
AddKeysToAgent yes
(或使用 prompt
)添加到您的 ssh 配置条目(对所有主机使用 Host *
。)这样,如果您实际尝试连接,则只会要求您输入 SSH 密码,否则可能会询问您用于简单 git diff
或 git status
的密码。
$HOME/.ssh
可能比 /home/$(whoami)/.ssh
更强大
许多答案都回答了运行 ssh-agent
的基本解决方案。然而,运行 ssh-agent
多次(每个打开的终端或每个远程登录)将创建许多副本 ot ssh-agent
在内存中运行。建议避免该问题的脚本很长,需要编写和/或复制分隔文件或需要在 ~/.profile
或 ~/.schrc
中写入太多字符串。让我建议简单的两个字符串解决方案:
对于 sh、bash 等:
# ~/.profile
if ! pgrep -q -U `whoami` -x 'ssh-agent'; then ssh-agent -s > ~/.ssh-agent.sh; fi
. ~/.ssh-agent.sh
对于 csh、tcsh 等:
# ~/.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 进程,则通过调用 ssh-agent 创建适当的 shell 脚本文件并运行 ssh-agent 本身
评估创建的配置适当环境的 shell 脚本
没有必要保护已创建的 shell 脚本 ~/.ssh-agent.tcsh
或 ~/.ssh-agent.sh
免受其他用户的访问,因为:与 ssh-agent
的第一次通信是通过其他用户无法访问的受保护套接字处理的,然后其他用户可以通过在 /tmp/
目录中的枚举文件找到 ssh-agent
简单的套接字。至于对 ssh-agent
进程的访问它是相同的事情。
在 Windows 10 中,使用命令提示符终端,以下对我有用:
ssh-agent cmd
ssh-add
在此之后,您应该被要求输入密码:
Enter passphrase for /c/Users/username/.ssh/id_rsa:
ssh-agent bash
或 ssh-agent zsh
可能是解决方案。
尝试以下操作:
ssh-agent sh -c 'ssh-add && git push heroku master'
连接服务器时使用参数-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.
当我启动 ssh-agent 时,它已经在运行时,我遇到了这个问题。似乎多个实例相互冲突。
要查看 ssh-agent 是否已经在运行,请检查 SSH_AGENT_SOCK 环境变量的值:
echo $SSH_AGENT_SOCK
如果已设置,则代理可能正在运行。
要检查您是否有多个 ssh-agent 在运行,您可以查看:
ps -ef | grep ssh
当然,那么您应该终止您创建的任何其他实例。
eval $(ssh-agent)
应该每次都创建一个具有不同 PID 的新代理,尽管我可能是错的。
kill <process_id> pid
阅读 user456814's answer 以获取解释。在这里,我只尝试自动化修复。
如果您使用带有 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”命令中添加正确的密钥。
当我试图让它在 Windows 上工作以通过 SSH 连接到存储时,我遇到了类似的问题。
这是对我有用的解决方案。
原来我在我的 Windows 机器上运行 Pageant ssh 代理 - 我会检查你在运行什么。我怀疑它是 Pageant,因为它是 PuTTY 和 WinSCP 的默认设置。 ssh-add 不适用于此类代理的命令行 您需要通过 Pageant UI 窗口添加私钥,您可以通过双击任务栏中的 Pageant 图标(一旦启动)来获得该窗口。在将密钥添加到 Pageant 之前,您需要将其转换为 PPK 格式。此处提供了完整的说明如何将 SSH 密钥转换为 ppk 格式就是这样。将密钥上传到 stash 后,我就可以使用 Sourcetree 创建本地存储库并克隆远程存储库。
对于 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
$(ssh-agent -s)
来设置代理的环境。
在 Windows 8.1 E 上使用 Git Bash,我的解决方案如下:
eval $(ssh-agent) > /dev/null
ssh-add ~/.ssh/id_rsa
/dev/null
?您的回答基本上与 this one 完全相同。
~/.ssh/id_rsa
是默认键,因此您不必指定 ssh-add ~/.ssh/id_rsa
,只需 ssh-add
即可。
> /dev/null
被广泛使用,例如 stackoverflow.com/questions/17846529/…。我想这不是真的必要。 The output redirect just gets rid of the printed "Agent pid blah blah".
,见 blog.joncairns.com/2013/12/understanding-ssh-agent-and-ssh-add。
我通过强制停止(杀死)git 进程(ssh 代理),然后卸载 Git,然后再次安装 Git 解决了该错误。
“代理转发”是一种可以帮助您的技术。这使得本地 SSH 密钥在服务器内的活动会话期间“可用”。
如果您在 Windows 上使用 PuTTY,则需要将“Connection/SSH/Auth/Allow agent forwarding”选项设置为“true”。
https://i.stack.imgur.com/2I48J.png
不定期副业成功案例分享
ssh-add
只是解密主机上的加密私钥,以便可以在本地使用它...它从未发送给任何人。我猜只有公钥是通过网络发送的。我的理解不正确吗?eval ssh-agent -s
有效,而ssh-agent
本身却无效。SSH_AUTH_SOCK
IIRC)。如果您只运行ssh-agent
,那么代理将启动,但 SSH 将不知道在哪里可以找到它。