我想要在 Ubuntu 中编写一个执行以下操作的 shell 脚本:
如果尚未运行,请在 Virtualbox 中启动 Windows 7 客户操作系统。
在 Windows 中运行 shell 脚本,其中 shell 脚本从 Ubuntu 主机操作系统调用。
我的目标是在 Ubuntu 主机桌面上为客户操作系统上的应用程序创建一个应用程序启动器。例如,我可以在 Ubuntu 桌面上为 Visual Studio 创建一个快捷方式,以在 Windows 中启动 Visual Studio。我一直希望能够直接从 Ubuntu 桌面启动 Windows 应用程序,而不是等待 Windows 启动后再单击应用程序快捷方式。
答案1
Windows 客户机存在一些限制,但为了通过可放入启动器的脚本以无缝模式运行客户机应用程序,我们测试了以下过程:
- 启动VirtualBox管理器
- 使用您的用户和密码登录 Windows
- 切换到无缝模式Host+L
- 在无缝模式下保存机器的状态
现在我们可以使用以下命令获得对虚拟机的完全命令行控制:
从无缝保存状态启动虚拟机
VBoxManage startvm "<Name_of_VM>"
或(对于 Qt 前端)
VirtualBox --startvm "<Name_of_VM>"
在虚拟机中运行应用程序
VBoxManage --nologo guestcontrol "<Name_of_VM>" run --exe "C:\\full\\path\\to\\program.exe" --username windowsuser --password password --wait-stdout
在保存状态下终止虚拟机
VBoxManage controlvm "Name_of_VM" savestate
将这些放入脚本中,即可在 Ubuntu 桌面上享受无缝的 Windows 应用程序窗口。
如果您设置了无密码 Windows 登录,则此方法将不起作用。请参阅Virtual Box 使用手册了解限制以及如何配置 Windows 以使其正常运行。
此外,要使用没有密码或密码为空的帐户,必须更改来宾的组策略。为此,请在命令行中输入以下代码打开组策略编辑器:管理控制台,打开键
Computer Configuration\Windows Settings\Security Settings\Local Policies\Security Options
并将的值更改Accounts: Limit local account use of blank passwords to console logon only
为Disabled。
在没有组策略编辑器 (gpedit.msc) 的操作系统上,例如 Windows 家庭版,在注册表项中创建一个 DWORDHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\limitblankpassworduse
并将其设置为零将达到相同的效果,根据这个答案。
答案2
这更像是一个提示而不是答案,但它太大了,无法发表评论。
你应该看看这根据文档,此命令从主机操作系统运行(我假设是 Ubuntu 主机和 Windows 客户机):
VBoxManage guestcontrol "Windows XP Pro" execute --image "cmd.exe" --username javier --verbose "/c" "regedit.exe"
应该在 Windows(客户机)中打开 regedit,但我从未能够使其工作。
您还可以使用
VBoxManage showvminfo "Windows XP Pro" | grep State
检查虚拟机是否正在运行。
答案3
当我意识到它行不通时,我删除了最初的想法,因为如果虚拟机尚未运行,Linux 将无法访问虚拟机中的 Windows 分区。可能有更复杂的方法可以做到这一点,但我不知道它是否真的值得。
可以有一个公共的共享目录,Windows 中的脚本会始终检查此目录是否为空。如果不是,它将运行目录中的脚本,这些脚本由 Ubuntu 系统在运行 VM 之前放在那里。
您可以编写第二个脚本来删除第一个脚本,这样它下次就不会运行。
答案4
我想要同样的东西,最终在不使用 guestcontrol 的情况下解决了它。在我的 MacOS X 主机上,我有一个名为 Windows 的文件夹,运行 Win7 的 vbox 客户端已将其映射为 Z:。我使用虚拟文件在主机和我的客户端之间进行通信,如下所示:
在 Mac 主机上: - 为我想在 Win 客户端中启动的每个 Windows 应用程序创建一个带有图标的 shell 脚本。它们的作用基本上是确保 VirtualBox 之前没有启动过,然后在共享文件夹中创建一个“启动此特定应用程序”文件,Windows 可以在启动后读取该文件。此类脚本的示例如下:
#!/bin/bash
# bail if vbox is already started/running windoze...
ps ax | grep -v grep | grep 'Windows 7' > /dev/null
if [ $? -eq 0 ]; then
echo "Sorry, Windows is already running."
exit 0
fi
# send a message to Windoze which program to start...
touch /Users/urban/Documents/Windows/START_TS2000I.TXT
# startup Windoze in seamless mode
vboxmanage setextradata 'Windows 7' GUI/Seamless on
vboxmanage startvm 'Windows 7' &
exit 0
然后在 Windows 客户端上,我在启动文件夹中有一个匹配的脚本(BAT 文件),如下所示:
@echo off
pushd "C:\Program Files\Omega Research\Program"
if exist Z:\start_ts2000i.txt start ORTrade.exe
if exist Z:\start_ts2000i.txt del Z:\start_ts2000i.txt
.
.
.
exit 0
这样,每当我想在 Mac 上添加新的客户端启动图标时,我都会复制 shell 脚本,创建一个新的虚拟文件,并在客户端的 BAT 脚本中添加匹配的启动行。效果很好,我认为这与 Martys 在上一篇文章中的想法一致。