win11 wsl2 固定ip设置

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配置

 step 1
 step2

  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里,可以解决,但我没有这样做,不想让一个功能放在多个地方实现。

后续

写这篇记录时已经发现有了新方案
WSL2 网络的最终解决方案 首发于 hez2010の编程日常

参考

1. Assigning a Static IP Address to a WSL2 Distribution
2. piping command to wsl awk doesn’t work
3. Error: any valid prefix is expected rather than
4. about_Pwsh
5. Win11 WSL2 启用 systemd 及设置静态 / 固定 IP
6. 给 WSL2 设置静态 IP 地址 --用户Lvv的评论

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值