我已经使用这个 bitbucket 教程来提供对 git repo 的 ssh 访问: https://confluence.atlassian.com/pages/viewpage.action?pageId=270827678
但是现在每次我想要使用 git 时它都会说我没有权限,直到我这样做:
ssh-agent /bin/bash
&&
ssh-add ~/.ssh/id_rsa
为什么会发生这种情况?我在本地机器上轻松完成了此操作,但远程服务器运行不正常。
更新
当我做
ssh-agent
我明白了
SSH_AUTH_SOCK=/tmp/ssh-blGr6z5dJjit/agent.14183; export SSH_AUTH_SOCK;
SSH_AGENT_PID=14184; export SSH_AGENT_PID;
echo Agent pid 14184;
但是当我尝试执行 git fetch 时,我得到了这个:
Permission denied (publickey).
fatal: The remote end hung up unexpectedly
即使我添加了密钥
ssh-add ~/.ssh/bitbucket
我收到这个错误
Could not open a connection to your authentication agent.
答案1
问题有点不清楚,所以这个答案可能真的针对另一个问题。但由于这个答案可能对其他人仍然有用,我认为值得保留。
当您输入时,ssh-agent /bin/bash
会启动 ssh-agent 的一个实例,只要该 shell 处于活动状态,它就会一直运行。默认情况下,ssh-agent 仅由该 shell 使用,一旦您关闭该 shell,它就会终止。
如果您只输入ssh-agent
,则将在后台启动一个代理,即使您关闭 shell,该代理仍会继续运行。ssh-agent 命令将在 stdout 上打印命令,您可以输入这些命令来开始使用该 ssh-agent。您每次都必须输入这些命令。
您可以启动后台 ssh-agent,并通过键入 开始在当前 shell 中使用它eval $(ssh-agent)
。但是,您必须将SSH_AUTH_SOCK
环境变量存储在某处,并在再次登录时进行设置。
了解了这些背景信息后,我对如何确保代理始终可用有三点建议。
- 在服务器上使用屏幕会话。当您启动屏幕类型时
eval $(ssh-agent) ; screen
,该代理将保持在服务器上运行,如果您稍后再次连接到该屏幕,它仍会记住要使用哪个代理。 - 在您的文件中插入命令
~/.bash_profile
以查找活动代理(如果存在)并设置SSH_AUTH_SOCK
环境变量。 - 使用 ssh 代理转发来使用客户端上的代理,而不是服务器上的代理。在使用它之前,请确保您了解它的安全隐患。
~/.bash_profile
可以使用类似这样的脚本来查找 ssh-agent
#!/bin/bash
for P in /tmp/ssh-*/agent.*
do
if [ -O "$P" ] && [ -O "$(dirname "$P")" ]
then
L=$(SSH_AUTH_SOCK="$P" timeout 1s ssh-add -l > >(wc -l))
case $? in
0)
echo "$L $P"
;;
1)
echo "0 $P"
;;
esac
fi &
done | sort -rn | if read N P
then
echo "SSH_AUTH_SOCK='$P'; export SSH_AUTH_SOCK"
else
ssh-agent
fi
可以通过~/.bash_profile
这样的方式调用eval $(find-agent)
(假设脚本名为 find-agent)。
答案2
ssh 命令可能会失败并显示错误消息Permission denied (publickey).
,但如果您错误配置了 ssh 客户端,则只要您预先将相同的密钥加载到代理中,ssh 命令就会起作用。
默认情况下ssh
,和ssh-add
将从相同位置加载密钥,因此要么两者都能找到所需的密钥,要么都找不到。但是在/etc/ssh/ssh_config
和中,您可以通过设置~/.ssh/config
覆盖 使用的路径。ssh
IdentityFile
如果~/.ssh/config
包含不正确的IdentityFile
设置,您将看到帖子中描述的症状。