首次通过 jump-host 连接时,SSH 不会提示主机真实性

首次通过 jump-host 连接时,SSH 不会提示主机真实性

有一个跳转主机,通过 ProxyCommand 调用,用于访问某些服务器。在.ssh/配置文件中有Host每个服务器的定义和jumphost的命令(带有%r%h来自主机配置):

Host myserver
    Hostname myserver.mydomain.net
    User technic
    port 22
    ProxyCommand ssh -x -p 22 jumpuser@jumphost ssh -6 -p 22 -x %r@%h "nc localhost %p"

访问跳转主机然后发出ssh <host>命令有效并提示我确认连接。然后以下连接工作正常甚至通过跳转主机

如果我尝试连接直接地通过跳转主机我明白了无需提示真实性确认后我才收到

key_load_public:没有此文件或目录主机密钥验证失败。

我使用以下版本:OpenSSH_6.9p1LibreSSL 2.1.8

我是否需要先与每台服务器建立手动连接(手动连接到 jumphost + 手动连接到服务器),以便它们随后正常工作?

或者是否有一些设置可以提示我确认连接即使是第一次通过 jumphost 连接(无需升级 OpenSSH)

答案1

这不是“直接”连接。使用您当前的配置,您实际上是在SSH 连接到目标主机。一个 SSH 客户端在跳转主机上运行,​​另一个在本地机器上运行(通过前者与目标对话),错误消息由后者生成。

您的本地客户端仍像以前一样工作,但远程(jumphost)客户端以非交互模式运行 - 它没有伪终端,即使有,它的所有输入/输出都附加到本地客户端的“网络端”。因此,远程客户端无法生成可见的提示(它会被本地客户端误解为格式错误的 SSH 流量),也无法接收确认输入。

您只能通过删除第二个(冗余)连接来避免这种情况完全地,并将您的 ProxyCommand 简化为以下之一:

ProxyCommand ssh -W %h:%p jumpuser@jumphost

ProxyCommand ssh -x jumpuser@jumphost "nc -6 %h %p"

ProxyCommand ssh -x jumpuser@jumphost "socat stdio tcp6:%h:%p"

ProxyCommand ssh -x jumpuser@jumphost "(cat <&\$fd & cat >&\$fd) {fd}<>/dev/tcp/%h/%p"

在这些方法中,首选SSH-W如果可用,使用nc/ncat/socat否则,尝试猫$fd作为最后的手段。(如果跳转主机禁止SSH-W并且没有数控也不酶联免疫吸附试验也不索卡特,尝试与您的 IT 团队讨论为什么他们故意让正确使用 jumphost 变得更加困难。)

相关内容