Gibt es eine Möglichkeit, einen Klick auf eine URL in einem VirtualBox-Gast "umzuleiten", um ihn im Host-OS-Browser zu öffnen?

1911
ThatGraemeGuy

Ich verwende VirtualBox OSE auf Ubuntu 10.04.

Ich habe eine Windows 7-Gast-VM, die ich fast ausschließlich für MS Outlook verwende, um auf mein Exchange-Postfach zuzugreifen. Wenn ich in Outlook eine URL in Outlook anklicke, wird sie offensichtlich in IE in der Gast-VM geöffnet. Gibt es eine Möglichkeit, eine Art Weiterleitung durchführen zu lassen?

Wenn ich auf eine URL in der VM klicke, möchte ich, dass sie in meinen Standardbrowser im Ubuntu-Host geladen wird.

7
Nein, glaube nicht wirklich. (Sicherheit ist ein Punkt bei der Verwendung einer VM, und dies würde den Punkt total ruinieren. Ich denke, wenn eine VM das Betriebssystem so leicht manipulieren kann. VirtualBox ist eine verdammte Software, tut aber immerhin so viel.) Shiki vor 13 Jahren 1
Ich dachte mir, dass es ein Weitschuss war, hoffte, dass jemand einen dreckigen Hack hatte, um diese Arbeit zu erledigen ... schätze nicht. :-) ThatGraemeGuy vor 13 Jahren 0
Ich stimme nicht zu, dass es ein Sicherheitsloch sein muss. Ich habe einen [Fehler] (http://www.virtualbox.org/ticket/9031) eingereicht, um einen URL-Handler zu Guest Additions hinzuzufügen. Wenn Sie versuchen, Malware in einer virtuellen Maschine zu hosten, würden Sie zunächst keine Gastzugänge installieren (dies gibt Zugriff auf Videos usw.). docwhat vor 12 Jahren 0

6 Antworten auf die Frage

5
Ignacio Vazquez-Abrams

Theoretisch ja. Sie könnten einen Stub-Handler innerhalb des Gasts haben, der eine Nachricht an einen Daemon sendet, der auf dem Host ausgeführt wird, wodurch tatsächlich die richtige Anwendung aufgerufen wird. Ich habe selbst noch nie ein solches Setup gesehen.

Ich bin fast versucht, einen in Rubin zusammenzuwerfen. Unter Linux würde ich "gnome-open" verwenden und nur auf der Schnittstelle "virbr0" hören. Unter Windows würde ich wahrscheinlich immer noch Ruby verwenden, um die Nachricht zu senden. docwhat vor 12 Jahren 0
2
harrymc

Wenn es einen solchen Weg gäbe, wäre das eine enorme Sicherheitslücke.

Sie können am besten die gemeinsame Zwischenablage verwenden: Wenn Guest-Zusätze installiert sind, kann die Zwischenablage Ihres Gastbetriebssystems mit Ihrem Hostbetriebssystem gemeinsam genutzt werden.

Ich habe die geteilte Zwischenablage benutzt (wenn ich mich erinnere), aber es ist ein wenig langweilig. ThatGraemeGuy vor 13 Jahren 0
@Graeme Donaldson: Ich glaube nicht, dass es einen anderen Weg gibt. harrymc vor 13 Jahren 0
Sicher, die Guest Additions könnten einen URL-Handler hinzufügen. Die Gastzugänge verfügen bereits über eine Out-of-Band-Kommunikation mit der VirtualBox und dem Host. docwhat vor 12 Jahren 1
2
Oleh Prypin

Ich hatte die gleiche Idee wie Ignacio Vazquez-Abrams und habe sie umgesetzt.


Der erste Teil davon ist ein HTTP-Server, der Anfragen auf dem Computer abhört, auf dem Sie den Browser öffnen möchten. Bei einer eingehenden Anforderung wird (in einem Browser) die als Argument einer POST-Anforderung angegebene URL geöffnet.

Wähle eins:

Sie sollten dieses Skript zum Start hinzufügen, es soll im Hintergrund laufen.


Der zweite Teil ist etwas, das die Anfrage aufruft.

Wähle eins:

Sie sollten dieses Skript als Standardbrowser festlegen. Wie das geht, ist ... eine gesonderte Frage. Sie können nach etwas suchen, wie z. B. "Windows als Standardbrowser" .

Es kann auch als Befehlszeilenwerkzeug verwendet werden: ./open_url.py 'http://google.com/'


Die Python-Skripts sollten auf allen gängigen Systemen mit einer relativ aktuellen Python-Version funktionieren (ich vermute, dass 2.6+, 3.1+).

Wenn Sie unter Windows nicht möchten, dass ein Python-Skript in einem Befehlsfenster ausgeführt wird, sollten Sie die Erweiterung in ändern .pyw. Verwenden Sie den Task-Manager, wenn Sie ihn stoppen möchten (suchen Sie nach pythonw.exe ).

Der VirtualBox-Netzwerkadapter sollte auf NAT eingestellt sein (Standardeinstellung). Mehr zur IP-Adresse hier . Die Wahl des Hafens ist beliebig. Sie können den 1337 überall auf etwas anderes ändern .

Der Server ist sicher, da er nur Verbindungen von localhost überwacht. VirtualBox macht es irgendwie möglich. Wenn Sie jedoch möchten, dass dies remote funktioniert, geben Sie als '0.0.0.0'oder ''anstelle von die abhörende IP-Adresse an 'localhost'.

Nach all den Jahren hat dies endlich jemand getan. Tolle Arbeit, Oleh Prypin. Das funktioniert perfekt. Es sollte bestätigt werden. shivams vor 7 Jahren 0
1
jcardinal

Wenn Sie Google Chrome als Browser für beide Betriebssysteme verwenden, kann der Push-Browser hilfreich sein: http://pushbrowserapp.com/

Es ist im Grunde eine Erweiterung, mit der Sie Registerkarten von einem Gerät zum anderen senden können und derzeit Chrome- und iOS-Geräte unterstützen. In Ihrer Situation würden Sie auf den Link in Outlook klicken, er wurde in Chrome in der VM geöffnet, Sie klicken auf das Push-Browsersymbol und die Registerkarte wird in Chrome auf Ihrem Ubuntu-Computer geöffnet.

0
docwhat

Ich bin in der gleichen Situation. Hier ist meine bessere als nichts Lösung:

Ich habe das Skript erstellt, das Folgendes ~/bin/pburlenthält:

#!/bin/bash  set -eu  exec gnome-open $(xclip -out -selection clipboard)  # EOF 

Was dies bedeutet, nimmt jede URL, die Sie in Ihrer Zwischenablage haben, und öffnet sie als URL, indem Sie den Standard-URL-Handler von gnome (in meinem Fall Chrome) verwenden.

Meine Verwendung ist:

  1. In Outlook (auf dem Guest) "kopiere ich Hyperlink".
  2. Ich klicke auf den Desktop oder ein Nicht-VM-Fenster.
  3. Ich drücke Control-Space, der Synapse und Typ startet pburl.

Presto! Die URL wird geöffnet.

Es ist nicht so gut wie das Klicken, aber es verkürzt die gesamte Routine zum Kopieren und Öffnen des Browsers.

0
Mark

Ich habe keine 50 Punkte, daher kann ich unter dem Beitrag von Oleh Pyrpin nichts kommentieren.

Ich habe einige Verbesserungen:

  1. Oleh und ich korrespondierten privat und er lieferte Informationen zum Einrichten einer systemd-Benutzereinheit. Dies kann verwendet werden, um das Skript beim Booten in der Benutzersitzung auszuführen (damit der Browser des Benutzers angezeigt wird). Anweisungen hierzu finden Sie hier: [ https://gist.github.com/oprypin/0f0c3479ab53e00988b52919e5d7c144 ] [1 ]

  2. Ich habe einige Verbesserungen am Python-Servercode vorgenommen. Ich verwende Host Only Networking in VirtualBox und verwende iptables, um Zertifizierungsaufgaben aus der VM herauszuleiten. Ich fand heraus, dass das Server-Python-Skript abstürzt, wenn das Netzwerk von VirtualBox nicht aktiv ist. Meine Änderung prüft, ob das Netzwerk bereit ist und 10 Sekunden lang nicht in den Ruhezustand versetzt wird, und versucht es erneut.

    #!/usr/bin/env python # Credit to... Oleh Pyrpin for all of the cool stuff here. # See https://superuser.com/questions/140234/is-there-a-way-to-redirect-a-click-on-a-url-in-a-virtualbox-guest-to-open-in-t # # My improvements: 1. Wait for VirtualBox network to be available  # 2. Check for available port so we can fail gracefully if something (probably another instance of us) is already listening on the port # markd89   import webbrowser, time, socket, os.path, sys  try: from urllib.parse import parse_qs except ImportError: from urlparse import parse_qs  def application(environ, start_response): try: if environ['REQUEST_METHOD'] == 'POST': try: length = int(environ['CONTENT_LENGTH']) except KeyError: length = None post = parse_qs(environ['wsgi.input'].read(length).decode('utf-8')) [url] = post['url'] webbrowser.open(url, new=2, autoraise=True)  except Exception as e: print(repr(e))  start_response('200 OK', [('Content-Type', 'text/html; charset=utf-8')]) return []   if __name__ == '__main__': while True: #Loop every 10 seconds until we're able to start the Web Server  if os.path.isfile('/sys/class/net/vboxnet1/operstate'): print("Debug: Path exists.") if 'up' in open('/sys/class/net/vboxnet1/operstate').read(): # Adjust this for the name of your vbox network print("Debug: vboxnet1 is up. Checking if port is available.")  sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(2) #2 Second Timeout result = sock.connect_ex(('192.168.10.1',1337)) # Adjust this for the server and port you are using.  if result == 0: print ("Debug: Port already in use. Maybe another instance of this script is running?") sys.exit(1)  else: print ("Debug: Port available, starting web server.")  from wsgiref.simple_server import make_server httpd = make_server('192.168.10.1', 1337, application) # This should match the server and port above, doh! httpd.serve_forever()  else: print("Debug: vboxnet1 is not up yet.") time.sleep(10)  
  3. Ich habe die Windows-Gastseite etwas anders implementiert. Ich habe einen Windows-Port von curl (Quelle unbekannt, sorry). Ich dachte, ich würde das verwenden, anstatt Python auf dem Windows-System zu installieren. Wenn Sie kein curl haben, können Sie das im ersten Link enthaltene Client-Python-Skript verwenden.

Ich habe eine Batch-Datei url_redirect_client.bat erstellt, die Folgendes enthält:

 @curl --data-urlencode "url=%~1" http://192.168.10.1:1337/ @exit 
  1. Ich habe die obige Batchdatei zum Standard-Windows-Webbrowser und -Handler von .htm und .html mit diesem Registrierungsschlüssel gemacht:

    Windows Registry Editor Version 5.00  [HKEY_CURRENT_USER\Software\Classes\.CSS] @="urlredirectclient"  [HKEY_CURRENT_USER\Software\Classes\.HTM] @="urlredirectclient"  [HKEY_CURRENT_USER\Software\Classes\.HTML] @="urlredirectclient"  [HKEY_CURRENT_USER\Software\Classes\urlredirectclient\shell\open\command] @="c:\\temp\\url_redirect_client.bat \"%1\""  [HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\http\UserChoice] "Progid"="urlredirectclient"  [HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\https\UserChoice] "Progid"="urlredirectclient"  [-HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.css]  [-HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.htm]  [-HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.html] 

Ich habe das seit ein paar Tagen laufen lassen und es scheint gut zu funktionieren. Ich bin auf eine Ausgabe mit einer extrem langen URL von Amazon gestoßen, die fehlgeschlagen ist. Bei der Verwendung des clientseitigen Python-Skripts der ursprünglichen Autoren ist dieses Problem möglicherweise nicht vorhanden, oder es muss möglicherweise ein anderer Benutzer darauf aufbauen und es verbessern.