
Ich führe meine Ubuntu-Instanz aus Virtual Box im Hintergrund mit dem folgenden Befehl aus:
VBoxManage startvm ${VM_NAME} --type headless
Der Hauptunterschied zwischen dieser Vorgehensweise und der Ausführung über die GUI besteht darin, dass ich, wenn ich mich nach dem Start in der GUI befinde, ifconfig
die IP-Adresse prüfen kann, sodass ich ssh
von meinem Terminal auf dem Host darauf zugreifen kann. Im Hintergrund ist dies natürlich nicht möglich.
Gibt es unter der Annahme einer dynamischen Zuweisung von IP-Adressen im Netzwerk eine Möglichkeit, die der neu erstellten Instanz zugewiesene IP für SSH-Zwecke zu extrahieren, ODER gibt es eine Möglichkeit, sich per SSH anzumelden, ohne die IP zu kennen (z. B. über einen Backdoor-Port auf dem Host)?
Antwort1
Sie können den Befehl VBoxManage verwenden, um die IP-Adresse zu extrahieren, wie in gezeigtdieser Forumsbeitragauf virtualbox.org:
VBoxManage guestproperty enumerate <vmname>
Sofern Sie dafür keine sehr guten Gründe haben, sollten Sie ernsthaft erwägen, Ihrer Gast-VM eine statische IP-Adresse zuzuweisen. Dies ist möglich, auch wenn Sie wahrscheinlich DHCP verwenden. Wählen Sie einfach eine IP-Adresse außerhalb des von Ihrem DHCP-Server zugewiesenen Bereichs.
Antwort2
Stellen Sie zunächst sicher, dass SieVirtualBox-Erweiterungspaketoder installieren Sie es, wenn nicht.
Zum Beispiel (für 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
oder von
https://www.virtualbox.org/wiki/Downloads
Danach können Sie die IP der VM erhalten
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}'
Antwort3
Sie können es tun, ohne Guest Addition zu installieren
Aber Sie müssen Ihre Netzwerke kennen
, zum Beispiel haben wir VM mit zwei Adaptern
Einer ist für die Internetkommunikation zuständig,
der andere für die Nur-Host-Kommunikation.
Sie können das Netzwerk mit dem Befehl sehenVBoxManage-Liste
NAT-Netzwerk:
% VBoxManage-Liste Natnets Netzwerkname: NatNetwork IP-Adresse: 10.10.12.1 Netzwerk: 10.10.12.0/24 DHCP aktiviert: Ja Aktiviert: Ja
Host-Only-Netzwerk
% VBoxManage-Liste hostonlyifs Bezeichnung: vboxnet0 DHCP: Deaktiviert IP-Adresse: 192.168.6.1 Netzwerkmaske: 255.255.255.240
Hier ist der Hauptteil
der Show laufende VMs
% vboxmanage-Liste runningvms "centos7 node0 ip test" {46ec9075-f49b-4d16-9867-d56710b6a3da}
wir brauchen die VM-UUID,
sie lautet 46ec9075-f49b-4d16-9867-d56710b6a3da
Jetzt können wir MAC-Adressen abrufen
% vboxmanage showvminfo --details 46ec9075-f49b-4d16-9867-d56710b6a3da | fgrep MAC NIC 1: MAC: 08002783E8BB, Anhang: NAT-Netzwerk „NatNetwork“, Kabel angeschlossen: ein, Trace: aus (Datei: keine), Typ: 82540EM, Gemeldete Geschwindigkeit: 0 Mbit/s, Startpriorität: 0, Promisc-Richtlinie: verweigern, Bandbreitengruppe: keine NIC 2: MAC: 080027D992F0, Anhang: Host-only-Schnittstelle „vboxnet0“, Kabel angeschlossen: ein, Trace: aus (Datei: keine), Typ: 82540EM, Gemeldete Geschwindigkeit: 0 Mbit/s, Startpriorität: 0, Promisc-Richtlinie: verweigern, Bandbreitengruppe: keine
08002783E8BB für den ersten Adapter im „NatNetwork“Netzwerk
080027D992F0 für zweiten Adapter für „vboxnet0“Schnittstelle
Jetzt können wir die IP für den ersten Adapter aus der DHCP-Tabelle abrufen
% vboxmanage dhcpserver findlease --network NatNetwork --mac-address=08002783E8BB IP-Adresse: 10.10.12.4 MAC-Adresse: 08:00:27:83:e8:bb Status: bestätigt Herausgegeben: 2020-07-13T13:31:20Z (1594647080) Läuft ab: 2020-07-13T13:41:20Z (1594647680) TTL: 600 Sek., aktuell noch 586 Sek.
und für den zweiten
% vboxmanage dhcpserver findlease --interface vboxnet0 --mac-address=080027D992F0 IP-Adresse: 192.168.6.3 MAC-Adresse: 08:00:27:d9:92:f0 Status: bestätigt Herausgegeben: 2020-07-13T13:29:06Z (1594646946) Läuft ab: 2020-07-13T13:39:06Z (1594647546) TTL: 600 Sek., aktuell noch 399 Sek.
Bitte beachten Sie
, dass wir für NAT-Netzwerke die Option --network verwenden.
Für Host-Only-Adapter verwenden wir die Option --interface.
Jetzt verbinden wir uns vom Host per SSH mit dieser VM
% ssh[email geschützt] [email geschützt]'s Passwort: Letzte Anmeldung: Mo Jul 13 09:05:33 2020 [root@node0 ~]
Antwort4
So mache ich es, sowohl manuell als auch in Ansible. „/Net/0/“ ist die erste Netzwerkschnittstelle, „/Net/1/“ die zweite usw. „/V4/“ ist für IPv4 und „/V6/“ ist für IPv6.
IPv4-Version
VBoxManage guestproperty get <uuid|vmname> "/VirtualBox/GuestInfo/Net/0/V4/IP" | sed -e 's/Value: //g'
IPV6-Version
VBoxManage guestproperty get <uuid|vmname> "/VirtualBox/GuestInfo/Net/0/V6/IP" | sed -e 's/Value: //g'
In ein einfaches Skript umgesetzt:
#!/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
Das Ergebnis ist eine Ausgabe aller laufenden VMs, die ungefähr dieser ähnelt:
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
Hinweis: Erfordert die Installation von Guest Additions.