远程连接至另一台 Windows 内的 WSL

结构分析

| PC_A |-------> |PC_B(---->wsl)|

| | 表示一个物理实体。
( ) 表示一个逻辑实体。

wsl 安装 ssh server

1
2
sudo apt-get install openssh-server
sudo systemctl enable --now ssh

此时,可以在本机的 powershell 内进行验证 ssh user@ip
需要注意的是,使用 ssh 登录的 wsl 似乎无法运行 windows 指令(如 wsl.exe --shutdown)。

windows 安装 ssh server

安装服务

在设置中搜索可选功能,安装 ssh server 。或者使用下述命令

1
2
Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0

配置默认 shell

修改 ssh 默认使用的 shell 为 pwsh。(默认为 cmd)

1
New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "$(Get-Command pwsh | % Source)" -PropertyType String -Force

配置开机自启

启动服务并设置为开机自启。

1
2
Start-Service sshd
Set-Service -Name sshd -StartupType Automatic

配置端口

接下来修改配置文件,避免端口冲突。

1
2
3
4
5
6
notepad C:\ProgramData\ssh\sshd_config
# (自行修改端口)
net stop sshd
net start sshd

netstat -an | findstr /i ":2222" # 检查

如果出现错误 System error 1067 has occurred , 应以管理员权限运行。

配置防火墙规则

OpenSSH Server 预定义了一个在端口22上的防火墙规则,但因为我们改动了端口,所以接下来需要配置防火墙规则。

这里有两种方式,一种是修改预定义的规则,一种是添加新的规则。

  1. 修改预定义的规则
    1.1 打开注册表编辑器
    1.2 转到 HKLM\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\FirewallRules
    1.3 搜索 OpenSSH 并修改其端口。

  2. 添加新的规则(未使用)
    2.1 打开控制面板,并访问[控制面板\所有控制面板项\Windows Defender 防火墙]。
    2.2 高级设置,入站规则
    2.3 添加规则

建立连接

使用密码连接

如果使用的是微软在线账户,用户名很可能只取前 5 位,密码为该账户密码。(具体以 user 文件夹内的名字为准)

1
2
ssh -p port win_user@addr					# 登录至 windows
ssh -J win_user@addr:port wsl_user@addr # 登录至 wsl

addr 可以是 ip 或域名(设备名),下述方案均可
ssh -p 2222 reglu@192.168.0.101
ssh -p 2222 reglu@RM-Surface

使用密钥认证

参见[[_posts/日拱一卒/开发随笔/SSH#Windows 中 SSH 的使用]]

GUI 远程连接

Linux 使用 X11 进行图形显示。解决方案如下:

  1. 本地端安装 X11 Server (如 Windows: VcXsrv)。
  2. 远程端安装 X11 Client (对于 Linux 来说,均已内置)。
  3. 配置 “/etc/ssh/sshd_config”。
    • X11Forwarding yes
    • X11DisplayOffset 10
    • X11UseLocalhost yes
  4. 连接时记得使用 ssh -Y
  5. 客户端设置显示地址 (如 export DISPLAY=RM-Laptop:0)。
  6. 好了,现在可以愉快的使用 WSL 桌面了。

在使用 python3 Qt 时,如果出现报错"From 6.5.0, xcb-cursor0 or libxcb-cursor0 is needed to load the Qt xcb platform plugin.", 可通过安装库 libxcb-cursor-dev 来解决(sudo apt-get install -y libxcb-cursor-dev)。

当时对 Linux 了解过于浅薄,现已解决。下为原文。
《《《《《《《《《《 我是分割线 》》》》》》》》》》
建立连接章节中两种方法都无法在 wsl 内使用 code . 指令。(第一种会在远程打开vscode,第二种提示无法找到命令)
错误原因分析:

  1. 第一种情况较为简单,等价于操作远端计算机,因此必然是在远程打开 vscode 。

结构: |PC_B (—>wsl)|

  1. 第二种情况:(猜测)
    2.1 我们使用桥接的方式连接,以 PC_B 为中继连接至 wsl 。
    2.2 当执行命令 code . 时,code 试图打开一个端口,并与 vscode 前端建立连接。
    2.3 但是因为 ssh 桥接的存在,使环境变量出现了异常,使得无法正确调用。(使用 env 指令可以发现明显不同。)
    2.4 尝试使用绝对地址的方式激活指令,成功在远程打开 vscode 。

结构: |PC_A (—>wsl)|

遂放弃,转而使用 vscode 插件(Remote-SSH)。当作一个单纯的远程 Linux 系统使用。

参考文献

https://learn.microsoft.com/zh-cn/windows-server/administration/openssh/openssh_keymanagement