我使用以下命令在后台从 Virtual Box 运行我的 Ubuntu 实例:
VBoxManage startvm ${VM_NAME} --type headless
这与通过 GUI 运行它之间的主要区别在于,当我在启动后进入 GUI 时,我可以检查ifconfig
IP 地址是什么,以便我可以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。