WSL2 linux中如何获取windows虚拟网卡的IP地址

最近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了。

脚本解释如下

  1. 将输出转换为 UTF-8 编码:使用 iconv 工具将 ipconfig.exe 的输出从 GBK 编码转换为 UTF-8
    编码,这样可以解决输出中的乱码问题,使得脚本能正确地处理和匹配中文字符。
  2. 使用 grep 和 awk 提取 IP 地址:通过 grep -A 4 选项获取 “vEthernet (WSL (Hyper-V
    firewall))” 这一行及其后的四行,然后再用另一个 grep 查找含有 “IPv4 地址” 的行,最后用 awk
    提取该行的最后一个字段(IP 地址)。
  3. 去除换行符:使用 tr -d ‘\r\n’ 删除结果中可能存在的任何回车或换行符,这对于将输出用作其他命令的参数非常有用,可以防止因格式问题引发错误。
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值