Użyj cmd.exe w gościu z vboxmanage

1

Instrukcja o vboxmanage runmówi:

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

Mam gościa systemu Windows 7 na hoście Ubuntu i próbuję użyć wiersza polecenia z powłoki:

vboxmanage guestcontrol  VmName --username Me run cmd.exe

Program wykonuje się, komunikat powitalny jest drukowany, a komunikat $zastępuje się C:\Windows\system32>, jednak nie wydaje się, aby jakiekolwiek dane wejściowe były przekazywane do monitu. Możesz nacisnąć Enter, ctrl-m - po prostu dodaje nowe wiersze, jakby to było niepełne wprowadzanie.

Czy ktoś był w stanie używać standardowego hosta z gościa?

Dimitry
źródło

Odpowiedzi:

1

Jak sugerował David Michael , przeprowadziłem testy. Próbowałem gościa ubuntu na hoście Ubuntu. W gościu stworzyłem skrypt:

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

i próbowałem to nazwać przez vbox vboxmanage guestcontrol Dawg --username u --password 1qaz run -- /bin/bash -c "cd; ./script". Pierwsze echopolecenia działają, ale program się zawiesił read.

Myślę, że problemem nie jest niezgodność kodowania między platformami, ponieważ są one takie same w teście.


Wydaje mi się, że po prostu nie ma to działać w ten sposób, albo pytanie dotyczy teraz raportu o błędzie dla zespołu programistów.

Dimitry
źródło
0

Wprowadzenie

To nie jest kompletne rozwiązanie twojego problemu, ale może pomóc znaleźć przyczynę! Mam podobny problem i trochę go przetestowałem. Być może możesz wykonać te same testy w ramach konfiguracji, abyśmy mogli zebrać więcej informacji na temat problemu.

O

Jak powiedziałem, faktycznie mam (prawie) taki sam problem jak ty z odwróconą sytuacją hosta / gościa. Mój host to Windows 10, a moim gościem jest Ubuntu. Chcę uruchomić skrypt Pythona na maszynie gościa w celu komunikacji host / gość za pośrednictwem standardowego we / wy.

Doświadczam takiego samego zachowania jak ty. - Standardowe dane wyjściowe skryptu Python są wyświetlane na hoście systemu Windows 10, ale nie jestem w stanie nic zapisać na standardowym wejściu maszyny gościa.

Dlatego zbudowałem środowisko testowe, które emuluje zachowanie opisane w cytowanym już podręczniku VirtualBox (wyróżnienie dodane przeze mnie):

uruchom Wykonuje program gościa - przekazuje stdout , stderr i stdin do / z hosta, dopóki się nie zakończy. - Źródło )

Testowanie środowiska

Środowisko testowe składa się z następujących dwóch programów:

  • Kontrola VM: W środowisku testowym wywoływany jest tutaj emulator zachowań VM. Kontrola VM normalnie by zadzwoniłaVBoxManage guestcontrol ... run ...
  • Emulator zachowań VM: Gdy ten program jest wywoływany przez VM Control, linia jest zapisywana na standardowe wyjście. Jeśli VM Control zapisze następnie coś na standardowym wejściu, emulator zachowań VM wyśle ​​echo danych wejściowych na standardowe wyjście.

Kontrola VM (zbudowany z części 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");
      }
    }
  }  
}

Emulator zachowań 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();
    }
  }  
}

Wniosek

Podczas gdy środowisko testowe działa zgodnie z oczekiwaniami (może przekazywać dane do emulatora zachowań maszyny wirtualnej za pośrednictwem standardowego wejścia) Kontrola maszyn wirtualnych zachowuje się tak samo, jak opisano podczas wywoływania VBoxManage guestcontrol ... run .... Po prostu nie rozpoznaje danych zapisanych za pomocą standardowego wejścia. To samo zachowanie występuje podczas próby uruchomienia VBoxManage guestcontrol ... run ...z wiersza poleceń hosta.

Jak już wspomniałem, możliwe jest zbudowanie podobnego środowiska testowego. Może uzyskamy więcej informacji o problemie.

David Michael Huber
źródło