Avviare un'applicazione in Windows dal desktop Ubuntu


12

Vorrei scrivere uno script di shell in Ubuntu che procede come segue:

  1. Avviare un sistema operativo guest Windows 7 in Virtualbox, se non è già in esecuzione.

  2. Esegui uno script di shell in Windows, dove lo script di shell viene richiamato dal sistema operativo host di Ubuntu.

Il mio obiettivo è quello di creare un lanciatore di applicazioni sul desktop host di Ubuntu per un'applicazione sul SO guest. Ad esempio, potrei creare un collegamento per Visual Studio sul desktop Ubuntu che avvia Visual Studio in Windows. Ho sempre voluto essere in grado di avviare le applicazioni Windows direttamente dal desktop Ubuntu invece di attendere l'avvio di Windows prima di fare clic su un collegamento dell'applicazione.

Risposte:


15

Esistono alcune limitazioni da parte dei guest Windows ma per eseguire un'applicazione guest in modalità seamless da uno script che può essere inserito in un launcher abbiamo testato la seguente procedura:

  • Avviare VirtualBox Manager
  • Accedi a Windows con il tuo utente e la tua password
  • Passa alla modalità seamless Host+L
  • In modalità seamless, salva lo stato della macchina

Ora possiamo ottenere il controllo completo della riga di comando sulla macchina virtuale con i seguenti comandi:

  • Avviare la macchina virtuale dallo stato di salvataggio continuo

    VBoxManage startvm "<Name_of_VM>"

    o (per il frontend Qt)

    VirtualBox --startvm "<Name_of_VM>"
  • Esegui un'applicazione nella VM

    VBoxManage --nologo guestcontrol "<Name_of_VM>" run --exe "C:\\full\\path\\to\\program.exe" --username windowsuser --password password --wait-stdout
  • Termina VM in stato di salvataggio

    VBoxManage controlvm "Name_of_VM" savestate

Inseriscili in uno script per goderti le applicazioni Windows senza soluzione di continuità sul desktop di Ubuntu.

Nel caso in cui sia stato impostato un accesso a Windows senza password, questo non funzionerà. Consultare il Manuale della scatola virtuale per le limitazioni e come configurare Windows per farlo funzionare.

Inoltre, per utilizzare gli account senza o con una password vuota, è necessario modificare i criteri di gruppo dell'ospite. Per fare ciò, aprire l'editor dei criteri di gruppo sulla riga di comando digitando gpedit.msc , aprire la chiave Computer Configuration\Windows Settings\Security Settings\Local Policies\Security Optionse modificare il valore Accounts: Limit local account use of blank passwords to console logon onlyin Disabilitato.

Sui sistemi operativi senza l'Editor criteri di gruppo (gpedit.msc), come le edizioni Home di Windows, creando un DWORD nella chiave di registro HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\limitblankpassworduse e l'impostazione su zero otterrà lo stesso effetto, secondo questa risposta .


Ognuno di questi comandi dovrebbe essere eseguito dalla riga di comando di Windows o dalla riga di comando di Ubuntu?
Anderson Green,

Concetto abbastanza carino, anche se per qualche motivo non mi è mai piaciuta molto la modalità seamless, probabilmente perché confonde la navigazione da tastiera. Ma sono tentato di provare un po 'di questo per i miei pochi programmi Windows che uso ancora, come Quicken e iTunes. @AndersonGreen: questo viene eseguito dalla riga di comando di Ubuntu e può essere facilmente inserito in un terminale per il test, quindi trasformato in uno script.
Marty Fried,

La password (inserita nello script) deve essere la password di accesso di Windows o la password di accesso di Ubuntu?
Anderson Green,

È la password di Windows necessaria poiché probabilmente si è connessi a Ubuntu e l'avvio di una macchina virtuale non dovrebbe richiedere l'accesso come root. Nota che hai bisogno di una password di Windows e accedi per farlo funzionare.
Takkat,

Dovrebbe funzionare nella proprietà opposta (eseguendo Windows come sistema operativo principale e Linux come macchina virtuale)
William

3

Questo è più un suggerimento che una risposta, ma è troppo grande per un commento.

Probabilmente dovresti guardare questo . Secondo i documenti, questo comando, viene eseguito dal sistema operativo host (suppongo che un host Ubuntu e un guest Windows):

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

Dovrei aprire regedit in Windows (guest), ma non sono mai stato in grado di farlo funzionare.

Puoi anche usare

VBoxManage showvminfo "Windows XP Pro" | grep State

per verificare se una VM è in esecuzione o meno.


Idee interessanti, e penso che potrebbe essere usato come un altro modo per svolgere il compito. L'ospite potrebbe essere avviato dall'host, quindi quando è in esecuzione, è possibile che il comando possa funzionare per eseguire un comando. Per un programmatore, potrebbe essere un modo più semplice della mia idea; implica l'utilizzo di "sleep" in un ciclo per attendere l'avvio della VM, ma tutto può essere eseguito dall'host, con un singolo script.
Marty Fried,

Ho appena provato il tuo primo comando di esecuzione e sono stato in grado di eseguire Quicken al mio primo tentativo da una VM Windows XP già in esecuzione, denominata "Windows XP" utilizzando questo comando da una riga di comando del terminale Ubuntu:, VBoxManage guestcontrol Windows\ XP exec --image c:\\program\ files\\quicken\\qw.exe --username XXXXX --password XXXXXdove XXXXX era il mio nome utente e password.
Marty Fried,

Forse il mio problema è che uso una password meno account.
Javier Rivera,

Probabilmente ... ho appena cambiato il comando che ho eseguito per utilizzare il tuo formato e in effetti ha eseguito regedit.
Marty Fried,

Takkat ha detto che non funziona in account senza password come il mio. Questo spiega perché non ero mai stato in grado di farlo;).
Javier Rivera,

2

Ho eliminato l'idea originale quando mi sono reso conto che non funzionerà perché Linux non sarà in grado di accedere alla partizione di Windows in una VM se non è già in esecuzione. Potrebbe esserci un modo più complesso per farlo, ma non so se ne valga davvero la pena.

Potrebbe essere possibile avere una directory condivisa comune e uno script in Windows controllerebbe sempre questa directory per vedere se è vuota o meno. In caso contrario, eseguirà gli script nella directory, che verrebbe messa lì dal sistema Ubuntu prima di eseguire la VM.

Potresti avere un secondo script che elimina il primo in modo che non venga eseguito la volta successiva.


Vorrei creare un collegamento per Visual Studio e un collegamento per Internet Explorer che può essere richiamato dal desktop Ubuntu (in modo che vengano eseguiti nella macchina virtuale). Questo può essere fatto usando il metodo che hai descritto?
Anderson Green,

Vorrei sapere se anche l'inverso poteva essere fatto, avviando un'applicazione host (come Kolourpaint) dal sistema operativo guest.
Anderson Green,

Quindi è possibile fare l'inverso usando le aggiunte degli ospiti?
Anderson Green,

Inoltre, ti riferisci alla cartella di avvio di Windows o all'elenco delle applicazioni di avvio di Ubuntu?
Anderson Green,

Spiacente, mi sono reso conto che la mia prima idea era difettosa, perché la cartella di Windows non esiste fino a quando la VM non è in esecuzione. Ho rivisto completamente la mia risposta e spero che non sia troppo confuso.
Marty Fried,

1

Volevo la stessa cosa e ho finito per risolverlo senza usare guestcontrol. Sul mio host MacOS X ho una cartella (denominata Windows) che il mio client vbox che esegue Win7 ha mappato come Z :. Uso i file fittizi per comunicare tra l'host e i miei clienti in questo modo:

Sull'host Mac: - creato uno script di shell completo di un'icona per ogni applicazione Windows che volevo avviare nel client Win. Ciò che fanno sostanzialmente è assicurarsi che VirtualBox non sia stato avviato prima e quindi crea un file "avvia questa particolare applicazione" nella cartella condivisa che Windows può leggere dopo l'avvio. Un esempio di come appare uno script del genere è questo:

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

Quindi sul client Windows ho uno script corrispondente (file BAT) nella cartella Startup che assomiglia a questo:

@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

In questo modo, ogni volta che voglio aggiungere una nuova icona di avvio client sul mio Mac copio lo script della shell, invento un nuovo file fittizio e aggiungo le righe di avvio corrispondenti nello script BAT sul client. Funziona alla grande e penso che sia in linea con l'idea di Martys nel post precedente.


Hai provato questo in un host Ubuntu?
user68186

No, ma sono abbastanza sicuro che funzionerebbe senza problemi. I comandi vbox sono gli stessi e anche bash.
Urban

È più sicuro da usare pgrepinvece dips | grep . Quest'ultimo corre il rischio di adattarsi.
muru,

Sì hai ragione. Credo che sia stato risolto sopra usando ps aggiungendo un grep -v extra per filtrare il problema dell'auto-match. Non sono riuscito a capire come usare pgrep come hai suggerito in questo caso poiché il nome VBox 'Windows 7' nel mio caso è un argomento di commento al processo, come questo: 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-errormsgboxma forse hai un suggerimento su questo?
Urban
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.