Windows 10 Linux 子系统 SSH 客户端资源暂时不可用

kel*_*ell 31 ssh bash windows-10 windows-subsystem-for-linux

我正在尝试通过 ssh 连接到 Windows 10 Linux 子系统中的远程服务器。我正在使用 MS Windows 10 Home Insider Preview build 14366。

在命令提示符下,我键入:

ssh 用户@domain.com

输入 ssh 命令几秒钟后,我收到以下消息:

ssh:连接到主机 domain.com 端口 22:资源暂时不可用

我能够成功地使用 Putty 以及在 Git Bash 中使用 ssh 进行连接。

所以,这让我相信问题出在我的本地电脑上,更具体地说是在 Linux 子系统中。我对 Linux 环境仍然很陌生,不知道如何解释这条消息。哪些资源不可用,我该怎么做才能使其可用?

com*_*125 13

据我所知,这是 WSL 中的一个错误。希望微软会在下一个版本中修复它。但是现在,我们可以使用这个稍微丑陋的 hack。

更新 #1:绝对是一个错误。在 Github 上发现了这个问题。如果您不想经历所有这些,他们提出的重新启动 shell 的解决方法也适用于我。

TL;DR 添加这个以结束你的 SSH 配置(通常位于~/.ssh/config):

Host *
    ProxyCommand nc %h %p %r
Run Code Online (Sandbox Code Playgroud)

这也是为什么它的工作原理:我们的SSH问题不是防火墙的问题,因为nctelnet工作在同一主机和端口(尝试telnet <host> <port>nc <host> <port>:你应该看到类似SSH-2.0-OpenSSH_6.6.1p1 Ubuntu-2ubuntu2.7)。我们可以利用这一点。

SSH 允许使用代理接收标准输入并通过ProxyCommand选项将其发送到服务器的端口。这通常用于通过使用中间堡垒 SSH 服务器(有时称为跳转主机)将网络隧道连接到受保护的主机(有关更多信息,请参阅此链接)。

这个 hack 告诉 SSH 使用没有跳转主机的代理。因此,它通过将所有网络资源分配推送到确实有效的 Netcat 来绕过 SSH 分配失败的 TCP 资源。SSH 只是在没有任何网络连接的情况下执行 SSH 操作,Netcat 通过 TCP 连接将原始数据发送到 SSH 服务器。

警告:由于这会修改ProxyCommand所有主机的 ,我不知道它如何与其他使用ProxyCommand. 我有几台服务器可以用来测试这个,我会用结果更新这个答案。有可能没有有害的副作用,但我不能保证。

更新 #2:我对我的一些服务器进行了一些测试,这似乎有效。当多个条目适用时,SSH 使用配置中最上面的条目。因此,ProxyCommand此 hack 之上的现有存在将覆盖它。当执行新的 SSH 命令时,它会重新读取 SSH 配置,如果没有其他 SSH 配置,则ProxyCommandSSH 使用我们的 hack ProxyCommand,使其仅适用于“最外层”SSH 会话。警告词:如果您将 hack 放在配置文件的顶部(或您尝试通过 SSH 连接的条目上方),则需要 SSH 会话的 SSH 会话ProxyCommand将忽略其他会话,ProxyCommand而是尝试解析主机地址并进行连接直接用Netcat。