Executar um comando no host do Windows após o convidado do VirtualBox que ele hospeda ter sido ligado

0

Existem várias maneiras de executar comandos na máquina hospedada ("guest") a partir da máquina "host" externa.

O que eu estou procurando é mais o oposto - depois de ligar a máquina virtual, eu preciso, digamos, abrir uma página da Web no servidor em execução dentro da VM, com o navegador executando fora da VM.

Não é realmente que eu queira executar o comando do guest - seria realmente melhor se o host fizesse isso, ligasse a VM e executasse o comando, com o guest none o mais sábio.

Como é o host que inicia o convidado, eu teria pensado que ele seria fornecido com algum gancho pós-execução. Concedido, o host pode saber quando a VM está ligada, mas não pode saber quando terminar de inicializar (embora, com a adição da ferramenta VirtualBox talvez ...?).

Eu pensei que havia uma maneira de explorar o protocolo de comunicação da VM para fazer isso, é claro, com as defesas necessárias - pode haver uma boa razão para executar algo em uma VM e não deixar o gênio sair da garrafa - mas parece que esse recurso não está disponível.

O mais perto que consegui chegar é uma maneira muito indireta:

  1. instale o WinSSHd (SSH para Windows) na máquina host, pois não consegui obter Remoting do PowerShell para executar a partir da VM convidada do Linux
  2. ligar o script de ativação na máquina convidada
  3. gere uma chave SSH no convidado e instale-a como confiável no host
  4. executa um comando SSH (ou mais de um) do convidado para o host
  5. lucro.

Mas instalar o daemon SSH no Windows não é algo com que eu me sinta confortável, então ... existe outra maneira ?

    
por LSerni 11.09.2016 / 23:38

1 resposta

0

O Virtualbox não possui um comando "executar este programa host" que pode ser executado a partir do convidado. Mas o Virtualbox Guest Additions tem "guestproperties": um mecanismo de transferência de cadeia de texto de baixa largura de banda entre host e guest, que pode ser usado com scripts para executar um programa host quando o script convidado diz.

Este comando é executado no host:

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

e isso no convidado:

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

Um script de host pode definir uma propriedade guest usando o comando Vboxmanage para um valor 'changed' e, em seguida, obter a propriedade guest em um loop, aguardando a alteração do valor. Quando o valor é alterado, o script pode continuar a executar outros comandos desejados.

No convidado, outro script pode aguardar a disponibilização de um serviço desejado e, em seguida, definir a propriedade guest usando o comando VboxControl para o valor que o script do host está aguardando. O script pode fazer loop, continuando a definir a propriedade guest enquanto o serviço existe e não definindo a propriedade guest quando o serviço está desativado. Assim, o anfitrião pode saber quando o serviço do hóspede está presente e utilizável.

/customnameclass e /custompropertyname são nomes que você deseja usar. Vários canais de comunicação podem ser configurados usando diferentes nomes de classes e propriedades.

Se você não quiser ou não puder usar adições de convidado, um conceito semelhante pode ser usado com arquivos de sinalização em uma pasta compartilhada. O script convidado cria o arquivo de sinalizador (um arquivo de texto simples com um nome conhecido) na pasta compartilhada; o script do host procura o arquivo de sinalizador e executa o programa desejado.

Se você tiver o Windows para host e guest, poderá usar o "PsExec" da Microsoft Sysinternals, que executa comandos entre PCs da Microsoft em rede sem exigir um script de pesquisa no PC host.

    
por 08.12.2016 / 21:27