从Ubuntu桌面在Windows中启动应用程序


12

我想在Ubuntu中编写一个执行以下操作的Shell脚本:

  1. 如果尚未运行Windows 7来宾操作系统,请在Virtualbox中启动它。

  2. 在Windows中运行Shell脚本,其中从Ubuntu主机操作系统调用Shell脚本。

我的目标是在Ubuntu主机桌面上为来宾OS上的应用程序创建应用程序启动器。例如,我可以在Windows上启动Visual Studio的Ubuntu桌面上为Visual Studio创建快捷方式。我一直希望能够直接从Ubuntu桌面启动Windows应用程序,而不是等待Windows启动之后再单击应用程序快捷方式。

Answers:


15

Windows guest虚拟机有一些限制,但是要通过可放入启动器中的脚本以无缝模式运行guest虚拟机应用程序,我们测试了以下过程:

  • 启动VirtualBox Manager
  • 使用您的用户名和密码登录Windows
  • 切换到无缝模式Host+L
  • 在无缝模式下,保存机器状态

现在,我们可以使用以下命令对虚拟机进行全面的命令行控制:

  • 从无缝保存状态启动虚拟机

    VBoxManage startvm "<Name_of_VM>"

    或(对于Qt前端)

    VirtualBox --startvm "<Name_of_VM>"
  • 在VM中运行应用程序

    VBoxManage --nologo guestcontrol "<Name_of_VM>" run --exe "C:\\full\\path\\to\\program.exe" --username windowsuser --password password --wait-stdout
  • 在保存状态下终止VM

    VBoxManage controlvm "Name_of_VM" savestate

将它们放在脚本中可以在Ubuntu桌面上享受无缝的Windows应用程序窗口。

如果您设置了无密码Windows登录,则此操作将无效。有关限制以及如何配置Windows使其运行的信息,请参见“ 虚拟盒子手册 ”。

同样,要使用不带密码或带空密码的帐户,必须更改访客的组策略。为此,请在命令行中键入gpedit.msc来打开组策略编辑器,打开密钥Computer Configuration\Windows Settings\Security Settings\Local Policies\Security Options并将其值更改Accounts: Limit local account use of blank passwords to console logon only为Disabled。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\limitblankpassworduse根据此答案,在没有组策略编辑器(gpedit.msc)的操作系统(例如Windows的Home版本)上,在注册表项处创建DWORD 并将其设置为零将实现相同的效果。


这些命令应该从Windows命令行还是Ubuntu命令行运行?
安德森·格林

这个概念不错,尽管出于某种原因我从未真正喜欢无缝模式-可能是因为它使键盘导航变得混乱。但是我很想尝试一些我仍然使用的Windows程序(例如Quicken和iTunes)来尝试其中的一些方法。@AndersonGreen:这是从Ubuntu命令行运行的,可以很容易地在终端中输入进行测试,然后制成脚本。
马蒂·弗里德

密码(在脚本中输入)应该是Windows登录密码还是Ubuntu登录密码?
安德森·格林

这是您可能需要登录到Ubuntu时所需的Windows密码,并且启动VM不需要root访问权限。请注意,您需要输入Windows密码才能登录。
塔卡特2012年

这是否应该在相反的庄园中运行(将Windows作为主要操作系统,将Linux作为虚拟机)
William

3

这不仅仅是一个提示,而不是一个答案,但是对于评论来说太大了。

您可能应该看看这个。根据文档,此命令从主机OS运行(我假设使用Ubuntu主机和Windows guest):

VBoxManage guestcontrol "Windows XP Pro" execute --image "cmd.exe" --username javier --verbose "/c" "regedit.exe"

应该在Windows(来宾)中打开regedit,但我从未能够使其正常运行。

您也可以使用

VBoxManage showvminfo "Windows XP Pro" | grep State

检查虚拟机是否正在运行。


有趣的想法,我认为它可以用作完成任务的另一种方式。可以从主机启动来宾,然后在其运行时,可以使该命令正常运行以运行命令。对于程序员来说,这可能比我的想法更容易。它涉及在循环中使用“睡眠”以等待VM启动,但是所有操作都可以通过一个脚本在主机上完成。
马蒂·弗里德

我刚刚试用了您的第一个execute命令,并且能够从Ubuntu终端命令行VBoxManage guestcontrol Windows\ XP exec --image c:\\program\ files\\quicken\\qw.exe --username XXXXX --password XXXXX(其中XXXXX是我的用户名和密码)使用已运行的Windows XP VM(名为“ Windows XP”)第一次尝试运行Quicken 。
马蒂·弗里德

也许我的问题是我使用的是少密码的帐户。
哈维尔·里维拉

可能...我刚刚更改了运行的命令以使用您的格式,并且确实运行了regedit。
马蒂·弗里德

塔卡特说过,它不能在像我这样的无密码帐户中使用。这就解释了为什么我从未能够做到;)。
哈维尔·里维拉,2012年

2

当我意识到它不起作用时,我删除了最初的想法,因为如果Linux尚未运行,则Linux将无法访问VM中的Windows分区。可能有更复杂的方法,但是我不知道这是否真的值得。

拥有一个公共的共享目录可能是可行的,Windows中的脚本将始终检查该目录以查看其是否为空。如果没有,它将运行目录中的脚本,该脚本将由Ubuntu系统在运行VM之前放在该目录中。

您可能拥有第二个脚本,该脚本会删除第一个脚本,因此下次不会运行。


我想为Visual Studio创建一个快捷方式,为Internet Explorer创建一个可以从Ubuntu桌面调用的快捷方式(以便它们在虚拟机中运行)。可以使用您描述的方法来完成吗?
安德森·格林

我想知道是否也可以完成相反的操作-从来宾操作系统启动主机应用程序(例如Kolourpaint)。
安德森·格林

那么可以使用来宾加法完成逆运算吗?
安德森·格林

另外,您是指Windows启动文件夹还是Ubuntu启动应用程序列表?
安德森·格林

抱歉,我意识到我的第一个想法存在缺陷,因为在VM运行之前,windows文件夹不存在。我完全修改了答案,希望它不要太混乱。
马蒂·弗里德

1

我想要同样的事情,最终在不使用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想法相符。


您是否已在Ubuntu主机上对此进行了测试?
user68186 2014年

不,但是我很确定它可以正常工作。vbox命令相同,bash也是如此。
2014年

pgrep代替使用更安全ps | grep。后者冒着自我匹配的风险。
muru 2014年

你是对的。我相信可以通过添加一个额外的grep -v来解决上述问题,使用ps可以解决自匹配问题。在这种情况下,我无法弄清楚如何使用pgrep,因为在我的情况下,VBox名称“ Windows 7”是该过程的注释参数,例如: MacMini:~ urban$ ps ax | grep -v grep | grep 'Windows 7' 10874 ?? R 4:38.49 /Applications/VirtualBox.app/Contents/Resources/VirtualBoxVM.app/Contents/MacOS/VirtualBoxVM --comment Windows 7 --startvm 24507412-789d-42ed-9c79-b4faf0c2d130 --no-startvm-errormsgbox但是也许您对此有建议?
2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.