7

Я использую VirtualBox OSE в Ubuntu 10.04.

У меня есть гостевая виртуальная машина Windows 7, которую я использую почти исключительно для MS Outlook для доступа к своему почтовому ящику Exchange. Если я щелкаю URL-адрес в Outlook, он явно открывается в IE на гостевой виртуальной машине, есть ли способ заставить его выполнить какое-либо перенаправление?

Если я щелкну URL-адрес внутри виртуальной машины, я хочу, чтобы он загружался в браузере по умолчанию на хосте Ubuntu.

6 ответов6

5

Теоретически да. У вас может быть обработчик заглушки в гостевой системе, который посылает сообщение демону, работающему на хосте, который фактически вызывает соответствующее приложение. Я никогда не видел такой установки сам, хотя.

2

У меня была та же идея, что и у Игнасио Васкеса-Абрамса, и я воплотил ее в жизнь.


Итак, первая часть этого - HTTP-сервер, который прослушивает запросы на компьютере, на котором вы хотите открыть браузер. При входящем запросе он открывает (в браузере) URL-адрес, указанный в качестве аргумента запроса POST.

Выбери один:

Вы должны добавить этот скрипт в автозагрузку, он должен работать в фоновом режиме.


Вторая часть - это то, что вызывает запрос.

Выбери один:

Вы должны назначить этот скрипт в качестве браузера по умолчанию. Как это сделать ... это отдельный вопрос. Вы можете искать что-то вроде "Windows установить пользовательский исполняемый файл в качестве браузера по умолчанию".

Его также можно использовать в качестве инструмента командной строки: ./open_url.py 'http://google.com/'


Скрипты Python должны работать на всех основных системах с любой достаточно свежей версией Python (я подозреваю, 2.6+, 3.1+).

В Windows, если вы не хотите, чтобы скрипт Python запускался в командном окне, вы должны изменить его расширение на .pyw . Используйте диспетчер задач, если хотите остановить его (ищите pythonw.exe).

Сетевой адаптер VirtualBox должен быть настроен на NAT (настройка по умолчанию). Подробнее об IP-адресе здесь. Выбор порта является произвольным, смело меняйте 1337 на что-то другое везде.

Сервер защищен, потому что он слушает только соединения с локального хоста. VirtualBox заставляет его работать как-то. Но если вы хотите, чтобы это работало удаленно, укажите прослушиваемый IP-адрес как '0.0.0.0' или '' вместо 'localhost' .

2

Если бы был такой путь, это была бы огромная дыра в безопасности.

Максимум, что вы можете сделать, это использовать Shared Clipboard: с установленными гостевыми дополнениями буфер обмена вашей гостевой ОС может быть доступен для вашей хост-системы.

1

Если вы используете Google Chrome в качестве браузера в обеих ОС, может помочь push-браузер: http://pushbrowserapp.com/

Это в основном расширение, которое позволяет отправлять вкладки с одного устройства на другое, в настоящее время поддерживающее устройства Chrome и iOS. В вашей ситуации вы щелкаете ссылку в Outlook, она открывается в Chrome на виртуальной машине, вы щелкаете по значку push-браузера и открывается вкладка в Chrome на вашем компьютере с Ubuntu.

0

Я в такой же ситуации. Вот мое решение лучше, чем ничего:

Я создал скрипт ~/bin/pburl который содержит:

#!/bin/bash

set -eu

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

# EOF

Для этого берется любой URL, который у вас есть в буфере обмена, и открывается как URL с помощью обработчика URL по умолчанию в gnome (в моем случае Chrome).

Мое использование:

  1. В Outlook (на гостевой) я "копирую гиперссылку".
  2. Я нажимаю на рабочем столе или в окне без виртуальной машины.
  3. Я нажимаю control-space, который запускает Synapse и pburl .

Presto! URL открывается.

Это не так хорошо, как щелчок, но это сокращает всю процедуру копирования-открытия-браузера-вставки.

0

У меня нет 50 баллов, поэтому я не могу комментировать пост Олега Пирпина.

У меня есть некоторые улучшения:

  1. Мы с Олегом переписывались в частном порядке, и он предоставил информацию о том, как настроить системный пользовательский модуль. Это может быть использовано для запуска скрипта при загрузке в пользовательском сеансе (так что он видит браузер пользователя). Инструкции здесь: [ https://gist.github.com/oprypin/0f0c3479ab53e00988b52919e5d7c144][1]

  2. Я сделал некоторые улучшения в коде сервера Python. Я использую Host Only Networking в VirtualBox и использую iptables для маршрутизации определенных вещей из виртуальной машины. Я обнаружил, что серверный скрипт Python зависнет, если сеть VirtualBox не будет работать. Моя модификация проверяет, готова ли сеть и, если нет, спит в течение 10 секунд и пытается снова.

    #!/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. Я реализовал гостевую сторону Windows немного по-другому. У меня есть порт Windows curl (источник неизвестен, извините). Я решил использовать это вместо установки Python в системе Windows. Если у вас нет curl, вы можете использовать клиентский скрипт Python, приведенный в первой ссылке.

Я создал пакетный файл url_redirect_client.bat, содержащий:

   @curl --data-urlencode "url=%~1" http://192.168.10.1:1337/
   @exit
  1. Я сделал указанный выше пакетный файл веб-браузером Windows по умолчанию и обработчиком .htm и .html с этим ключом реестра:

    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]
    

Я управлял этим в течение нескольких дней, и это, кажется, работает хорошо. Я столкнулся с одной проблемой с очень длинным URL-адресом от Amazon, но это не удалось. Возможно, использование оригинального авторского скрипта Python на стороне клиента не будет иметь такой проблемы, или, возможно, он нуждается в ком-то еще, чтобы продолжить развивать и улучшать его.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .