嗯,有几种方法可以做到这一点。不过最简单的还是使用virsh 命令行工具
这是特定于系统的,但在 Redhat 上,您可以安装 libvirt-client 软件包以获取 /usr/bin/virsh。
Here's a SO article showing how to map the MAC address of a guest to their IP 使用 arp 和 grep 的组合。
也有一些方法可以使用libvirt-python 获取这些信息,但它的代码要多得多。 Here's an example of using libvirt to connect to your hypervisor.
编辑:这里有一些真正未经测试的 Python,它应该让你开始,但需要一些修改和玩弄 100% 的工作(可能)
import libvirt # To connect to the hypervisor
import re
import subprocess
# Connect to your local hypervisor. See https://libvirt.org/uri.html
# for different URI's where you'd replace `None` with your
# connection URI (like `qemu://system`)
conn = libvirt.openReadOnly(None) # Open the hypervisor in read-only mode
# conn = libvirt.open(None) # Open the default hypervisor in read-write mode (require
if conn == None:
raise Exception('Failed to open connection to the hypervisor')
try: # getting a list of all domains (by ID) on the host
domains = conn.listDomainsID()
except:
raise Exception('Failed to find any domains')
for domain_id in domains:
# Open that vm
this_vm = conn.lookupById(domain_id)
# Grab the MAC Address from the XML definition
# using a regex, which may appear multiple times in the XML
mac_addresses = re.search(r"<mac address='([A-Z0-9:]+)'", vm.XMLDesc(0)).groups()
for mac_address in mac_addresses:
# Now, use subprocess to lookup that macaddress in the
# ARP tables of the host.
process = subprocess.Popen(['/sbin/arp', '-a'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
process.wait() # Wait for it to finish with the command
for line in process.stdout:
if mac_address in line:
ip_address = re.search(r'(\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3})', line)
print 'VM {0} with MAC Address {1} is using IP {2}'.format(
vm.name(), mac_address, ip_address.groups(0)[0]
)
else:
# Unknown IP Address from the ARP tables! Handle this somehow...