Mar*_*jan 11 ssh ubuntu windows-subsystem-for-linux
我正在尝试使用 Windows 机器部署分布式系统。然而,我想在这个系统上编译和运行的代码应该在基于Linux的环境中得到编译。因此,我在所有节点上下载并安装了 WSL 和 Ubuntu。现在,我需要从控制器节点通过 SSH 访问工作节点。有什么办法可以做到吗?
Not*_*1ds 10
如果 WSL 实例是 WSL1,则您可以在这些实例上安装 SSH 并直接访问它们。听起来您可能在一台 Windows 主机上有多个 WSL“节点”实例,如果是这种情况,那么您当然应该在其/etc/ssh/sshd_config. 请注意,您仍然需要一种可靠的方法来在这些实例上启动SSH 服务(见下文)。
如果您必须在节点实例上运行 WSL2,那么您需要采取稍微不同的路线,因为您似乎知道(从您对问题的评论),从 LAN 访问它们并不简单,但有多种选择使其发挥作用。
首先,请查看我在另一个类似问题上提供的答案,以便更好地理解该问题。
这听起来不像是您原来问题的一个选项,但我将其包含在此处供其他可能不需要成熟的 ssh 解决方案的人使用:
请注意,这需要非常旧的 WSL 版本或(目前)绝对最新版本 2.0.0 预发行版。
只要可以直接访问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 开发团队提到他们希望恢复能够使用 just wsl,但这目前还行不通。因此,需要使用双引号。外部单引号用于我从中调用的 Bash shell ssh,内部双引号用于由 Windows OpenSSH 调用的 CMD 解释器。
如果出于某种令人震惊的巧合,您使用我在这里的答案来使用不带徽标的 PowerShell 启动 OpenSSH,那么调用将变为:
ssh -t <windowshost> 'C:\Program` Files\WSL\wsl.exe'
Run Code Online (Sandbox Code Playgroud)
就您而言,听起来您的控制器需要自动 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”(在此处插入您的名称或 IP)运行的端口 22 OpenSSH 服务器来访问在其端口 2224 上运行的 WSL 实例。请注意,它localhost始终位于localhost此处,因为端口 2224 是本地端口“windowsthost.local”。
在这种情况下,需要关闭 StrictHostKeyChecking,因为您的 中将有很多“localhost” known_hosts,并且 ssh 在查找密钥时不会考虑跳转主机。
当然,这可以通过以下方式大大简化~/.ssh/config:
Host wsl-ubuntu.windowshost.local
HostName localhost
ProxyCommand ssh -W %h:%p windowshost.local
StrictHostKeyChecking no
Port 2224
Run Code Online (Sandbox Code Playgroud)
然后,您可以直接通过 访问 WSL 会话ssh wsl-ubuntu.windowshost.local。将主机名设置为您想要的任何内容config。
请注意,此跳转主机技术仅适用于需要“真实”SSH 进入 WSL 实例的自动化。如果您只需要远程“访问”WSL 实例的终端,可以使用以下命令快捷方式:
ssh -t windowshost.local wsl或者ssh -t windowshost.local wsl -d Ubuntu20.04
第一个刚刚启动到默认的 WSL 实例。第二个允许您按名称选择特定实例/发行版。如果使用 WSL 2.0.0,请参阅上面的路径和引用规则。
您可以尝试在 Windows 启动时通过 Windows 任务计划程序或其他方式启动 WSL 节点及其 SSH 服务器。但是,如果您使用上面提到的 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,因为当您通过 SSH 连接到 Windows OpenSSH 服务器时,CMD 是默认 shell(尽管可以更改)。
您还可以将 Windowsssh默认 shell 更改为 WSL,这样当您连接到 Windows 上的 OpenSSH 时,它会直接进入 WSL。我不会在此处重复这些步骤,但请参阅这些 Microsoft 说明以及我的有关如何将其扩展到 WSL 的相关问题/答案。
就我个人而言,如果您认为可能使用多个 WSL 实例,我不推荐这种方法。我将默认 shell 更改为 PowerShell Core,这仍然允许我轻松访问 WSL,如上面所述。
在 Windows 中,以管理员身份在 powershell 中将端口从公共 IP 端口转发到 WSL 端口:
netsh 接口 portproxy 添加 v4tov4 监听端口=$EXT_PORT 监听地址=0.0.0.0 连接端口=$WSL_PORT 连接地址=127.0.0.1
要将 SSH 访问转发到 WSL,$EXT_PORT=2222、$WSL_PORT=22 经过上述设置后,从同一 LAN 或 VPN 中的另一台计算机执行以下操作:
ssh 用户@wslhostip -p 2222
这种方法的优点是,除了像在任何 Linux 发行版中一样设置 SSH 服务之外,在 WSL 中不需要进行额外的设置。这也是通过更改转发端口来设置其他网络服务的通用方法。
| 归档时间: |
|
| 查看次数: |
27765 次 |
| 最近记录: |