我想在虚拟机上运行命令并在没有 SSH 的情况下获取输出,因为虚拟机将运行一些网络测试,这可能会导致接口关闭,并且 IP 可能并非始终可用。通过 /dev/pts/X 实现此目的的最佳方法是什么?
我可以通过以下方式运行任何命令
echo "some command" > /dev/pts/2 (or /dev/pts/4 with virtio)
并在虚拟机上看到它(使用 virt-manager),但我不知道如何捕获输出,要等待多长时间才能完成命令执行以及它的返回代码...有什么提示吗?
这是我的虚拟机的 XML 摘录:
<serial type='pty'>
<source path='/dev/pts/2'/>
<target type='isa-serial' port='0'>
<model name='isa-serial'/>
</target>
<alias name='serial0'/>
</serial>
<console type='pty' tty='/dev/pts/2'>
<source path='/dev/pts/2'/>
<target type='serial' port='0'/>
<alias name='serial0'/>
</console>
<console type='pty'>
<source path='/dev/pts/4'/>
<target type='virtio' port='1'/>
<alias name='console1'/>
</console>
<channel type='pty'>
<source path='/dev/pts/3'/>
<target type='virtio' name='org.qemu.guest_agent.0' state='connected'/>
<alias name='channel0'/>
<address type='virtio-serial' controller='0' bus='0' port='1'/>
</channel>
答案1
以下方法有很多缺点,可能无法正常工作,不安全:(受本文启发如何在 VirtualBox 中从客户机使用主机串行端口。
要求:
程序:
- 在 Linux VM 中安装 VirtualBox 客户机附加组件。将其关闭。
- 转到 VirtualBox 中的 VM 设置 → 打开“串行端口”部分 → 选中端口 1 中的“启用串行端口”→ 端口号 COM1 → 端口模式 TCP → 取消选中“连接到现有”→ 设置路径/地址任何未分配的 TCP/IP 端口号,例如 1234。
- 启动该 VM。
sudo cat /dev/ttyS0 | sh
在 VM 中运行此命令。此命令在 VM 中打开串行设备,将输出传送到 shell 以运行它。 - 在主机操作系统端,打开 Putty → 在连接类型中选择 RAW 模式 →
localhost
在 VM 设置中输入主机名和以前的端口号,例如 1234。或者运行此命令putty -raw localhost -P 1234
。 - 现在在 putty 窗口中输入任何内容,它将在 VM 的 shell 中执行。
COM 端口和串行设备可以更改,并根据此进行映射VirtualBox 手册。