Use cmd.exe no guest com vboxmanage

1

O manual sobre vboxmanage run diz:

run Executes a guest program - forwarding stdout, stderr and stdin to/from the host until it completes.

Eu tenho o windows 7 guest no ubuntu host e tento usar o prompt de comando do shell:

vboxmanage guestcontrol  VmName --username Me run cmd.exe

O programa é executado, a mensagem de boas-vindas é impressa e o $ é substituído por C:\Windows\system32> , no entanto, não parece que qualquer entrada seja passada para o prompt. Você pode pressionar enter, ctrl-m - ele continua adicionando novas linhas como se fosse uma entrada incompleta.

Alguém foi capaz de usar o stdin de host para convidado?

    
por Dimitry 31.05.2017 / 15:57

2 respostas

1

Como David Michael sugeriu, fiz testes. Eu tentei o ubuntu guest no host ubuntu. No convidado, criei um script:

#!/bin/bash
echo write something to stdin
read a
echo you wrote $a 

e eu tentei chamá-lo através do vbox vboxmanage guestcontrol Dawg --username u --password 1qaz run -- /bin/bash -c "cd; ./script" . O primeiro echo funciona, mas o programa trava em read .

Eu acho que o problema não é codificar a incompatibilidade entre as plataformas, uma vez que são as mesmas no teste.

Eu acho que simplesmente não se destina a funcionar dessa forma, ou a questão é mais um relatório de bug para a equipe de desenvolvimento agora.

    
por 13.06.2017 / 22:43
0

Introdução

Esta não é uma solução completa para o seu problema, mas pode ajudar a encontrar a causa disso! Eu tenho um problema semelhante e testei um pouco. Talvez você possa fazer os mesmos testes em sua configuração, para que possamos coletar mais informações sobre o problema.

Sobre

Como eu disse, eu tenho (quase) o mesmo problema que você com uma situação de host / convidado invertida. Meu host é o Windows 10 e meu convidado é o Ubuntu. Eu quero executar um script Python dentro da máquina de convidado para uma comunicação de host / convidado via E / S padrão.

Eu tenho o mesmo comportamento que você. - A saída padrão do script Python é mostrada no host do Windows 10, mas não consigo escrever nada na entrada padrão da máquina convidada.

Por isso, criei um ambiente de teste que emula o comportamento descrito no manual do VirtualBox que você já citou (destacando adicionado por mim mesmo):

run Executes a guest program - forwarding stdout, stderr and stdin to/from the host until it completes. - Source)

Ambiente de Teste

O ambiente de teste consiste nos dois programas a seguir:

  • Controle da VM: no ambiente de teste, o emulador de comportamento da VM é chamado aqui. O controle de VM normalmente chamaria VBoxManage guestcontrol ... run ...
  • VM Behavior Emulator: quando este programa é chamado pelo VM Control, uma linha é gravada na saída padrão. Se o VM Control gravar algo na entrada padrão, o VM Behavior Emulator fará a eco da entrada para a saída padrão.

Controle de VM (criado a partir de partes de MSDN )

using System;
using System.Diagnostics;
using System.IO;

namespace VM_Control
{
  class Program
  {
    private static StreamWriter vmComInput = null;

    static void Main(string[] args)
    {
      // Process instance for executable
      Process vmCom = new Process();

      // Path to executable
      vmCom.StartInfo.FileName = Path.GetFullPath(Path.Combine(Environment.CurrentDirectory,
        @"..\..\..\VM Behaviour Emulator\bin\Debug\VM Behaviour Emulator.exe"));

      // Process configuration
      vmCom.StartInfo.UseShellExecute = false;
      vmCom.StartInfo.CreateNoWindow = true;
      vmCom.StartInfo.RedirectStandardError = true;
      vmCom.StartInfo.RedirectStandardInput = true;
      vmCom.StartInfo.RedirectStandardOutput = true;

      // Setup EventHandler
      vmCom.OutputDataReceived += new DataReceivedEventHandler(VMComOutputHandler);

      // Start the executable in a separate process
      vmCom.Start();

      // Enable OutputDataReceived events
      vmCom.BeginOutputReadLine();
      // Link local StreamWriter instance to processes StandardInput
      vmComInput = vmCom.StandardInput;

      // Wait until the process finished executing
      vmCom.WaitForExit();
    }

    private static void VMComOutputHandler(object sendingProcess,DataReceivedEventArgs line)
    {
      if (!String.IsNullOrEmpty(line.Data))
      {
        // Print received StandardOutput line
        Console.WriteLine(line.Data);

        // Provide some input through the StandardInput StreamWriter
        if (line.Data == "Enter something: ")
          vmComInput.WriteLine("... an input string entered by a StreamWriter instance.");

        // Another input through the StandardInput StreamWriter would close the application
        // at this point
        else if (line.Data == "Press enter to quit the application")
          Debug.WriteLine("Process finished");
      }
    }
  }  
}

Emulador de comportamento da VM

using System;

namespace VM_Behaviour_Emulator
{
  class Program
  {
    static void Main(string[] args)
    {
      string input = "";

      // Prompt user for input
      Console.WriteLine("Enter something: ");
      input = Console.ReadLine();

      // Echo user's input
      Console.WriteLine("You entered: {0}", input);

      // Wait until user quits the application 
      Console.WriteLine("Press enter to quit the application");
      Console.ReadLine();
    }
  }  
}

Conclusão

Enquanto o ambiente de teste funciona como esperado (ele pode transmitir dados para o Emulador de Comportamento de VM por meio da Entrada Padrão), o Controle de VM tem o mesmo comportamento descrito por você ao chamar VBoxManage guestcontrol ... run ... . Simplesmente não reconhece os dados escritos através da entrada padrão. O mesmo comportamento é exibido ao tentar executar VBoxManage guestcontrol ... run ... na linha de comando do host.

Então, como já mencionei, talvez seja possível criar um ambiente de teste semelhante. Talvez possamos obter mais informações sobre o problema.

    
por 05.06.2017 / 15:08