有天突发奇想,能不能用 SSH 连上另外一台主机中的 WSL 虚拟机, 然后就搜了下方法. 做个记录
使用端口转发
在 WSL 中安装完成 SSHD 后, 在 windows 执行以下命令进行查询 WSL IP 并进行设置端口转发11
2
3
4
5
6
7
8
9
10
11
12# pwoser shell 下启动 ssh 服务
wsl -u root service ssh start
# 查询 WSL IP
$wslIP = wsl -- hostname -I
# 清理空格
$wslIP = $wslIP.Trim()
# 进行端口转发
netsh interface portproxy add v4tov4 listenport=22 listenaddress=0.0.0.0 connectaddress=$wslIP connectport=22
# 打开22端口的防火墙
New-NetFirewallRule -DisplayName "Open WSL SSH Inbound Port 22" -Direction Inbound -Action Allow -Protocol TCP -LocalPort 22
如果要删除防火墙规则的话, 可以执行
Remove-NetFirewallRule -DisplayName "Open WSL SSH Inbound Port 22" -ErrorAction SilentlyContinue
设置WSL的网络模式为桥接模式2
首先需要创建虚拟桥接交换机, 这步需要有 Hyper-V Manager
将WSL主机关机1
wsl --shutdown
在路径 C:\Users\你的用户名 下创建 .wslconfig 并黏贴下面的内容1
2
3[wsl2]
networkingMode = bridged
vmSwitch = Bridge
启动 WSL, 可以看到已经桥接成功
使用另外一台连接成功
使用 Window 的 OpenSSH Server (最后替换WSL没能成功, 显示没有权限)
首先进入 Setting -> Apps -> Optional features -> view features
进行搜索添加 OpenSHH Server 进行安装
注意 要设置防火墙开放 22 端口
然后就能使用 ssh 进行登录window
然后使用该命令变更默认使用的shell1
2# 添加记录
New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\WINDOWS\System32\bash.exe" -PropertyType String -Force
这样使用ssh连上时, 就进入了默认的WSL
问题
OpenSSH Server 没有运行
使用拥有管理员权限的 PowerShell 运行 net start sshd 进行启动服务
执行 net start sshd 出现错误 1067
因为目录权限问题, 导致的运行问题.
可从OpenSSH Github 仓库 Release下载最新的文件, 对文件夹(我本机地址为: C:\Windows\System32\OpenSSH)的内容进行替换
并使用拥有管理员权限的 PowerShell 运行1
.\FixHostFilePermissions.ps1
进行权限修复
参考地址Error 1067- on start OpenSSH by net start opensshd in windows cmd
想要删除设置的默认 Shell 设置
1 | # 查询设置的值在不在 |
参考
1. Accessing a WSL 2 distribution from your local area network (LAN) ↩
2. bridged networking ↩
VSCode Remote: Connect to WSL2 from another machine
THE EASY WAY how to SSH into Bash and WSL2 on Windows 10 from an external machine