Как назначить IP-адрес виртуальной машине, работающей в фоновом режиме?

Как назначить IP-адрес виртуальной машине, работающей в фоновом режиме?

Я запускаю свой экземпляр Ubuntu из Virtual Box в фоновом режиме с помощью следующей команды:

VBoxManage startvm ${VM_NAME} --type headless

Главное отличие между этим вариантом и запуском через графический интерфейс заключается в том, что когда я нахожусь в графическом интерфейсе после его запуска, я могу проверить ifconfigIP-адрес, чтобы иметь возможность sshвойти в него со своего терминала на хосте, и, очевидно, не могу сделать это в фоновом режиме.

Если предположить, что IP-адреса в сети назначаются динамически, есть ли способ извлечь назначенный IP-адрес из вновь созданного экземпляра для использования SSH ИЛИ есть ли способ подключиться к нему по SSH, не зная IP-адреса (например, через бэкдор-порт на хосте)?

решение1

Для извлечения IP-адреса можно использовать команду VBoxManage, как показано на рисунке.этот пост на форумена virtualbox.org:

VBoxManage guestproperty enumerate <vmname>

Однако, если у вас нет очень веских причин, вам следует настоятельно рассмотреть назначение статического IP-адреса вашей гостевой виртуальной машине. Это возможно, даже если вы, вероятно, используете DHCP. Просто выберите IP-адрес за пределами диапазона, который выделяет ваш DHCP-сервер.

решение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

После этого вы можете получить 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

Вы можете сделать это без установки гостевого дополнения.

Но вам нужно знать ваши сети
, например, у нас есть виртуальная машина с двумя адаптерами
два сетевых адаптера

один для интернет-связи,
второй для связи только с хостом

вы можете увидеть сеть с помощью командыСписок VBoxManage

нат сеть:

% VBoxManage список NAT-сетей
ИмяСети: NatNetwork
IP-адрес: 10.10.12.1
Сеть: 10.10.12.0/24
DHCP включен: Да
Включено: Да

только хост-сеть

% VBoxManage список хостов только для хостов
Имя: vboxnet0
DHCP: отключен
IP-адрес: 192.168.6.1
Маска сети: 255.255.255.240

вот основная часть,
показывающая работающие виртуальные машины

% vboxmanage список запущенных vms
"тест IP-адреса centos7 node0" {46ec9075-f49b-4d16-9867-d56710b6a3da}

нам нужен VM uuid
это 46ec9075-f49b-4d16-9867-d56710b6a3da

теперь мы можем получить MAC-адреса

% vboxmanage showvminfo --details 46ec9075-f49b-4d16-9867-d56710b6a3da | fgrep MAC
NIC 1: MAC: 08002783E8BB, Вложение: NAT Network 'NatNetwork', Кабель подключен: вкл., Трассировка: выкл. (файл: нет), Тип: 82540EM, Сообщенная скорость: 0 Мбит/с, Приоритет загрузки: 0, Политика Promisc: отклонить, Группа пропускной способности: нет
NIC 2: MAC: 080027D992F0, Вложение: Интерфейс только для хоста 'vboxnet0', Кабель подключен: включен, Трассировка: выключена (файл: отсутствует), Тип: 82540EM, Сообщенная скорость: 0 Мбит/с, Приоритет загрузки: 0, Политика Promisc: запретить, Группа пропускной способности: отсутствует

08002783E8BB для первого адаптера в «NatNetwork»сеть
080027D992F0 для второго адаптера для 'vboxnet0'интерфейс

теперь мы можем получить IP из таблицы DHCP для первого адаптера

% 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

% сш[email protected]
[email protected]пароль:
Последний вход: Пн Июл 13 09:05:33 2020
[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

Примечание: требуется установка гостевых дополнений.

Связанный контент