从网络上的另一台计算机通过 SSH 进入 WSL

从网络上的另一台计算机通过 SSH 进入 WSL

我正在尝试使用 Windows 机器部署分布式系统。但是,我想在此系统上编译和运行的代码应该在基于 Linux 的环境中编译。因此,我下载并在所有节点上安装了 WSL 和 Ubuntu。现在,我需要从控制节点通过 SSH 进入工作节点。有什么办法吗?

答案1

SSH 进入 WSL1

如果 WSL 实例是 WSL1,那么您可以在这些实例上安装 SSH 并直接访问它们。听起来你可能在一个 Windows 主机上有多个 WSL“节点”实例,如果是这样的话,那么你当然应该为其中的每个 SSH 服务器设置不同的端口号/etc/ssh/sshd_config。请注意,你仍然需要一种可靠的方法来开始这些实例上的 SSH 服务(见下文)。

SSH 进入 WSL2

如果您必须在节点实例上运行 WSL2,那么您需要走一条稍微不同的路线,因为您似乎知道(从您对问题的评论中),从 LAN 访问它们并不简单,但有多种选择可以使其工作。

首先,查看这个答案我已经在另一个类似的问题上提供了这些信息,只是为了更好地理解这个问题。

对于只需要远程命令行访问 WSL 的用户,这是一个简化的选项

这听起来不像是您原始问题的一个选项,但我在这里将它包含在这里,以供其他可能不需要完整 ssh 解决方案的人使用:

请注意,这需要非常老版本的 WSL 或(此时)绝对最新版本 2.0.0 预发布版。

  • 第一的在 Windows 主机上设置 OpenSSH 服务器

  • 只要你能直接访问Windows主机,你就可以ssh在Windows主机上直接进入PowerShell。

  • 然后,从 CMD ssh 命令行,您只需运行wsl ~即可远程访问您的 WSL 实例。

  • 这甚至可以简化为一行:

    • (旧 WSL 版本):ssh -t <windowshost> "wsl ~"

    • 2.0.0 及更高版本:`ssh -t '"C:\Program Files\WSL\wsl.exe" ~'

      虽然 WSL 开发团队曾提到他们希望恢复仅使用 的功能wsl,但目前还不行。因此,双引号是必需的。外部单引号用于调用 的 Bash shell ssh,内部双引号用于 Windows OpenSSH 调用的 CMD 解释器。

    如果你碰巧使用我的答案在这里使用没有徽标的 PowerShell 启动 OpenSSH,则调用变为:

    ssh -t <windowshost> 'C:\Program` Files\WSL\wsl.exe'
    

完全远程 WSL2 ssh 支持

就您而言,您的控制器似乎需要自动 ssh 访问远程 WSL2 实例。这仍然可以做到,但需要多花点功夫。我在网络上处理这个问题的方式(针对这些节点的 Ansible 配置)是:

  • 与简化选项一样,在 Windows 主机上设置 OpenSSH 服务器。我对“主机” ssh 使用默认端口 22,但您不一定必须这样做。

  • 接下来,为每个 WSL 实例设置 SSH。在这里,我为每个实例使用不同的端口号。

  • 可选但推荐的是,使用你的公钥设置 Windows OpenSSH 和 WSL 实例../ssh/authorized_keys(在 Windows OpenSSH 上,它位于你的%userprofile%/.ssh目录下。在 Linux/WSL 中,当然,它位于 中)~/.ssh

现在,由于每个 Windows 主机都可以访问上的 WSL2 实例localhost,因此您可以使用 Windows SSH 作为 WSL2 SSH 会话的跳转主机。

例如:

ssh -o "ProxyCommand ssh -W %h:%p windowshost.local" -o "StrictHostKeyChecking=no" -p 2224 localhost

这将使用在 Windows 上“windowshost.local”上运行的端口 22 OpenSSH 服务器(在此处插入您的名称或 IP)来访问在其端口 2224 上运行的 WSL 实例。请注意,它将localhost始终localhost在这里,因为端口 2224 是“windowsthost.local”的本地端口。

在这种情况下,需要关闭 StrictHostKeyChecking,因为您的 中将有很多“本地主机” known_hosts,并且 ssh 在查找密钥时不会考虑跳转主机。

当然,这可以大大简化为~/.ssh/config

Host wsl-ubuntu.windowshost.local
HostName localhost
ProxyCommand ssh -W %h:%p windowshost.local
StrictHostKeyChecking no
Port 2224

然后,您可以通过 直接访问 WSL 会话ssh wsl-ubuntu.windowshost.local。在 中随意指定主机名config

请注意,此 jumphost 技术仅适用于需要“真实” SSH 进入 WSL 实例的自动化。如果您只需要远程“访问”WSL 实例的终端,则可以使用以下快捷方式:

ssh -t windowshost.local wsl或者ssh -t windowshost.local wsl -d Ubuntu20.04

第一个只会启动到默认的 WSL 实例。第二个允许您按名称选择特定的实例/分发。如果使用 WSL 2.0.0,请参阅上面的路径和引用规则。

在 WSL 中启动 SSH

你可以尝试在 Windows 启动时启动 WSL 节点及其 SSH 服务器通过 Windows 任务计划程序或其他方式。但是,如果您使用上面提到的 Windows SSH 服务器技术(包括您的 WSL1 主机),那么您可以通过以下方式按需启动它们:

ssh -o "RemoteCommand=wsl -d Ubuntu-20.04 sudo service ssh status ^|^| sudo service ssh start" windowshost_ip_or_name

这将登录 Windows 主机并使用命令wsl按名称访问 WSL 实例,运行命令检查 SSH 是否正在运行,如果没有,则启动服务。请注意,^|^| 是 CMD 的 || 的转义,因为 CMD 是您通过 SSH 进入 Windows OpenSSH 服务器时的默认 shell(尽管这可以更改)。

其他选择

您还可以将 Windowsssh默认 shell 更改为 WSL,这样当您在 Windows 上连接到 OpenSSH 时,它会直接将您带入 WSL。我不会在这里重复这些步骤,但请参阅这些 Microsoft 说明和我的相关问题/答案如何将其扩展到 WSL。

就我个人而言,如果您认为可能会使用多个 WSL 实例,我不建议采用这种方法。我将默认 shell 更改为 PowerShell Core,这样我仍可以轻松访问 WSL,如上所述。

答案2

在 Windows 中,以管理员身份在 powershell 中将端口从公共 IP 端口转发到 WSL 端口,使用以下命令:

netsh 接口 portproxy 添加 v4tov4 listenport=$EXT_PORT listenaddress=0.0.0.0 connectport=$WSL_PORT connectaddress=127.0.0.1

要将 SSH 访问转发到 WSL,$EXT_PORT=2222,$WSL_PORT=22 完成上述设置后,从同一 LAN 或 VPN 中的另一台计算机执行

ssh 用户@wslhostip -p 2222

这种方法的优点是,除了像在任何 Linux 发行版中一样设置 SSH 服务之外,无需在 WSL 中进行额外设置。这也是通过更改转发端口来设置其他网络服务的通用方法。

答案3

我知道距离这篇文章已经有一段时间了,但是这里有一个使用远程隧道扩展的有用答案。 https://stackoverflow.com/a/75389647

目前看来,您需要在 WSL 中手动安装 CLI 才能使其正常工作。下载地址:这里。由于您使用的是 Windows,我建议您下载 x64 CLI。提取文件时tar.gz,您将获得一个名为 code 的文件。我建议将其移动到您的主目录以方便使用。要打开隧道,请运行./code tunnel(从您放置code文件的任何位置)以强制使用新的 CLI。如果您使用code tunnel它,仍将使用 Windows 版本。

来源:https://github.com/microsoft/vscode/issues/171196

相关内容