wsl固定ip配置脚本

记录一次折腾,通过pwsh启动脚本的方式为wsl设置固定ip。
参考了网上的多种方案,组合成一种我喜欢的实现。

软件环境

  • windows11
  • 终端Terminal
  • powershell (microsoft store里下载安装) 用于测试,不确定缺少是否影响
  • wsl的ubuntu 20.04发行版

脚本文件

$WslDistribution = "Ubuntu-20.04"
$Subnet = "192.168.2" # /24
$HostAddress = "$Subnet.1"
$WslAddress = "$Subnet.2"
$BroadcastAddress = "$Subnet.255"
$NatPrefix = "$Subnet.0"

wsl --shutdown
wsl --distribution $WslDistribution /bin/bash -c "echo <passwd> | sudo -S ls /boot > /dev/null"

Get-NetAdapter -IncludeHidden 'vEthernet (WSL)' | Get-NetIPAddress | Remove-NetIPAddress -Confirm:$False;
New-NetIPAddress -InterfaceAlias 'vEthernet (WSL)' -IPAddress $HostAddress -PrefixLength 24;
Get-NetNat | ? Name -Eq WSLNat | Remove-NetNat -Confirm:$False;
New-NetNat -Name WSLNat -InternalIPInterfaceAddressPrefix $NatPrefix/24;
echo "Finished configuring host network"

wsl --distribution $WslDistribution /bin/bash -c "echo <passwd> | sudo -S ip addr del \`$(ip addr show eth0 | grep 'inet\b' | awk '{print \`$2}' | head -n 1) dev eth0"
wsl --distribution $WslDistribution /bin/bash -c "echo <passwd> | sudo -S ip addr add $WslAddress/24 broadcast $BroadcastAddress dev eth0"
wsl --distribution $WslDistribution /bin/bash -c "echo <passwd> | sudo -S ip route add 0.0.0.0/0 via $HostAddress dev eth0"
echo "Finished configuring WSL2 network"

wsl ~
  • 第一段:设置子网ip变量
  • 第二段:重开wsl
  • 第三段:抄的别人的,给windows host 里的wsl网卡改ip
  • 第四段:抄的别人的,给wsl内部的网卡eth0改ip
  • 最后:进入wsl的命令

提示

  1. 通过pwsh传递bash命令,在wsl中执行。最好使用 bash -c "command",否则bash的特殊符号和pwsh混合很恶心,比如有的人提到管道符变成 ^|。使用上面的方法不用管这么多。
  2. 即使 bash -c "command"$也不可以直接用,pwsh转义需要使用反引号,这里可能是由于在""里面,需要使用\`对bash命令的内容转义。
  3. host的网卡要在wsl开启1次后才能初始化,所以配置host网卡也要wsl一下,不想进入命令行,所以我执行了一个无意义的bash命令。
  4. 配置的vEthernet (WSL)可以通过netsh interface ip show addr查看,NAT不知道怎么看。
  5. sudo密码写进shell脚本:man sudo查看-S选项:从stdin接受输入。配合管道操作一波。

Terminal配置

sub vlan_sub vlan


sub vlan_ssh_02

  1. 复制一份原始wsl启动配置项,修改启动命令pwsh -File <path>
  2. 选择管理员身份打开
  3. 保存

注意

  • 使用terminal配置进入wsl后,当想再开一个wsl shell时:若wsl未关机,应该命令行直接wsl ~。如果再次使用配置进入,已经运行的wsl会被强杀。这个可以优化脚本来规避,暂时没做
  • 如果使用配置进入wsl后,通过wsl --shutdown关闭了wsl,那么再次使用wsl ~开启wsl,eth0将会随机配上172网段地址,但host没有配置相关地址(只保留了192网段),会导致互相无法联通、wsl上不了网。有的方案把对eth0的配置放在.bashrc里,可以解决,但我没有这样做,不想让一个功能放在多个地方实现。