如何用Python获取主机IP地址?解决VMware导致的IP识别错误问题
解决VMware环境下获取主机真实IP的方法
我来帮你搞定这个问题!碰到VMware虚拟网卡抢占IP检测的情况太常见了,完全不用卸载VMware,咱们可以从代码逻辑、系统配置两个方向入手,精准拿到主机本身的IP。
一、通过代码逻辑过滤VMware虚拟网卡
核心思路是识别并排除VMware相关的虚拟网卡,只保留物理网卡的IP地址。下面给几个常用场景的实现示例:
Python 实现
可以用netifaces库直接过滤网卡名称,或者通过连接外部服务器的方式获取外网出口IP(更可靠,虚拟网卡一般不会走外网链路):
# 方法1:过滤虚拟网卡名称 import netifaces def get_host_real_ip(): for interface in netifaces.interfaces(): # 过滤VMware虚拟网卡(名称通常带VMware、vEthernet、VMnet关键词) if "VMware" in interface or "vEthernet" in interface or "VMnet" in interface: continue addrs = netifaces.ifaddresses(interface) if netifaces.AF_INET in addrs: for addr_info in addrs[netifaces.AF_INET]: # 排除回环地址 if not addr_info['addr'].startswith('127.'): return addr_info['addr'] return None # 方法2:通过连接外部服务器获取出口IP import socket def get_public_real_ip(): try: # 连接公共DNS服务器,获取当前向外网通信的IP s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.connect(("8.8.8.8", 80)) real_ip = s.getsockname()[0] s.close() return real_ip except Exception as e: print(f"获取失败: {e}") return None
Windows PowerShell 脚本
直接通过网卡名称过滤:
Get-NetIPAddress -AddressFamily IPv4 | Where-Object { $_.InterfaceAlias -notmatch 'VMware|vEthernet|VMnet' -and $_.IPAddress -notlike '127.*' } | Select-Object -ExpandProperty IPAddress
Linux 命令行/脚本
Linux下VMware虚拟网卡通常带vmnet前缀,用ip命令过滤:
ip addr show | grep -v vmnet | grep -v '127.0.0.1' | grep -oP '(?<=inet\s)\d+(\.\d+){3}' | head -n 1
二、调整网卡优先级(Windows系统)
如果不想修改代码,可以通过调整网卡优先级,让物理网卡的优先级高于VMware虚拟网卡:
- 打开「控制面板 > 网络和共享中心 > 更改适配器设置」
- 按Alt键调出菜单栏,选择「高级 > 高级设置」
- 在「适配器和绑定」面板中,把你的物理网卡(比如以太网、Wi-Fi)拖动到所有VMware虚拟网卡的上方
- 确认设置后重启网络,代码默认会优先获取物理网卡的IP
三、临时禁用VMware虚拟网卡
如果只是临时需要获取真实IP,不用卸载VMware,直接禁用虚拟网卡即可:
- Windows:在网络适配器列表中右键VMware相关网卡,选择「禁用」
- Linux:执行
sudo ifdown vmnetX(X为网卡编号,比如vmnet1),需要恢复时执行sudo ifup vmnetX
内容的提问来源于stack exchange,提问作者sooaran
相关产品推荐
相关产品推荐

