我正在尝试通过 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 问题不是防火墙问题,因为nc
和telnet
适用于相同的主机和端口(尝试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 虚拟交换机