如何取得分配給背景運行的虛擬機器的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 即可完成此操作

但您需要了解您的網絡,
例如,我們有一個帶有兩個適配器的虛擬機
兩個網路介面卡

一個用於互聯網通信,
第二個用於僅主機通信

您可以使用指令查看網絡VBox管理列表

NAT網路:

% VBoxManage 列出 natnet
網路名稱:NatNetwork
IP:10.10.12.1
網路:10.10.12.0/24
啟用 DHCP:是
啟用:是

僅主機網路

% VBoxManage 列出主機唯一的ifs
名稱: vboxnet0
DHCP:停用
IP位址:192.168.6.1
網路遮罩:255.255.255.240

這是主要部分
顯示正在運行的虛擬機

% vboxmanage 列出正在運行的虛擬機
「centos7節點0 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,Promisc 原則:拒絕, 頻寬組: 無

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 --interface vboxnet0 --mac-address=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/」是第二個網路接口,依此類推。

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。

相關內容