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

Tzo*_*Noy 4 linux ssh 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
Run Code Online (Sandbox Code Playgroud)

为什么会这样?我在我的本地机器上很容易做到了,但是远程服务器不能正常工作。

更新

当我做

ssh-agent
Run Code Online (Sandbox Code Playgroud)

我明白了

SSH_AUTH_SOCK=/tmp/ssh-blGr6z5dJjit/agent.14183; export SSH_AUTH_SOCK;
SSH_AGENT_PID=14184; export SSH_AGENT_PID;
echo Agent pid 14184;
Run Code Online (Sandbox Code Playgroud)

但比我尝试做 git fetch 时,我得到了这个:

Permission denied (publickey).
fatal: The remote end hung up unexpectedly
Run Code Online (Sandbox Code Playgroud)

即使在我添加了密钥之后

ssh-add ~/.ssh/bitbucket
Run Code Online (Sandbox Code Playgroud)

我收到这个错误

Could not open a connection to your authentication agent.
Run Code Online (Sandbox Code Playgroud)

kas*_*erd 5

这个问题有点不清楚,所以这个答案可能真的是一个不同的问题。但由于答案可能对其他人仍然有用,我认为值得保留。

当您键入ssh-agent /bin/bash一个 ssh-agent 实例时,它会一直运行,只要该 shell 处于活动状态。默认情况下,该 ssh-agent 将仅由该 shell 使用,一旦您关闭该 shell,它将终止。

如果您只输入ssh-agent,则代理将在后台启动,即使您关闭外壳,该代理也会继续运行。ssh-agent 命令将在 stdout 上打印命令,可以输入这些命令以开始使用该 ssh-agent。您每次都必须键入这些命令。

您可以启动后台 ssh-agent 并通过键入 开始在当前 shell 中使用它eval $(ssh-agent)。但是SSH_AUTH_SOCK,如果您再次登录,则必须将环境变量存储在某处并进行设置。

有了这些背景信息,我有关于如何让代理始终可用的三个建议。

  • 在服务器上使用屏幕会话。当您启动 screen type 时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
Run Code Online (Sandbox Code Playgroud)

可以~/.bash_profile像这样调用它eval $(find-agent)(假设脚本名为 find-agent。)