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.