Существует несколько способов запуска команд на размещенной ("гостевой") машине с внешнего "хоста".

Что мне нужно, так это обратное: после включения виртуальной машины мне нужно, скажем, открыть веб-страницу на сервере, работающем внутри ВМ, с браузером, работающим вне ВМ.

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

Так как хозяин запускает гостя, я бы подумал, что он будет снабжен каким-то хуком после запуска. Конечно, хост может знать, когда виртуальная машина была включена, но не может знать, когда она закончила загрузку (хотя, возможно, с добавлением VirtualBox Tool ...?).

Я подумал, что есть способ использовать протокол связи VM для этого, конечно, с необходимой защитой - может быть веская причина для запуска чего-то в виртуальной машине и не выпустить джина из бутылки - но, похоже, это функция недоступна вообще.

Самый близкий, который я смог прийти, - очень окольный путь:

  1. установить WinSSHd (SSH для Windows) на хост-компьютере, так как я не смог запустить удаленное взаимодействие PowerShell с гостевой виртуальной машины Linux
  2. подключить сценарий включения на гостевой машине
  3. создать ключ SSH на гостевой и установить его как доверенный на хосте
  4. выполнить команду SSH (или более одной) от гостя к хосту
  5. прибыль.

Но установка SSH-демона в Windows - это не то, что мне нравится, так что ... есть ли другой способ?

1 ответ1

0

В Virtualbox нет команды «Запустить эту хост-программу», которая может быть выполнена гостем. Но у Virtualbox Guest Additions есть "guestproperties": механизм передачи текстовой строки с низкой пропускной способностью между хостом и гостем, который можно использовать со скриптами для запуска хост-программы, когда гостевой скрипт говорит об этом.

Эта команда запускается на хосте:

"Vboxmanage.exe guestproperty get|set /customnameclass/custompropertyname"

а это у гостя

"Vboxcontrol.exe guestproperty get|set /customnameclass/custompropertyname"

Сценарий хоста может установить значение guestproperty с помощью команды Vboxmanage в «измененное» значение, а затем получить значение guestproperty в цикле, ожидая, пока значение не изменится. Когда значение изменится обратно, скрипт может продолжить выполнение других желаемых команд.

На госте другой сценарий может подождать, пока желаемая служба будет доступна, а затем установить для свойства guest с помощью команды VboxControl значение, ожидаемое сценарием хоста. Сценарий может зацикливаться, продолжая устанавливать гостевое свойство, пока сервис существует, и не устанавливая гостевое свойство, когда сервис выключен. Таким образом, хост может знать, когда услуга гостя присутствует и может использоваться.

/customnameclass и /custompropertyname - это любые имена, которые вы хотите использовать. Несколько каналов связи могут быть установлены с использованием разных имен классов и свойств.

Если вы не хотите или не можете использовать гостевые дополнения, аналогичная концепция может быть использована с файлами флагов в общей папке. Гостевой скрипт создает файл флага (простой текстовый файл с известным именем) в общей папке; хост-скрипт ищет файл флага и запускает нужную программу.

Если у вас есть Windows как для хоста, так и для гостя, вы можете использовать Microsoft Sysinternals "PsExec", который запускает команды между сетевыми ПК Microsoft, не требуя сценария опроса на хост-ПК.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .