1

Руководство по vboxmanage run гласит:

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

У меня есть Windows 7 гость в хосте Ubuntu и попробуйте использовать командную строку из оболочки:

vboxmanage guestcontrol  VmName --username Me run cmd.exe

Программа запускается, выводится приветственное сообщение, и $ заменяется на C:\Windows\system32> , однако не похоже, что какой-либо ввод передается в приглашение. Вы можете нажать Enter, Ctrl-M - он просто добавляет новые строки, как если бы это был неполный ввод.

Кто-нибудь был в состоянии использовать стандартный ввод от хоста к гостю?

2 ответа2

1

Как предположил Дэвид Майкл , я сделал тесты. Я пробовал гостя Ubuntu на хосте Ubuntu. В гостевой я создал скрипт:

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

и я попытался вызвать его через гостевой контроль vboxmanage guestcontrol Dawg --username u --password 1qaz run -- /bin/bash -c "cd; ./script" . Первые echo команды работают, но программа зависает при read .

Я полагаю, что проблема не в несоответствии кодировки между платформами, так как они одинаковы в тесте.


Я предполагаю, что это просто не предназначено для работы таким образом, или вопрос теперь является скорее отчетом об ошибках для команды разработчиков.

0

Вступление

Это не полное решение вашей проблемы, но может помочь найти причину этого! У меня похожая проблема и немного проверено. Возможно, вы можете выполнить те же тесты в рамках вашей установки, чтобы мы могли собрать больше информации о проблеме.

Около

Как я уже сказал, у меня фактически (почти) та же проблема, что и у вас, только с обратной ситуацией хост / гость. Мой хост - Windows 10, а мой гость - Ubuntu. Я хочу запустить скрипт Python на гостевой машине для связи хост / гость через стандартный ввод / вывод.

Я испытываю то же поведение, что и вы. - Стандартный вывод скрипта Python показан на хосте Windows 10, но я не могу ничего записать на стандартный ввод гостевой машины.

Поэтому я создал тестовую среду, которая имитирует поведение, описанное в руководстве VirtualBox, которое вы уже цитировали (выделение добавлено мной):

запустить Исполняет гостевую программу - экспедиторская стандартный вывод, STDERR и стандартный ввод / от хозяина , пока она не завершится. - Источник)

Среда тестирования

Среда тестирования состоит из следующих двух программ:

  • Управление VM: В среде тестирования здесь вызывается эмулятор поведения VM. VM Control обычно вызывает VBoxManage guestcontrol ... run ...
  • Эмулятор поведения виртуальной машины: когда эта программа вызывается VM Control, в стандартный вывод записывается строка. Если VM Control записывает что-то на стандартный вход, то впоследствии VM Behavior Emulator отобразит вход на стандартный выход.

Управление VM (построен из частей 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");
      }
    }
  }  
}

Эмулятор поведения 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();
    }
  }  
}

Заключение

Хотя среда тестирования работает должным образом (она может передавать данные в эмулятор поведения VM через стандартный ввод), VM Control работает так же, как вы описали при вызове VBoxManage guestcontrol ... run ... Он просто не распознает данные, записанные через стандартный ввод. Такое же поведение проявляется при попытке запустить VBoxManage guestcontrol ... run ... из командной строки хоста.

Поэтому, как я уже упоминал, возможно, вам удастся создать похожую среду тестирования. Может быть, мы получим больше информации о проблеме.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .