如何通过gcloud或Python googleapiclient获取VM实例MAC地址
非SSH方式获取GCP VM实例MAC地址的实现方案
完全不需要SSH登录到实例内部,直接通过GCP Compute Engine控制面接口就能拿到实例网卡的MAC地址,MAC地址属于实例元数据的内置字段,只要调用身份拥有实例的只读查看权限即可查询,下面分别给出gcloud命令行和googleapiclient的实现方式:
基于gcloud命令行的实现
gcloud本身就是对GCP API的封装,直接通过格式化参数过滤网卡对应的MAC字段即可,不需要和实例建立SSH连接:
- 查询单台指定实例的所有网卡MAC地址:
gcloud compute instances describe <你的实例名称> --zone=<实例所在可用区> --format="value(networkInterfaces[].macAddress)"
- 批量列出当前项目下所有实例的名称、所属可用区、对应MAC地址:
gcloud compute instances list --format="table(name, zone, networkInterfaces[].macAddress)"
基于Python googleapiclient包的实现
本质和gcloud调用的是同一套Compute Engine v1 API,核心是读取接口返回结果中networkInterfaces数组下每个网卡对象的macAddress字段,示例代码如下:
from googleapiclient import discovery from google.oauth2 import service_account # 请替换为你自己的配置信息 AUTH_SCOPES = ["https://www.googleapis.com/auth/compute.readonly"] SA_KEY_PATH = "你的服务账号密钥文件路径.json" GCP_PROJECT_ID = "你的GCP项目ID" TARGET_ZONE = "目标实例所在可用区,例如us-central1-a" TARGET_INSTANCE = "要查询的实例名称" # 初始化认证与API客户端 creds = service_account.Credentials.from_service_account_file( SA_KEY_PATH, scopes=AUTH_SCOPES ) compute_client = discovery.build("compute", "v1", credentials=creds) # 拉取实例元数据 instance_resp = compute_client.instances().get( project=GCP_PROJECT_ID, zone=TARGET_ZONE, instance=TARGET_INSTANCE ).execute() # 提取所有网卡的MAC地址 mac_addresses = [nic["macAddress"] for nic in instance_resp["networkInterfaces"]] print(f"实例{TARGET_INSTANCE}的网卡MAC地址列表:{mac_addresses}")
如果需要批量查询全项目所有实例的MAC,把上述代码中的get方法替换为aggregatedList方法,遍历所有可用区的实例返回结果即可。
注意:通过上述接口拿到的MAC地址是GCP为虚拟网卡分配的固定地址,实例重启、开关机都不会发生变化,和登录实例内部查询到的网卡MAC地址完全一致。
内容的提问来源于stack exchange,提问作者Dima Yagudaev
相关产品推荐
相关产品推荐

