介绍

介绍

手动的关于vboxmanage run说:

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

我在 ubuntu 主机中安装了 Windows 7 客户机,并尝试使用 shell 中的命令提示符:

vboxmanage guestcontrol  VmName --username Me run cmd.exe

程序执行,欢迎消息被打印出来,并且 被$替换C:\Windows\system32>,但是似乎没有任何输入被传递给 prompt。您可以按 Enter、ctrl-m - 它只是不断添加换行符,就好像输入不完整一样。

有人能够将标准输入从主机传输到客户机吗?

答案1

介绍

这不是您问题的完整解决方案,但它可能有助于找到问题的原因!我遇到了类似的问题,并进行了一些测试。也许您可以在您的设置中进行相同的测试,以便我们收集有关该问题的更多信息。

关于

正如我所说,我实际上遇到了与您(几乎)相同的问题,只是主机/客户机情况相反。我的主机是 Windows 10,客户机是 Ubuntu。我想在客户机中运行 Python 脚本,通过标准 I/O 进行主机/客户机通信。

我遇到了与您相同的行为。 - Python 脚本的标准输出显示在 Windows 10 主机内,但我无法将任何内容写入客户机的标准输入。

因此,我构建了一个测试环境,模拟您已经引用的 VirtualBox 手册中描述的行为(突出显示由我自己添加):

run 执行来宾程序 - 转发标准输出、stderr 和标准输入 到/从主机直到完成。 -来源

测试环境

测试环境由以下两个程序组成:

  • VM 控制:在测试环境中,此处调用 VM 行为模拟器。VM 控制通常会调用VBoxManage guestcontrol ... run ...
  • VM 行为仿真器:当 VM 控制调用此程序时,一行将写入标准输出。如果 VM 控制随后将某些内容写入标准输入,VM 行为仿真器将把输入回显到标准输出。

VM 控制(由以下部分组成微软

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 ...

所以正如我已经提到的,也许您可​​以构建一个类似的测试环境。也许我们会得到有关该问题的更多信息。

答案2

喜欢大卫·迈克尔建议,我已经进行了测试。我在 ubuntu 主机上尝试了 ubuntu 客户端。在客户端中我创建了一个脚本:

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

我尝试通过 vbox 调用它vboxmanage guestcontrol Dawg --username u --password 1qaz run -- /bin/bash -c "cd; ./script"。第一个echo命令有效,但程序挂起了read

我猜测问题不在于平台之间的编码不匹配,因为它们在测试中是相同的。


我猜它根本不打算以这种方式工作,或者这个问题现在更像是开发团队的错误报告。

相关内容