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


7

Ich verwende VirtualBox OSE unter 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 auf eine URL klicke, wird diese offensichtlich im IE in der Gast-VM geöffnet. Gibt es eine Möglichkeit, eine Umleitung durchzuführen?

Wenn ich auf eine URL in der VM klicke, soll sie in meinem Standardbrowser auf dem Ubuntu-Host geladen werden.


1
Nein, glaube nicht wirklich. (Sicherheit ist ein Punkt bei der Verwendung einer VM, und dies würde diesen Punkt völlig ruinieren, wenn eine VM das Betriebssystem so einfach manipulieren kann. VirtualBox ist eine verdammt gute Software, macht aber immer noch mindestens so viel.)
Apache

Ich dachte, es wäre ein langer Schuß, hoffte, jemand hätte einen schmutzigen Hack, um diese Arbeit zu machen ... rate nicht. :-)
ThatGraemeGuy

Ich bin nicht der Meinung, dass es eine Sicherheitslücke sein müsste. Ich habe einen Fehler beim Hinzufügen eines URL-Handlers zu Guest Additions gemeldet. Wenn Sie versuchen, Malware in einer VM zu hosten, würden Sie Guest Additions zunächst nicht installieren (dies ermöglicht den Zugriff auf Videos usw.).
docwhat

Antworten:


2

Wenn es so etwas gäbe, wäre es eine enorme Sicherheitslücke.

Sie können höchstens die freigegebene Zwischenablage verwenden: Wenn Gastzugaben installiert sind, kann die Zwischenablage Ihres Gastbetriebssystems für Ihr Hostbetriebssystem freigegeben werden.


Ich habe eine gemeinsame Zwischenablage verwendet (wenn ich mich erinnere), aber es ist ein wenig langweilig.
ThatGraemeGuy

@ Graeme Donaldson: Ich glaube nicht, dass es einen anderen Weg gibt.
Harrymc

1
Sicher, die Guest Additions könnten einen URL-Handler hinzufügen. The Guest Additions hat bereits eine Out-of-Band-Kommunikation mit der VirtualBox und dem Host.
docwhat

5

Theoretisch ja. Sie können einen Stub-Handler innerhalb des Gasts veranlassen, eine Nachricht an einen Daemon zu senden, der auf dem Host ausgeführt wird und tatsächlich die richtige Anwendung aufruft. Ich habe selbst noch nie ein solches Setup gesehen.


Ich bin fast versucht, einen in Rubin zusammen zu werfen. Unter Linux würde ich gnome-opennur die virbr0Schnittstelle verwenden und anhören . Unter Windows würde ich wahrscheinlich immer noch Ruby verwenden, um die Nachricht zu senden.
docwhat

2

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


Der erste Teil davon ist also ein HTTP-Server, der Anforderungen auf dem Computer abhört, auf dem Sie den Browser öffnen möchten. Bei einer eingehenden Anfrage wird (in einem Browser) die URL geöffnet, die als Argument für eine POST-Anfrage angegeben wurde.

Wähle eins:

Sie sollten dieses Skript zum Start hinzufügen, es soll im Hintergrund ausgeführt werden.


Der zweite Teil ruft die Anfrage auf.

Wähle eins:

Sie sollten dieses Skript als Standardbrowser festlegen. Wie das geht, ist ... eine separate Frage. Sie können nach "Windows-benutzerdefinierte ausführbare Datei als Standardbrowser festlegen" suchen .

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


Die Python-Skripte sollten auf allen wichtigen Systemen mit einer einigermaßen aktuellen Python-Version funktionieren (ich vermute 2.6+, 3.1+).

Wenn Sie unter Windows nicht möchten, dass ein Python-Skript in einem Befehlsfenster ausgeführt wird, sollten Sie seine 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 willkürlich. Sie können 1337 überall in etwas anderes ändern .

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


Nach all den Jahren hat es endlich jemand getan. Großartige Arbeit, Oleh Prypin. Das funktioniert perfekt. Es sollte positiv bewertet werden.
Shivams

1

Wenn Sie Google Chrome unter beiden Betriebssystemen als Browser verwenden, kann der Push-Browser hilfreich sein: http://pushbrowserapp.com/

Grundsätzlich handelt es sich um eine Erweiterung, mit der Sie Registerkarten von einem Gerät an ein anderes senden können. Derzeit werden Chrome- und iOS-Geräte unterstützt. In Ihrer Situation würden Sie in Outlook auf den Link klicken, er würde in Chrome in der VM geöffnet, Sie würden auf das Push-Browser-Symbol klicken und die Registerkarte würde in Chrome auf Ihrem Ubuntu-Computer geöffnet.


0

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

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

#!/bin/bash

set -eu

exec gnome-open $(xclip -out -selection clipboard)

# EOF

Dabei wird jede URL, die Sie in Ihrer Zwischenablage haben, mit dem Standard-URL-Handler von gnome (in meinem Fall Chrome) als URL geöffnet.

Meine Verwendung ist:

  1. In Outlook (auf dem Gast) "kopiere ich Hyperlink".
  2. Ich klicke auf den Desktop oder ein Nicht-VM-Fenster.
  3. Ich drücke auf Control-Space, um Synapse zu starten und tippe pburl.

Presto! Die URL wird geöffnet.

Es ist nicht so gut wie nur ein Klick, aber es verkürzt die gesamte Routine zum Kopieren, Öffnen, Browser-Einfügen.


0

Ich habe keine 50 Punkte, daher kann ich unter Oleh Pyrpins Beitrag keinen Kommentar abgeben.

Ich habe einige Verbesserungen:

  1. Oleh und ich haben privat korrespondiert und er hat Informationen zum Einrichten einer systemd-Benutzereinheit bereitgestellt. Dies kann verwendet werden, um das Skript beim Booten innerhalb der Benutzersitzung auszuführen (damit der Browser des Benutzers angezeigt wird). Anweisungen 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 Zertifizierungsdaten aus der VM weiterzuleiten. Ich fand heraus, dass das Server-Python-Skript abstürzen würde, wenn das Netzwerk von VirtualBox nicht aktiv wäre. Meine Änderung prüft, ob das Netzwerk bereit ist und wenn nicht, schläft 10 Sekunden lang und versucht es erneut.

    #!/usr/bin/env python
    # Credit to... Oleh Pyrpin for all of the cool stuff here.
    # See /superuser/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 keine Locke haben, können Sie das im ersten Link bereitgestellte 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 Batch-Datei mit diesem Registrierungsschlüssel zum Standard-Windows-Webbrowser und -Handler von .htm und .html 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 dies für ein paar Tage ausgeführt und es scheint gut zu funktionieren. Ich bin auf ein Problem mit einer extrem langen URL von Amazon gestoßen, dies ist fehlgeschlagen. Möglicherweise tritt bei der Verwendung des clientseitigen Python-Skripts des ursprünglichen Autors dieses Problem nicht auf, oder es ist möglicherweise eine andere Person erforderlich, um darauf aufzubauen und es zu verbessern.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.