这手动的关于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
。
我猜测问题不在于平台之间的编码不匹配,因为它们在测试中是相同的。
我猜它根本不打算以这种方式工作,或者这个问题现在更像是开发团队的错误报告。