Utilizzare cmd.exe nel guest con vboxmanage


1

Il Manuale di vboxmanage run dice:

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

Ho il guest di Windows 7 nell'host di Ubuntu e provo a usare il prompt dei comandi dalla shell:

vboxmanage guestcontrol  VmName --username Me run cmd.exe

Il programma viene eseguito, il messaggio di benvenuto viene stampato e il $ è sostituito da C:\Windows\system32>, tuttavia non sembra che nessuno degli input sia passato al prompt. Puoi premere enter, ctrl-m - continua a aggiungere newline come se fosse un input incompleto.

Qualcuno è stato in grado di utilizzare lo stdin dall'host all'ospite?

Risposte:


1

Piace David Michael suggerito, ho fatto dei test. Ho provato l'ospite di Ubuntu su host di Ubuntu. Nell'ospite ho creato uno script:

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

e ho provato a chiamarlo tramite la vbox vboxmanage guestcontrol Dawg --username u --password 1qaz run -- /bin/bash -c "cd; ./script". Il primo echo i comandi funzionano, ma il programma si blocca read.

Immagino che il problema non sia la codifica della mancata corrispondenza tra le piattaforme poiché sono le stesse nel test.


Immagino che semplicemente non sia destinato a funzionare in questo modo, o che la domanda sia più di una segnalazione di bug per il team di sviluppo ora.


0

introduzione

Questa non è una soluzione completa al tuo problema, ma potrebbe aiutare a scoprirne la causa! Ho un problema simile e ho provato un po '. Forse puoi fare gli stessi test all'interno del tuo setup in modo da poter raccogliere più informazioni sul problema.

Di

Come ho detto, in realtà ho (quasi) lo stesso problema di te solo con una situazione ospite / ospite invertita. Il mio ospite è Windows 10 e il mio ospite è Ubuntu. Voglio eseguire uno script Python all'interno della macchina guest per una comunicazione host / ospite tramite I / O standard.

Ho lo stesso comportamento di te. - L'output standard dello script Python viene mostrato all'interno dell'host di Windows 10, ma non sono in grado di scrivere nulla sullo standard input della macchina guest.

Pertanto ho creato un ambiente di test che emula il comportamento descritto nel manuale VirtualBox che hai già citato (evidenziando aggiunto da me stesso):

run Esegue un programma guest - forwarding stdout , stderr e stdin a da l'host fino al completamento. - fonte )

Ambiente di test

L'ambiente di test è costituito dai seguenti due programmi:

  • Controllo VM: nell'ambiente di test viene chiamato l'emulatore di comportamento VM. Il controllo VM chiamerebbe normalmente VBoxManage guestcontrol ... run ...
  • VM Behavior Emulator: quando questo programma viene chiamato da VM Control, una riga viene scritta nell'output standard. Se VM Control scrive qualcosa sullo standard input, l'emulatore di comportamento VM emette l'eco sullo standard output.

Controllo VM (costruito da parti di 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");
      }
    }
  }  
}

Emulatore di comportamento 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();
    }
  }  
}

Conclusione

Mentre l'ambiente di test funziona come previsto (può passare i dati a VM Behavior Emulator attraverso l'input standard) Controllo VM ha lo stesso comportamento descritto durante la chiamata VBoxManage guestcontrol ... run .... Semplicemente non riconosce i dati scritti attraverso l'input standard. Lo stesso comportamento mostra quando si tenta di eseguire VBoxManage guestcontrol ... run ... dalla riga di comando dell'host.

Quindi, come ho già detto, forse è possibile costruire un ambiente di test simile. Forse avremo maggiori informazioni sul problema.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.