这个问题与关于将 WSL2 地址设为静态的问题。因为这看起来似乎是不可能的,所以我正在尝试想出一个解决方法。
我想我可以在启动时在 WSL2 中运行一个 shell 脚本,该脚本会将 WSL2 机器的地址写入主机系统上的文件。powershell 脚本将查找该文件,找到后将运行:
netsh interface portproxy add v4tov4 listenport=4000 listenaddress=0.0.0.0 connectport=4000 connectaddress=<WSL2 IP>
如果可能的话,我想消除在 Linux 中运行 shell 脚本的需要。
一种可能性是通过netsh interface ipv4 show neighbors
。172.27.154.150 是我 WSL2 机器的当前 IP 地址,但我真的不确定如何编写脚本来隔离该 IP 地址。
PS C:\Users\Nick> netsh interface ipv4 show neighbors
Interface 1: Loopback Pseudo-Interface 1
Internet Address Physical Address Type
-------------------------------------------- ----------------- -----------
224.0.0.22 Permanent
239.255.255.250 Permanent
Interface 7: Ethernet0
Internet Address Physical Address Type
-------------------------------------------- ----------------- -----------
192.168.163.2 00-50-56-fa-e9-9e Reachable
192.168.163.254 00-50-56-fc-61-94 Reachable
192.168.163.255 ff-ff-ff-ff-ff-ff Permanent
224.0.0.22 01-00-5e-00-00-16 Permanent
224.0.0.251 01-00-5e-00-00-fb Permanent
224.0.0.252 01-00-5e-00-00-fc Permanent
239.255.255.250 01-00-5e-7f-ff-fa Permanent
255.255.255.255 ff-ff-ff-ff-ff-ff Permanent
Interface 19: Bluetooth Network Connection
Internet Address Physical Address Type
-------------------------------------------- ----------------- -----------
224.0.0.22 01-00-5e-00-00-16 Permanent
Interface 14: vEthernet (Default Switch)
Internet Address Physical Address Type
-------------------------------------------- ----------------- -----------
172.21.47.255 ff-ff-ff-ff-ff-ff Permanent
224.0.0.22 01-00-5e-00-00-16 Permanent
224.0.0.251 01-00-5e-00-00-fb Permanent
239.255.255.250 01-00-5e-7f-ff-fa Permanent
255.255.255.255 ff-ff-ff-ff-ff-ff Permanent
Interface 25: vEthernet (WSL)
Internet Address Physical Address Type
-------------------------------------------- ----------------- -----------
172.27.154.150 00-15-5d-f2-6b-94 Stale
172.27.159.255 ff-ff-ff-ff-ff-ff Permanent
224.0.0.22 01-00-5e-00-00-16 Permanent
224.0.0.251 01-00-5e-00-00-fb Permanent
239.255.255.250 01-00-5e-7f-ff-fa Permanent
答案1
从 Windows powershell 或 cmd 使用以下命令:
wsl hostname -I
如果 WSL 正在运行,这应该会返回一个 IP 地址。如果未运行,它似乎会启动默认发行版,然后返回该地址。(返回时间多花几秒钟)
请注意,虽然这应该适用于简单情况,但它可能不适用于您可能在 WSL 中运行的每个发行版。在这种情况下,您应该考虑 Hashbrown 的答案(它涉及更复杂的命令,但可能效果更好)
编辑:从小写更改为大写 -I 选项
答案2
对我来说,我的 WSL 有多个接口,所以hostname
不合适。在这种情况下,你可以使用这个:
wsl -- ip -o -4 -json addr list eth0 `
| ConvertFrom-Json `
| %{ $_.addr_info.local } `
| ?{ $_ }
更改-4
为-6
ipv6,然后更改eth0
为您选择的接口。
另外,如果您需要虚拟机的主机 IP 地址,您可以运行此命令(在主持人)
$wsl = wsl -- ip -o -4 -j addr s eth0 | ConvertFrom-Json | %{ $_.addr_info.local } | ?{ $_ }
$master = (Get-NetIPAddress).IPAddress | ?{ $_ -match ($wsl -replace '^((\d+\.){2}).*$','^$1') }
$wsl,$master #access wsl from master using the first ip, the converse from the latter
答案3
用于检查你的 WSL IP 地址来自 WSL 机器:
ip addr show eth0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}'
答案4
我正在使用此 powershell 脚本“SetDockerHost.ps1”来设置我的本地 DOCKER_HOST 环境变量:
$wslip = ((wsl hostname -I) -split " ")[0]
$dockerhost = "tcp://" + $wslip + ":2375"
setx DOCKER_HOST $dockerhost
Write-Host "Set: setx DOCKER_HOST $dockerhost"
Read-Host -Prompt "Press Enter to exit"