You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何vmware-cmd对接vCenter需指定目标主机?如何无ESX信息列虚拟机?

vCenter环境下vmware-cmd与PowerCLI查询虚拟机的差异及SSH替代方案

为什么vmware-cmd需要指定ESXi主机,而PowerCLI不用?

咱们先拆解这俩工具的定位和工作逻辑:

  • VMware PowerCLI是专门针对vSphere生态设计的现代化PowerShell模块,核心是直接和vCenter Server通信。vCenter作为整个虚拟化环境的统一管理入口,已经聚合了所有关联ESXi主机的资源信息(包括虚拟机、存储、网络等)。所以当你用正确凭据连接vCenter后,Get-VM命令本质是向vCenter请求全量虚拟机列表,vCenter会直接返回它管理的所有VM,自然不需要你指定具体的ESXi主机。
  • vmware-cmd是个比较老旧的命令行工具,它的设计初衷是直接和单个ESXi主机交互,而非对接vCenter。这个工具没有集成与vCenter通信的能力,无法从vCenter获取整个环境的资源拓扑,所以必须指定具体的ESXi主机地址,才能查询该主机上注册的虚拟机列表。简单说,它是“单机工具”,而PowerCLI是“全局管理工具”。

未知ESXi主机时,不用PowerCLI怎么通过SSH查虚拟机列表?

如果不知道关联的ESXi主机,咱们可以直接通过SSH连接到vCenter Server(这里以VCSA为例,Windows版vCenter也支持开启SSH),用以下几种方法实现:

方法1:使用vSphere REST API(无需额外安装工具)

VCSA默认自带curl,可以直接调用vSphere的REST API来获取虚拟机列表:

  1. 先获取会话认证token:
curl -k -X POST -H "Content-Type: application/json" -d '{"username":"你的vCenter用户名","password":"你的vCenter密码"}' https://你的vCenter地址/rest/com/vmware/cis/session

(-k参数用于忽略自签名证书的验证,如果vCenter用的是可信证书可以去掉)
2. 用返回的value字段作为token,调用VM列表接口:

curl -k -H "vmware-api-session-id: 上面获取的token值" https://你的vCenter地址/rest/vcenter/vm

返回的JSON数据里包含所有虚拟机的名称、ID、状态等信息,你可以用jq(VCSA默认预装)来格式化输出:

curl -k -H "vmware-api-session-id: 你的token" https://你的vCenter地址/rest/vcenter/vm | jq '.value[] | {name: .name, power_state: .power_state}'

方法2:使用govc工具(轻量级vSphere CLI)

govc是VMware官方推出的轻量级命令行工具,VCSA一般预装了这个工具,如果没有的话也可以快速安装:

  1. 先配置vCenter连接参数:
export GOVC_URL='https://你的vCenter地址/sdk'
export GOVC_USERNAME='你的vCenter用户名'
export GOVC_PASSWORD='你的vCenter密码'
export GOVC_INSECURE=true # 忽略自签名证书验证
  1. 直接执行命令列出所有虚拟机:
govc vm.ls

这个命令会返回所有vCenter管理的虚拟机,和PowerCLI的Get-VM效果类似,还可以加参数过滤,比如只看开机的VM:

govc vm.ls -on

方法3:使用Python脚本调用vSphere API

VCSA默认预装了pyVim和pyVmomi模块,可以写个简单的脚本查询:

from pyVim.connect import SmartConnect, Disconnect
import ssl

# 忽略证书验证(自签名证书场景)
ssl_context = ssl._create_unverified_context()

# 连接vCenter
service_instance = SmartConnect(
    host="你的vCenter地址",
    user="你的vCenter用户名",
    pwd="你的vCenter密码",
    sslContext=ssl_context
)

# 获取虚拟机列表
content = service_instance.RetrieveContent()
container = content.viewManager.CreateContainerView(content.rootFolder, [content.vmFolder], True)
virtual_machines = container.view

# 打印虚拟机名称
print("所有虚拟机列表:")
for vm in virtual_machines:
    print(f"- {vm.name}")

# 断开连接
Disconnect(service_instance)

把脚本保存为list_vms.py,然后执行:

python3 list_vms.py

内容的提问来源于stack exchange,提问作者Parag Doke

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:39:25