WSL2中一键重新配置SSH服务,解决WSL2重启ip变化的问题,并解决了vscode远程开发X11报错的问题
引入windows系统开启WSL2能带来很多的方便,这让一台电脑可以同时提供多个服务。常用的场景是在办公室或者家里的台式机电脑开启WSL2服务,通过随身携带的笔记本电脑远程ssh到性能强大的台式机上进行开发工作。而为了实现这个功能,需要对WSL2进行ssh配置。每次重启WSL2,其IP地址都会发生变化,之前配置好的ssh服务没法继续使用,需要重新配置才行。但是每次这样是非常繁琐的,能不能有什么办法
引入
windows系统开启WSL2能带来很多的方便,这让一台电脑可以同时提供多个服务。常用的场景是在办公室或者家里的台式机电脑开启WSL2服务,通过随身携带的笔记本电脑远程ssh到性能强大的台式机上进行开发工作。而为了实现这个功能,需要对WSL2进行ssh配置。
每次重启WSL2,其IP地址都会发生变化,之前配置好的ssh服务没法继续使用,需要重新配置才行。但是每次这样是非常繁琐的,能不能有什么办法可以将这一步骤简化呢?
-
注1:配置WSL2进行SSH远程登陆的方法参考这篇
本文没有讲解如何进行WSL2远程登陆的配置,而是在配置之后如何避免每次重启WSL2或者windows带来的配置丢失问题。 -
注2:配置好WSL2的sshd服务后,可以配置vscode远程服务,进一步改善工作体验。参考这篇,过程很简单,下几个插件就完事了
-
注3:都配置好vscode了,为什么不配置可视化呢?这个也很简单,只需要本地开启x服务(这里推荐xming,设置监听端口 0 即可(默认值,如果要改的话,请确定自己知道怎么改))然后参考这篇在WSL2所在机器上安装remote x11插件即可。注意,不必像上面这篇文章提到的配置那么多选项,没必要。只需要在“注2”中提到的 user/.ssh/config中添加这么几行即可:
Host 名字,注意,不能有特殊字符 HostName 远程主机的ip User WSL2的用户名 Port 远程主机端口转发的port,参考注1中主机监听的端口。注意,不是WSL2的端口 ForwardX11 yes ForwardX11Trusted yes ForwardAgent yes
如果vscode远程X11转发报错:
Failed to get DISPLAY: Error: Timed out while waiting for handshake
这是因为remote x11插件未能正确识别端口号,参考这篇手动设置下面两个选项即可
解决方案
现有的方案都是绑定WSL2的IP,但这些方法存在诸多问题:
- 不能很好的适用于每个人的情况
- 可能存在配置隐患
- 原理负责,通常只能当黑箱使用
本文选择通过绕过WSL2重启更新IP的问题,转而编写脚本实现一键重新配置,脚本内容如下:
# 获取管理员权限
If (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]"Administrator")) {
$arguments = "& '" + $myinvocation.mycommand.definition + "'"
Start-Process powershell -Verb runAs -ArgumentList $arguments
Break
}
$wsl2Name = "ubuntu20-wsl2" # 设置WSL2镜像的名字
$wsl2PORT = 2234 # 设置WSL2中sshd中的端口
$listenPORT = 2224 # 设置windows监听的端口,访问windows该端口将转发给WSL2中的上面那个端口
# 获取WSL2的eth0的IP地址
wsl -d $wsl2Name sudo service ssh --full-restart
$wsl2inet = wsl -d $wsl2Name ifconfig | Select-String -Pattern "inet.*?(?<ip>[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}).*?net"
$wsl2ip = $wsl2inet.Matches[0].Groups.Item("ip").Value
# 设置windows到WSL2的端口转发
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=$listenPORT connectaddress=$wsl2ip connectport=$wsl2PORT
该脚本实现的思路为:
- 获取管理员权限
- 设置配置WSL2的SSH服务所需的相关参数(这一步根据每个人的具体情况改写)
- 启动WSL2,并启动sshd服务
- 获取WSL2的IP
- 重新配置WSL2的SSH服务
将该脚本保存为 .ps1 后缀的文件即可
实现效果
- 鼠标右键使用powershell运行该脚本,
- 赋予管理员权限,
- 等待WSL2启动并重新配置,
- 可以ssh了
更多推荐
所有评论(0)