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

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

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

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

远程控制[电子邮件保护]

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

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

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

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

答案1

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

更新 #1:肯定是 bug。已找到这个问题在 Github 上。如果你不想经历所有这些,他们建议的重新启动 shell 的解决方法对我来说也有效。

TL;DR 将其添加到 END 你的 SSH 配置(通常位于~/.ssh/config):

Host *
    ProxyCommand nc %h %p %r

它之所以有效的原因如下:我们的 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所有主机的,我不知道它如何与使用的其他 SSH 配置主机交互ProxyCommand。我有几个服务器可以用来测试,我会用结果更新这个答案。有可能没有有害的副作用,但我不能保证。

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

答案2

这对我来说也是一个问题,原来是我的(赛门铁克)防火墙阻止了来自 bash 的所有互联网流量。

这似乎是第三方防火墙提供商无法识别该过程的普遍问题:

https://github.com/Microsoft/BashOnWindows/issues/809

当我禁用防火墙时,它工作正常。目前找不到更好的解决方案。

答案3

供将来参考,当您安装 Nginx 时,它将默认阻止 SSH,并显示错误消息“资源暂时不可用”,除非您...

sudo ufw 允许 ssh

答案4

在 ssh 工作正常之后,我突然遇到了同样的问题,然后我发现 windows 进行了更新,影响了我的 Hyper-V 虚拟交换机配置。经过一些尝试后,我能够修复它,主要是通过禁用和删除 windows 更新后添加的一个 Hyper-V 虚拟交换机

相关内容