解决Win10Wsl2IP变化问题(.2.10)
解决 Win10 Wsl2 IP 变化问题(2021.2.10)
目录
- 解决 Win10 Wsl2 IP 变化问题(2021.2.10)
- 1. 产生环境
- 2. 问题描述
- 3. 解决思路
- 4. 实现过程
- 4.1 准备工作
- 4.2 编写脚本
- 4.3 设置自启
- 4.4 测试域名
Win10 Wsl2 的 IP 地址每次重启后都会变化,如果经常需要在 Win10 访问 Wsl2 内的服务的话会比较麻烦,因此笔者寻找一种解决方案并在此记录。
1. 产生环境
- WSL2;
- Ubuntu 20.04 focal(on the Windows Subsystem for Linux);
2. 问题描述
Win10 WSL2 每次重启后 IP 都会发生变化,经常在 Win10 和 WSL2 之间访问网络的话比较麻烦。
3. 解决思路
方法一:固定 IP 地址,每次重启后保持 IP 地址不变;
方法二:每次重启后更新 hosts 文件,通过域名来互相访问;
经过调研,方法一实现起来比较复杂且不优雅,因此笔者选择了采用方法二;目前网络上方法二大多数是通过 go-wsl2-host 项目来实现的,其原理是在 Win10 中添加服务自动更新 hosts 文件,但因为笔者对 Win10 服务的编写不太了解,所以受其启发想到了另一种实现方法:编写 Shell 脚本在 Wsl2 启动时自动更新 Win10 和 Wsl2 的 hosts 文件。
4. 实现过程
4.1 准备工作
由于在 Wsl2 中没有权限操作 Win10 的 hosts 文件,所以我们需要先解决该问题。
方法一:以管理员身份启动 Wsl2;
方法二:为当前 Win10 用户添加修改 hosts 文件的权限;
因为笔者打算将 Shell 脚本设置成随 Wsl2 启动自动执行,方法一每次以管理员身份启动不方便也不安全,所以笔者选择了方法二。
打开
C:WindowsSystem32driversetc
文件夹找到hosts
文件,右键
选择属性
,找到安全
选项卡;点击
编辑
找到当前用户组,为其添加完全控制
权限;点击
确定
,在弹出的提示框中选择是
;此时当前用户应该可以直接修改 hosts 文件了。
4.2 编写脚本
笔者对于 Shell 脚本并不是很了解,因此脚本还有待优化,如果你有更好的方法也欢迎评论留言。
#!/usr/bin/bash# 为 win 设置 wsl host
# win hosts 文件路径
win_hosts_path="/mnt/c/Windows/System32/drivers/etc/hosts"
# 为 wsl2 设置的域名
wsl_domain="ubuntu"
# 获取 wsl2 的 ip
wsl_ip=$(ifconfig eth0 | grep -w inet | awk "{print $2}")
# 判断是否已存在 wsl2 的域名,如果存在则修改,否则追加
if grep -wq "$wsl_domain" $win_hosts_path
then
# 此处因为权限问题没有直接用 sed 修改 hosts 文件
win_hosts=$(sed -s "s/.* $wsl_domain/$wsl_ip $wsl_domain/g" $win_hosts_path)
echo "$win_hosts" > $win_hosts_path
else
echo "$wsl_ip $wsl_domain" >> $win_hosts_path
fi
# 为 wsl 设置 win host
wsl_hosts_path="/etc/hosts"
win_domain="win"
win_ip=$(cat /etc/resolv.conf | grep "nameserver" | awk "{print $2}")
if grep -wq "$win_domain" $wsl_hosts_path
then
wsl_hosts=$(sed -s "s/.* $win_domain/$win_ip $win_domain/g" $wsl_hosts_path)
echo $wsl_hosts > $wsl_hosts_path
else
echo "$win_ip $win_domain" >> $wsl_hosts_path
fi
4.3 设置自启
Linux 下设置脚本自启的方式有很多,此处不再详细赘述,笔者选择的是将脚本内容添加到 Shell 的配置文件中(较为简单)。
4.4 测试域名
重启 Wsl2 后域名应该就可以使用了,此处我们利用 Python 起一个简单的 http 服务进行测试。
在 Wsl2 中启动服务;
$ python -m http.server 8888
Serving HTTP on 0.0.0.0 port 6666 (http://0.0.0.0:8888/) ...
在 Win10 下访问
ubuntu:8888
;
同理我们在 Win10 下启用服务,在 Wsl2 内也可以通过win:port
进行访问(port表示服务端口)。
以上是 解决Win10Wsl2IP变化问题(.2.10) 的全部内容, 来源链接: utcz.com/z/520537.html