为什么 SSH 总是使用服务器接受的第一个密钥?

shv*_*hvv 6 linux ssh ssh-agent ubuntu

我有三个 SSH 密钥对,可以通过以下方式找到ssh-add -L;远程服务器接受两个密钥,但只有一个密钥可用于 GitHub,我想通过代理转发克隆一个 GitHub 存储库(托管限制阻止部署密钥工作)

  • 以下无法登录 GitHub,我发现 SSH 可能使用id_rsa通过 列出的第一个密钥 [ ] ssh-add -L,忽略我的-i命令,因此代理转发仅在删除密钥后才有效id_rsa
    ssh -A -tt -i ~/.ssh/id_rsa_github user@ip 'ssh -T git@github.com'
    
    Run Code Online (Sandbox Code Playgroud)
  • 尝试添加IdentityFileand IdentitiesOnlyto ~/.ssh/config,但也不成功

这是正常行为吗?如何强制 SSH 使用特定密钥?

Kam*_*ski 3

我认为这很正常。代理已经知道一些密钥。then-i是 的一个选项ssh,它不会直接影响代理。当询问时,ssh可以向代理添加密钥,但没有直接的方法可以删除密钥或更改其顺序。此外,该代理旨在为许多客户提供服务。其中一些可能需要您想要从该特定ssh连接中“隐藏”的密钥。你需要一种稍微不同的方法。

\n

将本地作为专用ssh代理的子进程运行,然后将所需的密钥添加到代理中。这样,密钥将是相关代理唯一知道的密钥。使用通用代理(如果有)的进程不会受到影响。ssh

\n
ssh-agent ssh -A -tt -o AddKeysToAgent=yes -i ~/.ssh/id_rsa_github user@ip \'ssh -T git@github.com\'\n
Run Code Online (Sandbox Code Playgroud)\n

man 1 ssh-agent

\n
\n

command [arg ...]
\n如果给出命令(和可选参数),则该命令将作为代理的子进程执行。当命令行上给出的命令终止时,代理会自动退出。

\n

[\xe2\x80\xa6]

\n

[\xe2\x80\xa6] 代理启动一个命令,在该命令下导出其环境变量 [\xe2\x80\xa6]

\n

[\xe2\x80\xa6]

\n

[\xe2\x80\xa6]ssh(1)查看这些环境变量并使用它们建立与代理的连接。

\n

代理最初没有任何私钥。ssh-add(1)使用或 中设置的ssh(1)时间添加密钥。[\xe2\x80\xa6]AddKeysToAgentssh_config(5)

\n
\n

man 1 ssh

\n
\n

-o option
\n可用于以配置文件中使用的格式给出选项。

\n
\n

man 5 ssh_config

\n
\n

AddKeysToAgent
\n指定键是否应自动添加到正在运行的ssh-agent(1). 如果将此选项设置为yes并从文件加载密钥,则密钥及其密码短语将以默认生命周期添加到代理中,就像通过 一样ssh-add(1)

\n
\n