每次在我的服务器上都需要启动 ssh-agent

每次在我的服务器上都需要启动 ssh-agent

我已经使用这个 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覆盖 使用的路径。sshIdentityFile

如果~/.ssh/config包含不正确的IdentityFile设置,您将看到帖子中描述的症状。

相关内容