引入

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插件未能正确识别端口号,参考这篇手动设置下面两个选项即可
    手动设置IP和端口

解决方案

现有的方案都是绑定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

该脚本实现的思路为:

  1. 获取管理员权限
  2. 设置配置WSL2的SSH服务所需的相关参数(这一步根据每个人的具体情况改写)
  3. 启动WSL2,并启动sshd服务
  4. 获取WSL2的IP
  5. 重新配置WSL2的SSH服务

将该脚本保存为 .ps1 后缀的文件即可

实现效果

  1. 鼠标右键使用powershell运行该脚本,
  2. 赋予管理员权限,
  3. 等待WSL2启动并重新配置,
  4. 可以ssh了
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐