Uruchom aplikację w systemie Windows z pulpitu Ubuntu

12

Chciałbym napisać skrypt powłoki w Ubuntu, który wykonuje następujące czynności:

  1. Uruchom system gościa Windows 7 w Virtualbox, jeśli jeszcze nie działa.

  2. Uruchom skrypt powłoki w systemie Windows, w którym skrypt powłoki jest wywoływany z systemu operacyjnego hosta Ubuntu.

Moim celem jest utworzenie programu uruchamiającego aplikacje na pulpicie hosta Ubuntu dla aplikacji w systemie-gościu. Na przykład mogę utworzyć skrót do programu Visual Studio na pulpicie Ubuntu, który uruchamia program Visual Studio w systemie Windows. Zawsze chciałem móc uruchamiać aplikacje Windows bezpośrednio z pulpitu Ubuntu, zamiast czekać na uruchomienie systemu Windows przed kliknięciem skrótu do aplikacji.

Anderson Green
źródło

Odpowiedzi:

15

Goście Windows mają pewne ograniczenia, ale aby uruchomić aplikację gościa w trybie płynnym ze skryptu, który można umieścić w programie uruchamiającym, przetestowaliśmy następującą procedurę:

  • Uruchom VirtualBox Manager
  • Zaloguj się do systemu Windows za pomocą użytkownika i hasła
  • Przełącz na tryb płynny Host+L
  • W trybie płynnym zapisz stan maszyny

Teraz możemy uzyskać pełną kontrolę wiersza poleceń nad maszyną wirtualną za pomocą następujących poleceń:

  • Uruchom maszynę wirtualną ze stanu bezproblemowego zapisywania

    VBoxManage startvm "<Name_of_VM>"

    lub (dla nakładki Qt)

    VirtualBox --startvm "<Name_of_VM>"
  • Uruchom aplikację na maszynie wirtualnej

    VBoxManage --nologo guestcontrol "<Name_of_VM>" run --exe "C:\\full\\path\\to\\program.exe" --username windowsuser --password password --wait-stdout
  • Zakończ VM w stanie zapisu

    VBoxManage controlvm "Name_of_VM" savestate

Umieść je w skrypcie, aby cieszyć się płynnymi oknami aplikacji Windows na pulpicie Ubuntu.

W przypadku skonfigurowania logowania systemu Windows bez hasła to nie zadziała. Zobacz w instrukcji Virtual Box ograniczenia i sposób konfiguracji systemu Windows, aby działał.

Ponadto, aby używać kont bez lub z pustym hasłem, zasady grupy gościa muszą zostać zmienione. Aby to zrobić, otwórz edytor zasad grupy w wierszu polecenia, wpisując gpedit.msc , otwórz klucz Computer Configuration\Windows Settings\Security Settings\Local Policies\Security Optionsi zmień wartość Accounts: Limit local account use of blank passwords to console logon onlyna Wyłączone.

W systemach operacyjnych bez Edytora zasad grupy (gpedit.msc), takich jak Domowe wersje systemu Windows, utworzenie DWORD na kluczu rejestru HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\limitblankpasswordusei ustawienie go na zero spowoduje osiągnięcie tego samego efektu, zgodnie z tą odpowiedzią .

Takkat
źródło
Czy każde z tych poleceń powinno być uruchamiane z wiersza poleceń systemu Windows lub wiersza poleceń Ubuntu?
Anderson Green
Całkiem niezła koncepcja, chociaż z jakiegoś powodu tak naprawdę nigdy nie lubiłem trybu bezproblemowego - prawdopodobnie dlatego, że dezorientuje go nawigacja za pomocą klawiatury. Ale mam ochotę wypróbować niektóre z nich w moich kilku programach Windows, których nadal używam, takich jak Quicken i iTunes. @AndersonGreen: jest uruchamiany z wiersza poleceń Ubuntu i można go łatwo wprowadzić w terminalu do testowania, a następnie przekształcić w skrypt.
Marty Fried
Czy hasło (wpisane w skrypcie) powinno być hasłem logowania do systemu Windows, czy hasłem logowania do systemu Ubuntu?
Anderson Green,
Jest to hasło systemu Windows, którego potrzebujesz, ponieważ prawdopodobnie jesteś zalogowany do systemu Ubuntu, a uruchomienie maszyny wirtualnej nie powinno wymagać dostępu do konta root. Pamiętaj, że potrzebujesz hasła do systemu Windows i loginu, aby to działało.
Takkat,
Czy powinno to działać w przeciwnej rezydencji (z systemem Windows jako głównym systemem operacyjnym i Linux jako maszyną wirtualną)
William
3

To raczej podpowiedź niż odpowiedź, ale jest zbyt duża, by komentować.

Powinieneś spojrzeć na to . Zgodnie z dokumentacją to polecenie uruchom z systemu operacyjnego hosta (zakładając, że host Ubuntu i gość Windows):

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

Powinien otworzyć regedit w systemie Windows (gość), ale nigdy nie udało mi się go uruchomić.

Możesz także użyć

VBoxManage showvminfo "Windows XP Pro" | grep State

aby sprawdzić, czy maszyna wirtualna jest uruchomiona, czy nie.

Javier Rivera
źródło
Ciekawe pomysły i myślę, że można to wykorzystać jako kolejny sposób na wykonanie zadania. Gość można uruchomić z hosta, a następnie, gdy jest uruchomiony, prawdopodobnie można by uruchomić polecenie. Dla programisty może to być łatwiejszy sposób niż mój pomysł; wymaga użycia „uśpienia” w pętli w celu oczekiwania na uruchomienie maszyny wirtualnej, ale można to wszystko zrobić z hosta za pomocą jednego skryptu.
Marty Fried
Właśnie wypróbowałem twoje pierwsze polecenie wykonania i mogłem uruchomić Quicken przy mojej pierwszej próbie z już uruchomionej maszyny Wirtualnej z Windows XP, o nazwie „Windows XP”, używając tego polecenia z wiersza poleceń Ubuntu: VBoxManage guestcontrol Windows\ XP exec --image c:\\program\ files\\quicken\\qw.exe --username XXXXX --password XXXXXgdzie XXXXX to moja nazwa użytkownika i hasło.
Marty Fried
Być może moim problemem jest to, że używam konta bez hasła.
Javier Rivera
Prawdopodobnie ... Właśnie zmieniłem polecenie, które uruchomiłem, aby użyć twojego formatu i rzeczywiście uruchomiło się regedit.
Marty Fried
Takkat powiedział, że nie działa na kontach bez hasła, takich jak moje. To wyjaśnia, dlaczego nigdy nie byłem w stanie tego zrobić;).
Javier Rivera
2

Usunąłem oryginalny pomysł, kiedy zdałem sobie sprawę, że nie będzie działać, ponieważ Linux nie będzie mógł uzyskać dostępu do partycji Windows na maszynie wirtualnej, jeśli jeszcze nie działa. Może to być bardziej skomplikowany sposób, ale nie wiem, czy naprawdę warto.

Może być możliwe posiadanie wspólnego katalogu współdzielonego, a skrypt w systemie Windows zawsze sprawdza ten katalog, aby sprawdzić, czy jest pusty, czy nie. Jeśli nie, uruchomiłby skrypty w katalogu, który zostałby tam umieszczony przez system Ubuntu przed uruchomieniem maszyny wirtualnej.

Możesz mieć drugi skrypt, który usuwa pierwszy, więc nie będzie uruchamiany następnym razem.

Marty Fried
źródło
Chciałbym utworzyć skrót do Visual Studio i skrót do Internet Explorera, który można wywołać z pulpitu Ubuntu (aby działały na maszynie wirtualnej). Czy można to zrobić za pomocą opisanej metody?
Anderson Green
Chciałbym wiedzieć, czy można to zrobić odwrotnie - uruchamiając aplikację hosta (taką jak Kolourpaint) z systemu operacyjnego gościa.
Anderson Green
Czy zatem odwrotność mogłaby zostać wykonana przy użyciu dodatków gości?
Anderson Green
Czy odnosisz się również do folderu startowego systemu Windows lub listy aplikacji startowych Ubuntu?
Anderson Green
Niestety, zdałem sobie sprawę, że mój pierwszy pomysł był wadliwy, ponieważ folder systemu Windows nie istnieje, dopóki maszyna wirtualna nie zostanie uruchomiona. Całkowicie poprawiłem swoją odpowiedź i mam nadzieję, że nie jest to zbyt mylące.
Marty Fried
1

Chciałem tego samego i ostatecznie rozwiązałem go bez użycia guestcontrol. Na moim hoście MacOS X mam folder (o nazwie Windows), który mój klient vbox z uruchomionym Win7 zamapował na Z :. Korzystam z plików zastępczych do komunikacji między hostem a moimi klientami w następujący sposób:

Na hoście Mac: - utworzyłem jeden skrypt powłoki wraz z ikoną dla każdej aplikacji Windows, którą chciałem uruchomić w Win-kliencie. Po prostu upewniają się, że VirtualBox nie został wcześniej uruchomiony, a następnie tworzy plik „uruchom tę konkretną aplikację” w folderze współdzielonym, który Windows może odczytać po uruchomieniu. Przykładem takiego skryptu jest:

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

Następnie na kliencie Windows mam odpowiedni skrypt (plik BAT) w folderze Autostart, który wygląda następująco:

@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

W ten sposób, za każdym razem, gdy chcę dodać nową ikonę uruchamiania klienta na komputerze Mac, kopiuję skrypt powłoki, wymyślam nowy plik zastępczy i dodaje pasujące wiersze uruchamiania w skrypcie BAT na kliencie. Działa świetnie i myślę, że jest to zgodne z pomysłem Martys z poprzedniego postu.

Miejski
źródło
Czy przetestowałeś to na hoście Ubuntu?
user68186,
Nie, ale jestem prawie pewien, że zadziałałoby bez usterki. Polecenia vbox są takie same, podobnie jak bash.
Urban
Jest bezpieczniejszy w użyciu pgrepzamiast ps | grep. To ostatnie wiąże się z ryzykiem, że się dopasuje.
muru
Tak, masz rację. Wydaje mi się, że naprawiłem to powyżej, używając ps, dodając dodatkowy grep -v, aby odfiltrować problem z dopasowaniem. Nie mogłem wymyślić, jak używać pgrep, jak zasugerowałeś w tym przypadku, ponieważ nazwa VBox „Windows 7” w moim przypadku jest argumentem komentarza do procesu, takim jak ten: 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-errormsgboxale może masz na to sugestię?
Urban