Iniciar um aplicativo no Windows a partir da área de trabalho do Ubuntu

12

Eu gostaria de escrever um script de shell no Ubuntu que faça o seguinte:

  1. Inicialize um sistema operacional convidado do Windows 7 no Virtualbox, se já não estiver em execução.

  2. Execute um script de shell no Windows, onde o script de shell é invocado no sistema operacional host do Ubuntu.

Meu objetivo é criar um iniciador de aplicativos na área de trabalho host do Ubuntu para um aplicativo no SO convidado. Por exemplo, eu poderia criar um atalho para o Visual Studio na área de trabalho do Ubuntu que inicia o Visual Studio no Windows. Eu sempre quis iniciar aplicativos do Windows diretamente da área de trabalho do Ubuntu, em vez de esperar a inicialização do Windows antes de clicar no atalho do aplicativo.

Anderson Green
fonte

Respostas:

15

Existem algumas limitações dos convidados do Windows, mas para executar um aplicativo convidado no modo contínuo a partir de um script que pode ser colocado em um iniciador, testamos o seguinte procedimento:

  • Inicie o VirtualBox Manager
  • Entre nas janelas com seu usuário e senha
  • Mudar para o modo contínuo Host+L
  • No modo sem costura, salve o estado da máquina

Agora podemos obter controle total da linha de comando sobre a máquina virtual com os seguintes comandos:

  • Inicie a máquina virtual a partir do estado de salvamento contínuo

    VBoxManage startvm "<Name_of_VM>"

    ou (para o front-end do Qt)

    VirtualBox --startvm "<Name_of_VM>"
  • Execute um aplicativo na VM

    VBoxManage --nologo guestcontrol "<Name_of_VM>" run --exe "C:\\full\\path\\to\\program.exe" --username windowsuser --password password --wait-stdout
  • Encerrar a VM no estado de salvamento

    VBoxManage controlvm "Name_of_VM" savestate

Coloque-os em um script para aproveitar as janelas perfeitas dos aplicativos Windows na área de trabalho do Ubuntu.

Caso você tenha configurado um logon sem senha do Windows, isso não funcionará. Veja no Manual da Caixa Virtual as limitações e como configurar o Windows para fazê-lo funcionar.

Além disso, para usar contas sem ou com uma senha vazia, a política de grupo do convidado deve ser alterada. Para fazer isso, abra o editor de política de grupo na linha de comando, digitando gpedit.msc , abra a chave Computer Configuration\Windows Settings\Security Settings\Local Policies\Security Optionse altere o valor Accounts: Limit local account use of blank passwords to console logon onlypara Desativado.

Em sistemas operacionais sem o Editor de Diretiva de Grupo (gpedit.msc), como as edições Home do Windows, criar um DWORD na chave do Registro HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\limitblankpasswordusee defini-lo como zero obterá o mesmo efeito, de acordo com esta resposta .

Takkat
fonte
Cada um desses comandos deve ser executado na linha de comando do Windows ou na linha de comando do Ubuntu?
Anderson Green
Conceito bastante bom, embora eu nunca tenha gostado do modo sem costura por algum motivo - provavelmente porque fica confuso com a navegação no teclado. Mas estou tentado a tentar isso nos meus poucos programas do Windows que ainda uso, como Quicken e iTunes. @ AndersonGreen: é executado a partir da linha de comando do Ubuntu e pode ser facilmente inserido em um terminal para teste e transformado em um script.
Marty Fried
A senha (inserida no script) deve ser a senha de login do Windows ou a senha de login do Ubuntu?
Anderson Green
É a senha do Windows que você precisa, pois provavelmente está conectado ao Ubuntu, e iniciar uma VM não deve exigir acesso root. Observe que você precisa de uma senha do Windows e faça o login para que isso funcione.
Takkat
Se este trabalho na mansão oposto (com o Windows como sistema operacional principal e linux como máquina virtual)
William
3

Isso é mais uma dica do que uma resposta, mas é grande demais para um comentário.

Você provavelmente deveria olhar para isso . De acordo com a documentação, esse comando é executado no sistema operacional host (suponho que seja um host do Ubuntu e um convidado do Windows):

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

Deve abrir o regedit no Windows (o convidado), mas nunca consegui fazê-lo funcionar.

Você também pode usar

VBoxManage showvminfo "Windows XP Pro" | grep State

para verificar se uma VM está em execução ou não.

Javier Rivera
fonte
Idéias interessantes, e acho que poderiam ser usadas como outra maneira de realizar a tarefa. O convidado pode ser iniciado a partir do host e, quando estiver em execução, provavelmente o comando poderá funcionar para executar um comando. Para um programador, pode ser uma maneira mais fácil do que minha ideia; envolve o uso de "suspensão" em um loop para aguardar a inicialização da VM, mas tudo isso pode ser feito no host, com um único script.
Marty Fried
Acabei de experimentar o seu primeiro comando de execução e consegui executar o Quicken na minha primeira tentativa a partir de uma VM do Windows XP, com o nome "Windows XP", usando este comando em uma linha de comando do terminal Ubuntu: VBoxManage guestcontrol Windows\ XP exec --image c:\\program\ files\\quicken\\qw.exe --username XXXXX --password XXXXXonde XXXXX era meu nome de usuário e senha.
Marty Fried
Talvez o meu problema seja o uso de uma senha menos a conta.
Javier Rivera
Provavelmente ... Acabei de alterar o comando que corri para usar seu formato e ele realmente executou o regedit.
Marty Fried
Takkat disse que não funciona em contas sem senha como a minha. Isso explica por que eu nunca fui capaz de fazer isso;).
Javier Rivera
2

Excluí a idéia original quando percebi que ela não funcionaria porque o Linux não conseguiria acessar a partição do Windows em uma VM se ela ainda não estiver em execução. Pode haver uma maneira mais complexa de fazê-lo, mas não sei se realmente vale a pena.

Pode ser possível ter um diretório compartilhado comum, e um script no Windows sempre verifica esse diretório para ver se está vazio ou não. Caso contrário, ele executaria os scripts no diretório, que seriam colocados pelo sistema Ubuntu antes de executar a VM.

Você pode ter um segundo script que exclui o primeiro, para que não seja executado na próxima vez.

Marty Fried
fonte
Gostaria de criar um atalho para o Visual Studio e um atalho para o Internet Explorer que podem ser chamados na área de trabalho do Ubuntu (para que sejam executados na máquina virtual). Isso pode ser feito usando o método que você descreveu?
Anderson Green
Gostaria de saber se o inverso também pode ser feito - iniciando um aplicativo host (como Kolourpaint) a partir do sistema operacional convidado.
Anderson Green
O inverso poderia ser feito usando acréscimos de convidados, então?
Anderson Green
Além disso, você está se referindo à pasta de inicialização do Windows ou à lista de aplicativos de inicialização do Ubuntu?
Anderson Green
Desculpe, percebi que minha primeira ideia era falha, porque a pasta do Windows não existe até que a VM esteja em execução. Revisei minha resposta completamente e espero que não seja muito confuso.
Marty Fried
1

Eu queria a mesma coisa e acabei resolvendo sem usar o guestcontrol. No meu host do MacOS X, tenho uma pasta (chamada Windows) que meu cliente vbox executando um Win7 mapeou como Z :. Eu uso arquivos fictícios para me comunicar entre o host e meus clientes assim:

No host do Mac: - criei um shell-script completo com um ícone para cada aplicativo do Windows que eu queria iniciar no Win-client. O que eles basicamente fazem é garantir que o VirtualBox não tenha sido iniciado antes e, em seguida, crie um arquivo "iniciar este aplicativo específico" na pasta compartilhada que o Windows pode ler após a inicialização. Exemplo de como esse script se parece é este:

#!/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

Em seguida, no cliente Windows, tenho um script correspondente (arquivo BAT) na pasta Inicialização, semelhante a este:

@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

Dessa forma, sempre que eu quiser adicionar um novo ícone de inicialização do cliente no meu Mac, copio o script de shell, invento um novo arquivo fictício e adiciono as linhas de inicialização correspondentes no script BAT do cliente. Funciona muito bem e acho que está de acordo com a ideia de Martys no post anterior.

Urbano
fonte
Você já testou isso em um host Ubuntu?
user68186
Não, mas tenho certeza de que funcionaria sem falhas. Os comandos vbox são os mesmos e também o bash.
Urbano
É mais seguro usar em pgrepvez de ps | grep. Este último corre o risco de se corresponder.
Muru
Sim, você está certo. Eu acredito que o corrigi acima usando ps adicionando um grep -v extra para filtrar o problema de auto-correspondência. Não consegui descobrir como usar o pgrep, como você sugeriu neste caso, pois o nome da VBox 'Windows 7' no meu caso é um argumento de comentário para o processo, assim: 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-errormsgboxmas talvez você tenha uma sugestão sobre isso?
Urbano