如何获取分配给后台运行的虚拟机的 IP 地址?

如何获取分配给后台运行的虚拟机的 IP 地址?

我使用以下命令在后台从 Virtual Box 运行我的 Ubuntu 实例:

VBoxManage startvm ${VM_NAME} --type headless

这与通过 GUI 运行它之间的主要区别在于,当我在启动后进入 GUI 时,我可以检查ifconfigIP 地址是什么,以便我可以ssh从主机上的终端进入它,显然不能在后台执行此操作。

假设网络上的 IP 地址是动态分配的,是否有办法将分配的 IP 提取到新创建的实例以用于 ssh 目的,或者是否有办法在不知道 IP 的情况下通过 ssh 进入它(例如通过主机上的后门端口)?

答案1

您可以使用 VBoxManage 命令提取 IP 地址,如下所示此论坛帖子在virtualbox.org上:

VBoxManage guestproperty enumerate <vmname>

不过,除非您有非常充分的理由,否则您最好考虑为您的客户虚拟机分配一个静态 IP 地址。即使您可能使用 DHCP,这也是可能的。只需选择一个超出 DHCP 服务器分配范围的 IP 地址即可。

答案2

首先确保你已经安装VirtualBox 扩展包如果没有,请安装。

例如(对于 Ubuntu)

> wget http://download.virtualbox.org/virtualbox/4.2.12/Oracle_VM_VirtualBox_Extension_Pack-4.2.12-84980.vbox-extpack
> sudo VBoxManage extpack install ./Oracle_VM_VirtualBox_Extension_Pack-4.2.12-84980.vbox-extpack

或来自

https://www.virtualbox.org/wiki/Downloads

之后你可以获得VM的IP

VBoxManage guestproperty enumerate <_name_of_VM_> | grep IP | grep -o -w -P -e '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}'

答案3

无需安装 Guest Addition 即可完成

但是你需要了解你的网络
,例如,我们有一个带有两个适配器的虚拟机
两个网络适配器

一个用于 Internet 通信
另一个用于仅主机通信

你可以使用命令查看网络VBox管理列表

nat 网络:

% VBoxManage 列出 natnets
网络名称:NatNetwork
IP:10.10.12.1
网络:10.10.12.0/24
DHCP 已启用:是
已启用:是

仅主机网络

% VBoxManage 列表 hostonlyifs
名称:vboxnet0
DHCP:已禁用
IP地址:192.168.6.1
网络掩码:255.255.255.240


这是显示正在运行的虚拟机的主要部分

%vboxmanage 列表正在运行的虚拟机
“centos7 node0 ip 测试”{46ec9075-f49b-4d16-9867-d56710b6a3da}

我们需要 VM uuid,
它是 46ec9075-f49b-4d16-9867-d56710b6a3da

现在我们可以获取 MAC 地址

%vboxmanage showvminfo--详细信息46ec9075-f49b-4d16-9867-d56710b6a3da|fgrep MAC
NIC 1:MAC:08002783E8BB,附件:NAT 网络“NatNetwork”,电缆连接:开启,跟踪:关闭(文件:无),类型:82540EM,报告速度:0 Mbps,启动优先级:0,Promisc 策略:拒绝,带宽组:无
NIC 2:MAC:080027D992F0,附件:仅主机接口“vboxnet0”,电缆连接:开启,跟踪:关闭(文件:无),类型:82540EM,报告速度:0 Mbps,启动优先级:0,混杂策略:拒绝,带宽组:无

08002783E8BB 为“NatNetwork”中的第一个适配器网络
080027D992F0 为‘vboxnet0’的第二个适配器界面

现在我们可以从 DHCP 表中获取第一个适配器的 IP

%vboxmanage dhcpserver findlease--network NatNetwork--mac-address = 08002783E8BB
IP 地址:10.10.12.4                     
MAC 地址:08:00:27:83:e8:bb
状态:已确认
发布日期:2020-07-13T13:31:20Z (1594647080)
到期时间:2020-07-13T13:41:20Z (1594647680)
TTL:600 秒,目前剩余 586 秒

其次

%vboxmanage dhcpserver findlease--接口vboxnet0--mac地址=080027D992F0
IP地址:192.168.6.3
MAC 地址:08:00:27:d9:92:f0
状态:已确认
发布日期:2020-07-13T13:29:06Z (1594646946)
到期时间:2020-07-13T13:39:06Z (1594647546)
TTL:600 秒,目前剩余 399 秒

请注意,
对于 nat 网络,我们使用选项 --network,
对于仅主机适配器,我们使用选项 --interface

现在我们通过 ssh 从主机连接到该虚拟机

%ssh[电子邮件保护]
[电子邮件保护]的密码:
上次登录:2020 年 7 月 13 日星期一 09:05:33
[root@node0 ~]#

答案4

这是我手动和在 ansible 中执行的操作。“/Net/0/”是第一个网络接口,“/Net/1/”是第二个网络接口,依此类推。“/V4/”用于 IPv4,“/V6/”用于 IPv6。

IPv4 版本

VBoxManage guestproperty get <uuid|vmname> "/VirtualBox/GuestInfo/Net/0/V4/IP" | sed -e 's/Value: //g'

IPV6 版本

VBoxManage guestproperty get <uuid|vmname> "/VirtualBox/GuestInfo/Net/0/V6/IP" | sed -e 's/Value: //g'

放入一个简单的脚本:

#!/bin/sh
for VM in $(VBoxManage list runningvms | awk -F\{ '{print $2}' | sed -e 's/}//g');
do {
  VMNAME="$(VBoxManage showvminfo ${VM} --machinereadable | awk -F\= '/^name/{print $2}')"
  VMIP=$(VBoxManage guestproperty get ${VM} "/VirtualBox/GuestInfo/Net/0/V4/IP" | sed -e 's/Value: //g')
  printf "VM-IP: %-16s VM-Name: %-50s\n" "${VMIP}" "${VMNAME}"
} done

它提供了与所有正在运行的虚拟机类似的输出:

VM-IP: 10.13.172.82     VM-Name: "Ansible Lab VM1 Master"
VM-IP: 10.13.172.84     VM-Name: "Ansible Lab VM2 Slave CentOS"
VM-IP: 10.13.172.83     VM-Name: "Ansible Lab VM3 Slave Win10"
...etc

注意:需要安装 Guest Additions。

相关内容