
Я запускаю свой экземпляр Ubuntu из Virtual Box в фоновом режиме с помощью следующей команды:
VBoxManage startvm ${VM_NAME} --type headless
Главное отличие между этим вариантом и запуском через графический интерфейс заключается в том, что когда я нахожусь в графическом интерфейсе после его запуска, я могу проверить ifconfig
IP-адрес, чтобы иметь возможность 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
Примечание: требуется установка гостевых дополнений.