据我所知,这是WSL中的错误。希望微软会在下一个版本中对其进行修复。但是目前,我们可以使用这个稍微难看的hack。
更新#1:绝对是一个错误。在Github上发现了此问题。如果您不想经历所有这些,那么他们提出的重新启动外壳的变通方法对我也适用。
TL; DR将此添加到END您的SSH配置(通常位于~/.ssh/config
):
Host *
ProxyCommand nc %h %p %r
它起作用的原因如下:我们的SSH问题不是防火墙问题,因为nc
它telnet
可以在同一主机和端口上工作(尝试telnet <host> <port>
或nc <host> <port>
:您应该看到类似的内容SSH-2.0-OpenSSH_6.6.1p1 Ubuntu-2ubuntu2.7
)。这是我们可以利用的优势。
SSH允许使用接受标准输入的代理,然后通过该ProxyCommand
选件将其发送到服务器的端口。通常,它通过使用中间堡垒SSH服务器(有时称为跳转主机)将网络隧道连接到受保护的主机(有关更多信息,请参见此链接)。
该黑客告诉SSH使用没有跳转主机的代理。因此,它通过将所有网络资源分配推送到有效的Netcat来解决SSH失败的TCP资源分配问题。SSH只是在没有任何网络连接的情况下完成其SSH任务,而Netcat通过TCP连接将原始数据发送到SSH服务器。
警告:由于此操作会修改ProxyCommand
所有主机的,因此我不知道它如何与使用的其他SSH配置主机交互ProxyCommand
。我有几台服务器可以用来测试它,我将用结果更新此答案。有可能没有有害的副作用,但是我不能保证。
更新#2:我对一些服务器进行了一些测试,这似乎可行。当有多个条目应用时,SSH使用配置中最上面的条目。因此,ProxyCommand
该hack之上的现有存在将覆盖它。当执行新的SSH命令时,它会重新读取SSH配置,如果没有其他配置,则ProxyCommand
SSH使用我们的hack ProxyCommand
,从而使其仅适用于“最外面的” SSH会话。警告词:如果将hack放在配置文件的顶部(或尝试SSH进入的条目的上方),则要求a的SSH会话ProxyCommand
将忽略另一个ProxyCommand
,而是尝试解析主机地址并连接直接与Netcat合作。