修正 wsl2 IP不固定的问题
一、修改win10的hosts文件权限
- 打开C:\Windows\System32\drivers\etc文件夹找到hosts文件,右键选择属性,找到安全选项卡
- 点击编辑找到当前用户组,为其添加完全控制权限;


- 点击确定,在弹出的提示框中选择是;
- 此时当前用户应该可以直接修改 hosts 文件了。
解决方案:
在编写脚本之前做两件事:
- 更换
wsl默认的dash为bash - 安装
net-tools用于获取内部ip
更换 dash
sudo dpkg-reconfigure dash
安装 net-tools
sudo apt install net-tools
解决脚本:
#!/usr/bin/bash# 为 win 设置 wsl host# win hosts 文件路径win_hosts_path="/mnt/c/Windows/System32/drivers/etc/hosts"# 为 wsl2 设置的域名wsl_name="ubuntu.test"# 获取 wsl 的 ipwsl_ip=$(ifconfig eth0 | grep -w inet | awk '{print $2}')# 判断是否已存在 wsl2 的域名,如果存在则修改,否则追加wsl_host=$(cat ${win_hosts_path} | grep -wn ${wsl_name})if [ -n "${wsl_host}" ]then# 找到 wsl2 域名所在的行wsl_host_line=$(echo ${wsl_host} | awk -F: 'NR==1{print $1}')# 此处因为权限问题没有直接用 sed 修改 hosts 文件win_hosts=$(cat ${win_hosts_path} | sed "${wsl_host_line}c ${wsl_ip} ${wsl_name}")#将修改后的文件cat下来,保留格式覆盖原文件echo "${win_hosts}" > ${win_hosts_path}elseecho "${wsl_ip} ${wsl_name}" >> ${win_hosts_path}fi# 以下代码可以会造成: sudo: unable to resolve host ubuntu: Name or service not known 的错误# 为 wsl 设置 win hostwsl_hosts_path="/etc/hosts"win_name="win"win_ip=$(cat /etc/resolv.conf | grep "nameserver" | cut -d " " -f 2)win_host=$(cat ${wsl_hosts_path} | grep -wn ${win_name})if [ -n "${win_host}" ]thenwin_host_line=$(echo ${win_host} | awk -F: 'NR==1{print $1}')wsl_hosts=$(cat ${wsl_hosts_path} | sed "${win_host_line}c ${win_ip} ${win_name}")echo "${wsl_hosts}" > ${wsl_hosts_path}elseecho "${win_ip} ${win_name}" >> ${wsl_hosts_path}fi
在 /etc/init.d 目录创建用于映射 wsl 的脚本,并复制以上代码,保存为以任意域名为开头的 .sh 文件
wsl_name 值必须和 nginx 配置的域名相同
最后创建一个main.sh用于执行并管理所有的自启动脚本,所有脚本放在同一目录:
示例代码:
#!/bin/bash#自启动服务service nginx startservice php8.0-fpm startservice mysql start#需要执行的子脚本source /etc/init.d/ubuntu.shsource /etc/init.d/laravel.sh
给所以自定义的 .sh 文件赋予权限
sudo chmod +x ./main.sh
也可以通过:sudo ./main.sh执行脚本
让它随win10启动
- 快捷键WIN+R打开运行窗口
- 输入
shell:startup - 在这个目录下新建
linux-start.vbs - 内容如下:
Set ws = WScript.CreateObject("WScript.Shell")ws.run "wsl -d Ubuntu-20.04 -u root /etc/init.d/main.sh"
