WSL 2 安装教程:https://docs.microsoft.com/zh-cn/windows/wsl/wsl2-install
WSL 2 和 WSL 1 一个很大的不同点,WSL 1 是和 Windows 共享 IP 地址,因此可以直接通过主机 IP 地址直接 SSH 登录。
而 WSL 2 则采用了像 VMware 虚拟机一样的 Hyper-V 虚拟网络,本想着直接用 Windows 的端口监听和转发工具netsh interface portproxy add
将 Windows 主机地址代理到 WSL 2 ,然鹅 WSL 2 的一个神坑是,每次重启后的 IP 地址不一样。试过 Hyper-V 虚拟网络设置工具,无效,目测每次 WSL 2 重启都删掉先前的 Hyper-V 虚拟网络重新新建一个。
感谢某个大佬提供的解决思路,将 WSL 2 的 IP 地址写入 Windows 的 hosts 文件,然后设置 Windows 的代理转发到 hostname 即可。
WSL 安装 SSH 服务重新安装 SSH Server:
# 在 WSL 下运行
sudo apt remove openssh-server
sudo apt install openssh-server
如果需要自定义 SSH Server 端口号,编辑 sshd_config 文件
sudo vim /etc/ssh/sshd_config
# 编辑完成后重启 ssh Server
sudo service ssh --full-restart
sshd_config 文件
# 端口号,默认 22
Port 22
# 允许密码 登陆验证
PasswordAuthentication yes
将 WSL 的 IP 地址写入到 Windows hosts 文件
在 PowerShell 运行如下命令:
wsl ip a |wsl grep -w "inet" |wsl cut -d " " -f 6 |wsl cut -d "/" -f 1
# 看输出的 IP 地址,根据你的实际情况取
127.0.0.1
172.25.191.98
新建 ChangeWslHosts.py:
import os
# 获得 ip 地址
ip_cmd = 'wsl ip a |wsl grep -w "inet" |wsl cut -d " " -f 6 |wsl cut -d "/" -f 1'
shells = os.popen(ip_cmd).readlines()
wsl_ip = shells[1].split("\n")[0]
# 写入 Windows hosts 文件
file_path = "C:/Windows/System32/drivers/etc/hosts"
with open(file_path, "r") as f:
lines = f.readlines()
found = False
# 查找 hostname 为 ubuntu 的行
for i, line in enumerate(lines):
if len(line) > 10 and line.find("ubuntu") > -1:
found = True
# 替换为当前的 ip
lines[i] = wsl_ip + " ubuntu"
break
# 没有hostname 为 ubuntu 的行
if not found:
lines.append("\n" + wsl_ip + " ubuntu")
# 写入文件
if lines :
with open(file_path, "w") as f:
f.write("".join(lines))
新建 ChangeWslHosts.bat 的脚本:可以在 Python 中执行这些命令的
Windows 如果安装了 SSH Server 服务,listenport=22
会导致端口冲突,可以更换端口号或者卸载禁用 Windows 的 SSH 服务。
# 获得管理员权限
%1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&exit
# 用 WSL 的 root 重启 WSL 的 ssh 服务,WSL 的 bug
wsl -u root service ssh --full-restart
# 执行 Python 脚本
python D:/Project/Tools/ChangeWslHosts.py
# 解除 192.168.0.10(Windows IP) 的代理监听
netsh interface portproxy delete v4tov4 listenaddress=192.168.0.10 listenport=22
# 将 192.168.0.10(Windows IP) 转发至 ubuntu(wsl IP) 的 22 端口
netsh interface portproxy add v4tov4 listenaddress=192.168.0.10 listenport=22 connectaddress=ubuntu connectport=22
解除 Windows 代理转发的命令是:
# 解除 192.168.0.10(Windows IP) 的代理监听
netsh interface portproxy delete v4tov4 listenaddress=192.168.0.10 listenport=22
运行 Bat 脚本,运行 ssh 登录命令:
# 192.168.0.10 替换为 你的 Windows 本地 IP地址
ssh user@192.168.0.10
如果其他电脑无法访问,在 Windows 防火墙添加允许 22 端口出入站的规则。
TODO:将 BAT 加入 Windows 的自启。好像加 bat 放入下面的文件夹里就可以诶:
C:\Users\username\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
# 或者
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup
TODO 打包成 exe 运行文件