为什么 ssh 代理转发不起作用?

Pab*_*blo 70 ubuntu ssh mac-osx forwarding

在我自己的计算机上,运行 MacOSX,我在 ~/.ssh/config 中有这个

Host *
ForwardAgent yes
Host b1
ForwardAgent yes
Run Code Online (Sandbox Code Playgroud)

b1 是运行 Ubuntu 12.04 的虚拟机。我像这样 ssh 到它:

ssh pupeno@b1
Run Code Online (Sandbox Code Playgroud)

我在没有被要求输入密码的情况下登录,因为我已经复制了我的公钥。由于转发,我应该能够从 b1 ssh 到 pupeno@b1 并且它应该可以工作,而不需要我输入密码,但它没有。它要求我输入密码。

我错过了什么?

这是第二个 ssh 的详细输出:

pupeno@b1:~$ ssh -v pupeno@b1
OpenSSH_5.9p1 Debian-5ubuntu1, OpenSSL 1.0.1 14 Mar 2012
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 19: Applying options for *
debug1: Connecting to b1 [127.0.1.1] port 22.
debug1: Connection established.
debug1: identity file /home/pupeno/.ssh/id_rsa type -1
debug1: identity file /home/pupeno/.ssh/id_rsa-cert type -1
debug1: identity file /home/pupeno/.ssh/id_dsa type -1
debug1: identity file /home/pupeno/.ssh/id_dsa-cert type -1
debug1: identity file /home/pupeno/.ssh/id_ecdsa type -1
debug1: identity file /home/pupeno/.ssh/id_ecdsa-cert type -1
debug1: Remote protocol version 2.0, remote software version OpenSSH_5.9p1 Debian-5ubuntu1
debug1: match: OpenSSH_5.9p1 Debian-5ubuntu1 pat OpenSSH*
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_5.9p1 Debian-5ubuntu1
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: server->client aes128-ctr hmac-md5 none
debug1: kex: client->server aes128-ctr hmac-md5 none
debug1: sending SSH2_MSG_KEX_ECDH_INIT
debug1: expecting SSH2_MSG_KEX_ECDH_REPLY
debug1: Server host key: ECDSA 35:c0:7f:24:43:06:df:a0:bc:a7:34:4b:da:ff:66:eb
debug1: Host 'b1' is known and matches the ECDSA host key.
debug1: Found key in /home/pupeno/.ssh/known_hosts:1
debug1: ssh_ecdsa_verify: signature correct
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: Roaming not allowed by server
debug1: SSH2_MSG_SERVICE_REQUEST sent
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey,password
debug1: Next authentication method: publickey
debug1: Trying private key: /home/pupeno/.ssh/id_rsa
debug1: Trying private key: /home/pupeno/.ssh/id_dsa
debug1: Trying private key: /home/pupeno/.ssh/id_ecdsa
debug1: Next authentication method: password
pupeno@b1's password:
Run Code Online (Sandbox Code Playgroud)

Pab*_*blo 109

原来我的钥匙不在代理中,这修复了它:

操作系统

ssh-add -K
Run Code Online (Sandbox Code Playgroud)

Linux/Unix :

ssh-add -k
Run Code Online (Sandbox Code Playgroud)

您可以使用以下方法列出加载的密钥:

ssh-add -l

ssh-add -L # for more detail
Run Code Online (Sandbox Code Playgroud)

  • 请注意,`ssh-add -K` 特定于 OS X。 (5认同)
  • 每次重新启动时都必须这样做吗? (3认同)

W.M*_*ann 10

另一个可能的原因是连接共享:一个人可能已经登录到另一台主机上,而没有启用代理转发和连接共享。ssh -A通过共享连接使用(或在配置文件中等效指定)的第二次登录将静默忽略该-A标志。只有在完全注销或禁用第二次登录的连接共享后,代理转发才会起作用。

  • 是的!有些人可能不记得他们在配置中设置了“ControlMaster”。如果 master 处于活动状态并且您与代理转发建立新连接,则它将不起作用。假设您是一个细心的用户,希望代理在短时间内使用 `-ASnone` 而不是 `-A`(或配置中的 `ControlPath none`) (2认同)

Dan*_*ida 8

  1. 检查您的~/.ssh/id_rsa ~/.ssh/id_dsa ~/.ssh/id_ecdsa文件是否具有正确的权限,这些权限应该由您的用户拥有并被 chmoded 600。

  2. 检查pupeno/.ssh/authorized_keysb1上的公钥是否正确,并检查authorized_keys密钥末尾是否有换行符。

  3. 检查您是否运行了 ssh-agent,尝试通过以下方式加载密钥 ssh-add

  4. 尝试基于 GSSAPI 的身份验证和转发 ssh -K


Bar*_*oży 7

我遇到了 sshd 服务器拒绝代理转发请求的问题,因为 /tmp 中没有剩余空间。这是因为 sshd 需要在 /tmp 中创建套接字。清理磁盘解决了我的问题。

ssh -v 当时说:

debug1: Remote: Agent forwarding disabled: mkdtemp() failed: No space left on device
Run Code Online (Sandbox Code Playgroud)

  • 我遇到了同样的问题,只是 /tmp 上的权限错误。谢谢!! (2认同)

小智 7

对我来说,这只是我连接到的主机(原始海报示例中的b1)正在运行它自己的 persistence ssh-agent。我看不到任何调试输出来解释发生了什么,主机只是默默地使用它现有的ssh-agent并且不会发生转发。回想起来,这对我来说很有意义:p

转发就像 ssh 端口转发:它是隧道,而不是客户端-服务器协商。

认为是后者——ssh-agent代理转发需要在主机上运行,​​所以我一开始就设置了它,但这是一个错误。

请参阅以下示例:

首先,我通过 ssh 连接到没有代理转发的ccam(树莓派),并确认没有代理套接字或添加的密钥:

无代理转发

其次,我进行编辑.bashrc以确保 ssh-agent 正在主机上运行(这是我的错误)。您可以看到,当我使用启用-A代理转发重新连接时,代理套接字存在,但代理没有身份(我现在意识到这是因为这显示的是本地 ssh-agent 套接字而不是转发的套接字):

向主机添加 ssh-agent

最后,我删除了ssh-agent树莓派主机(未显示)上的 并重新连接。使用以下命令进行检查时,您可以看到密钥最终可用ssh-add -L

成功转发 ssh 密钥

  • 谢谢你!我对代理做了同样的假设,为了方便起见,我让主机生成并连接到 SSH 代理。现在我要确保在启动代理之前用户没有通过 SSH 连接。有时我觉得 SSH 实在是太令人困惑了。 (2认同)