最近win11自动更新后,发现在wsl中, /etc/resolv.conf里面nameserver变成了 10.255.255.254,不再是windows中 vEthernet (WSL (Hyper-V firewall))的 IP 地址了,这导致我在wsl内无法自动获取windows的ip,怎么办呢,想了个绕弯的解决方案
思路是直接在wsl中调用windows的指令 ipconfig.exe,然后从中提取vEthernet (WSL (Hyper-V firewall))对应的ipv4地址,听起来比较简单,但是由于跨系统,存在一些细节需要考虑
首先windows默认是GBK编码,而ubuntu中是UTF-8,直接运行ipconfig.exe看起来显示正常,实际执行echo "$(ipconfig.exe)"会发现中文全是乱码
��̫�������� vEthernet (WSL (Hyper-V firewall)):
�����ض��� DNS �� . . . . . . . :
�������� IPv6 ��ַ. . . . . . . . : fe80::e9ad:f328:a4a5:58c7%46
IPv4 ��ַ . . . . . . . . . . . . : 172.27.96.1
�������� . . . . . . . . . . . . : 255.255.240.0
Ĭ������. . . . . . . . . . . . . :
这样的乱码调用各种linux指令时会出问题。踩了一些坑后,最终脚本是这样的:
output=$(ipconfig.exe)
output=$(echo "$output" | iconv -f GBK -t UTF-8)
windows_ip=$(echo "$output" | grep -A 4 "vEthernet (WSL (Hyper-V firewall))" | grep "IPv4 地址" | awk '{print $NF}' | tr -d '\r\n')
此时windows_ip就已经提取到windows的虚拟网卡ip地址了。把这段写到.bashrc 或者 .profile就可以在刚进入bash的时候就更新windows_ip了。
脚本解释如下
- 将输出转换为 UTF-8 编码:使用 iconv 工具将 ipconfig.exe 的输出从 GBK 编码转换为 UTF-8
编码,这样可以解决输出中的乱码问题,使得脚本能正确地处理和匹配中文字符。 - 使用 grep 和 awk 提取 IP 地址:通过 grep -A 4 选项获取 “vEthernet (WSL (Hyper-V
firewall))” 这一行及其后的四行,然后再用另一个 grep 查找含有 “IPv4 地址” 的行,最后用 awk
提取该行的最后一个字段(IP 地址)。 - 去除换行符:使用 tr -d ‘\r\n’ 删除结果中可能存在的任何回车或换行符,这对于将输出用作其他命令的参数非常有用,可以防止因格式问题引发错误。