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的命令
提示
- 通过pwsh传递bash命令,在wsl中执行。最好使用
bash -c "command"
,否则bash的特殊符号和pwsh混合很恶心,比如有的人提到管道符变成^|
。使用上面的方法不用管这么多。 - 即使
bash -c "command"
,$
也不可以直接用,pwsh转义需要使用反引号,这里可能是由于在""里面,需要使用\`对bash命令的内容转义。 - host的网卡要在wsl开启1次后才能初始化,所以配置host网卡也要wsl一下,不想进入命令行,所以我执行了一个无意义的bash命令。
- 配置的
vEthernet (WSL)
可以通过netsh interface ip show addr
查看,NAT不知道怎么看。 - sudo密码写进shell脚本:
man sudo
查看-S
选项:从stdin接受输入。配合管道操作一波。
Terminal配置
- 复制一份原始wsl启动配置项,修改启动命令
pwsh -File <path>
- 选择管理员身份打开
- 保存
注意
- 使用terminal配置进入wsl后,当想再开一个wsl shell时:若wsl未关机,应该命令行直接wsl ~。如果再次使用配置进入,已经运行的wsl会被强杀。这个可以优化脚本来规避,暂时没做
- 如果使用配置进入wsl后,通过wsl --shutdown关闭了wsl,那么再次使用wsl ~开启wsl,eth0将会随机配上172网段地址,但host没有配置相关地址(只保留了192网段),会导致互相无法联通、wsl上不了网。有的方案把对eth0的配置放在.bashrc里,可以解决,但我没有这样做,不想让一个功能放在多个地方实现。