远程连接至另一台 Windows 内的 WSL
远程连接至另一台 Windows 内的 WSL
结构分析
| PC_A |-------> |PC_B(---->wsl)|
| |表示一个物理实体。
( )表示一个逻辑实体。
wsl 安装 ssh server
1 | sudo apt-get install openssh-server |
此时,可以在本机的 powershell 内进行验证 ssh user@ip 。
需要注意的是,使用 ssh 登录的 wsl 似乎无法运行 windows 指令(如 wsl.exe --shutdown)。
windows 安装 ssh server
安装服务
在设置中搜索可选功能,安装 ssh server 。或者使用下述命令
1 | Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*' |
配置默认 shell
修改 ssh 默认使用的 shell 为 pwsh。(默认为 cmd)
1 | New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "$(Get-Command pwsh | % Source)" -PropertyType String -Force |
配置开机自启
启动服务并设置为开机自启。
1 | Start-Service sshd |
配置端口
接下来修改配置文件,避免端口冲突。
1 | notepad C:\ProgramData\ssh\sshd_config |
如果出现错误 System error 1067 has occurred , 应以管理员权限运行。
配置防火墙规则
OpenSSH Server 预定义了一个在端口22上的防火墙规则,但因为我们改动了端口,所以接下来需要配置防火墙规则。
这里有两种方式,一种是修改预定义的规则,一种是添加新的规则。
-
修改预定义的规则
1.1 打开注册表编辑器
1.2 转到HKLM\SYSTEM\CurrentControlSet\Services\SharedAccess\Parameters\FirewallPolicy\FirewallRules
1.3 搜索 OpenSSH 并修改其端口。 -
添加新的规则(未使用)
2.1 打开控制面板,并访问[控制面板\所有控制面板项\Windows Defender 防火墙]。
2.2 高级设置,入站规则
2.3 添加规则
建立连接
使用密码连接
如果使用的是微软在线账户,用户名很可能只取前 5 位,密码为该账户密码。(具体以 user 文件夹内的名字为准)
1 | ssh -p port win_user@addr # 登录至 windows |
addr 可以是 ip 或域名(设备名),下述方案均可
ssh -p 2222 reglu@192.168.0.101
ssh -p 2222 reglu@RM-Surface
使用密钥认证
参见[[_posts/日拱一卒/开发随笔/SSH#Windows 中 SSH 的使用]]
GUI 远程连接
Linux 使用 X11 进行图形显示。解决方案如下:
- 本地端安装 X11 Server (如 Windows: VcXsrv)。
- 远程端安装 X11 Client (对于 Linux 来说,均已内置)。
- 配置 “/etc/ssh/sshd_config”。
- X11Forwarding yes
- X11DisplayOffset 10
- X11UseLocalhost yes
- 连接时记得使用 ssh -Y
- 客户端设置显示地址 (如 export DISPLAY=RM-Laptop:0)。
- 好了,现在可以愉快的使用 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,第二种提示无法找到命令)
错误原因分析:
- 第一种情况较为简单,等价于操作远端计算机,因此必然是在远程打开 vscode 。
结构: |PC_B (—>wsl)|
- 第二种情况:(猜测)
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
