如何从客户机非交互地将命令传递到正在运行的 QEMU。通过 telnet/SSH 传递 QMP?

如何从客户机非交互地将命令传递到正在运行的 QEMU。通过 telnet/SSH 传递 QMP?

我在 Linux 主机下运行虚拟化 Win8(游戏)平台。我使用 Synergy 共享键盘和鼠标,但偶尔需要传递 USB 设备。GPU 已传递给客户机,我无法从客户机访问 QEMU 监视器。

问题是,如果不关闭客户机,我无法释放上述设备。我想即时传递usb_add host:bus.addr命令,usb_del bus.addr这样我就可以根据需要连接和分离设备。好处在于,我可以让 Synergy 一直运行,并且只在需要时将设备锁定给客户机。我应该补充一点,Synergy 的内置锁定方式lockCursorToScreen(toggle)不够可靠。

我对 QMP 不太熟悉,但我可以使用-qmp tcp:192.168.0.10:4444,server,nowait命令行选项设置 telnet 服务器来托管。我不知道如何在 Windows 下通过 telnet 传递三个命令并退出。

另一个选项是使用 为 QEMU 监视器设置套接字-qmp unix:/path/to/socket,server。然后我想我会通过 SSH 连接到主机以与监视器交互。我也不确定如何实现自动化。从 SSH 命令行在主机上运行 shellscript?

SSH 更安全,但我信任这个私人网络上的机器,所以这不是一个大问题。

TL;DR:我需要一种方法将命令从客户机传递到正在运行的 QEMU。可以使用 Telnet 和套接字(可能通过 SSH 访问),但不知道如何自动化。欢迎提供其他解决方案。

答案1

我解决了这个问题,并将答案发布在这里,以便其他人遇到同样的问题时参考。我的主机是 Linux,客户机是 Windows。

QEMU 启动时-qmp tcp:192.168.0.10:4444,server,nowait启用 telnet 访问监视器。要绑定启动时所需的设备,请添加-device usb-host,productid=12850,id="FancyKeyboard" -device usb-host,productid=64,id="FancyMouse"到命令行。请注意,-device,productid=需要十进制 ID,因此您必须先将获得的十六进制lsusb或类似十六进制转换为十进制。该,id=部分是为了轻松解除绑定,可以是任何唯一的字符串。

为了在运行时从主机绑定它们,我运行了一个名为 _kvm_bind 的脚本

echo '{ "execute": "qmp_capabilities" }'
echo '{ "execute": "device_add", "arguments": { "driver": "usb-host","productid": "12850","id": "FancyKeyboard" }}'
echo '{ "execute": "device_add", "arguments": { "driver": "usb-host","productid": "64","id": "FancyMouse" }}'

并使用以下方式将输出传输到监视器nmap 的 netcat_kvm_bind|ncat 192.168.0.10 4444 我正在从另一个脚本运行它。ncat 很智能,在 EOF 之后自动退出 telnet 会话。

从客户机进行绑定是类似的,我也将 nmap 的命令行数据包安装到客户机。文件 _kvm_bind.bat 如下所示:

@echo off
echo { "execute": "qmp_capabilities" } & echo.
choice /T 1 /D y > nul
echo { "execute": "device_add", "arguments": { "driver": "usb-host","productid": "12850","id": "FancyKeyboard" }} & echo.
choice /T 1 /D y > nul
echo { "execute": "device_add", "arguments": { "driver": "usb-host","productid": "64","id": "FancyMouse" }} & echo.

choice是为了以防万一,在命令之间增加第二个延迟。我不确定& echo.这是否真的有必要,我没有尝试过没有它。它只是在命令之间输出一个空白行。它可能不需要。

管道与Linux版本类似:

@echo off
_kvm_bind.bat|ncat 192.168.0.10 4444

解除绑定与绑定类似,只需将第二行和第三行替换为您之前绑定时提供的device_del参数即可:id

echo '{ "execute": "qmp_capabilities" }'
echo '{ "execute": "device_del", "arguments": { "id":"FancyMouse" }}'
echo '{ "execute": "device_del", "arguments": { "id":"FancyKeyboard" }}'

就像我在问题中说的那样,我运行 Synergy 在客户机和主机之间共享鼠标和键盘,并且它们都有自己的显示器。绑定时我不需要关闭 Synergy,解除绑定后它工作正常。总而言之,我现在对此很满意。

相关内容