在 Windows 主机上运行命令,前提是该主机托管的 VirtualBox 客户机已启动

在 Windows 主机上运行命令,前提是该主机托管的 VirtualBox 客户机已启动

有多种方法可以从外部“主机”机器在托管(“客户”)机器上运行命令。

我正在寻找更多相反- 启动虚拟机后,我需要使用在虚拟机外部运行的浏览器打开在虚拟机内部运行的服务器上的网页。

我其实并不是想运行这个命令来自客人- 如果主机完成所有操作,启动虚拟机并运行命令,而客户机却一无所知,那么实际上会更好。

由于是主机启动客户机,我本以为它会提供一些运行后钩子。当然,主机可以知道虚拟机何时启动,但无法知道当它完成启动时(尽管,也许可以使用 VirtualBox Tool 添加……?)。

我认为有一种方法可以利用 VM 通信协议来做到这一点,当然需要采取必要的防御措施 - 在 VM 中运行某些东西而不让精灵从瓶子里出来可能有充分的理由 - 但似乎根本没有这个功能。

我所能想到的最接近的是一种非常迂回的方式:

  1. 在主机上安装 WinSSHd(适用于 Windows 的 SSH),因为我无法获得PowerShell 远程处理从 Linux 客户虚拟机运行
  2. 在客户机上挂接启动脚本
  3. 在客户机上生成 SSH 密钥,并将其安装为主机上的受信任密钥
  4. 从客户机向主机运行一个(或多个) SSH 命令
  5. 利润。

但在 Windows 上安装 SSH 守护程序并不是我真正感到舒服的事情,所以......还有其他方法吗

答案1

Virtualbox 没有可从客户机执行的“运行此主机程序”命令。但 Virtualbox 客户机附加组件具有“guestproperties”:主机和客户机之间的低带宽文本字符串传输机制,可与脚本一起使用,在客户机脚本要求时运行主机程序。

该命令在主机上运行:

"Vboxmanage.exe guestproperty get|set /customnameclass/custompropertyname"

客人方面则表示:

"Vboxcontrol.exe guestproperty get|set /customnameclass/custompropertyname"

主机脚本可以使用 Vboxmanage 命令将 guestproperty 设置为“已更改”值,然后循环获取 guestproperty,等待值更改回来。当值更改回来时,脚本可以继续运行其他所需的命令。

在客户机上,另一个脚本可以等待所需服务可用,然后使用 VboxControl 命令将客户机属性设置为主机脚本正在等待的值。脚本可以循环,在服务存在时继续设置客户机属性,在服务关闭时不设置客户机属性。因此,主机可以知道客户机的服务何时存在且可用。

/customnameclass/custompropertyname是您希望使用的任何名称。可以使用不同的类和属性名称来设置多个通信渠道。

如果您不想或不能使用 Guest Additions,可以在共享文件夹中使用类似的概念和标志文件。Guest 脚本在共享文件夹中创建标志文件(具有已知名称的简单文本文件);主机脚本查找标志文件并运行所需的程序。

如果主机和客户机都使用 Windows,则可以使用 Microsoft Sysinternals 的“PsExec”,它可以在联网的 Microsoft PC 之间运行命令,而无需主机 PC 上的轮询脚本。

相关内容