![为什么 ssh 代理转发不起作用?](https://linux22.com/image/588970/%E4%B8%BA%E4%BB%80%E4%B9%88%20ssh%20%E4%BB%A3%E7%90%86%E8%BD%AC%E5%8F%91%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8%EF%BC%9F.png)
在我自己的计算机上,运行 MacOSX,我在 ~/.ssh/config 中有这个。
Host *
ForwardAgent yes
Host b1
ForwardAgent yes
b1 是运行 Ubuntu 12.04 的虚拟机。我通过 ssh 连接到它,如下所示:
ssh pupeno@b1
而且我无需输入密码就可以登录,因为我已经复制了我的公钥。由于转发,我应该能够从 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:
答案1
事实证明我的密钥不在代理中,并且此方法可以修复它:
操作系统:
ssh-add -K
Linux/Unix:
ssh-add -k
您可以使用以下方式列出已加载的密钥:
ssh-add -l
ssh-add -L # for more detail
答案2
另一个可能的原因是连接共享:可能已登录另一台主机,但未启用代理转发和连接共享。第二次通过ssh -A
共享连接登录(或在配置文件中指定)将默默忽略该-A
标志。只有在完全注销或禁用第二次登录的连接共享后,代理转发才会起作用。
答案3
我遇到了 sshd 服务器拒绝代理转发请求的问题,因为 /tmp 中没有剩余空间。这是因为 sshd 需要在 /tmp 中创建套接字。清理磁盘解决了我的问题。
ssh -v 当时说:
debug1: Remote: Agent forwarding disabled: mkdtemp() failed: No space left on device
答案4
对我来说,这只是我所连接的主机(b1在原始发帖人的例子中)正在运行它自己的持久性ssh-agent
。我看不到任何调试输出来解释发生了什么,主机只是默默地使用它现有的ssh-agent
,没有发生转发。这对我来说很有意义回想起来:p
转发就像 ssh 端口转发:它是隧道,而不是客户端-服务器协商。
我假定是后者——ssh-agent
代理转发需要在主机上运行,所以我一开始就设置了它,但那是一个错误。
请参阅以下示例:
首先我 ssh 到主机卡玛(树莓派)没有代理转发,并确认没有代理套接字或添加的密钥:
其次,我进行编辑.bashrc
以确保 ssh-agent 正在主机上运行(这是我的错误)。您可以看到,当我使用 重新连接-A
以启用代理转发时,代理套接字存在,但代理没有身份(我现在意识到这是因为这显示的是本地 ssh 代理套接字而不是转发的套接字):
最后,我移除了ssh-agent
raspberry-pi 主机(未显示)上的 并重新连接。使用 进行检查时,您可以看到密钥终于可用了ssh-add -L
: