Есть ли способ «перенаправить» щелчок по URL-адресу в гостевой системе VirtualBox, чтобы открыть его в браузере операционной системы?

1861
ThatGraemeGuy

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

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

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

7
Нет, на самом деле так не думаю. (Безопасность - это один из аспектов использования виртуальной машины, и это может полностью испортить этот момент, я полагаю, если виртуальная машина сможет так легко манипулировать ОС. VirtualBox - это чертовски программный продукт, но, тем не менее, по крайней мере, так много делает.) Shiki 14 лет назад 1
Я подумал, что это был длинный выстрел, надеялся, что у кого-то был грязный взлом, чтобы сделать эту работу ... угадайте, нет. :-) ThatGraemeGuy 14 лет назад 0
Я не согласен, что это должна быть дыра в безопасности. Я подал [bug] (http://www.virtualbox.org/ticket/9031), чтобы добавить обработчик URL в Guest Additions. Если вы пытаетесь разместить вредоносное ПО на виртуальной машине, вы не начнете устанавливать Guest Additions (он дает доступ к видео и т. Д.). docwhat 13 лет назад 0

6 ответов на вопрос

5
Ignacio Vazquez-Abrams

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

Я почти испытываю желание бросить один в рубине. В Linux я бы использовал `gnome-open` и слушал только через интерфейс` virbr0`. В Windows я, вероятно, все еще использовал бы ruby ​​для отправки сообщения. docwhat 13 лет назад 0
2
harrymc

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

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

Я использовал общий буфер обмена (когда я помню), но это немного утомительно. ThatGraemeGuy 14 лет назад 0
@ Грэм Дональдсон: Я не верю, что есть какой-то другой путь. harrymc 14 лет назад 0
Конечно, гостевые дополнения могут добавить обработчик URL. Гостевые дополнения уже имеют внеполосную связь с VirtualBox и хостом. docwhat 13 лет назад 1
2
Oleh Prypin

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


Итак, первая часть этого - 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'.

После всех этих лет, наконец, кто-то сделал это. Отличная работа, Олег Припин. Это работает отлично. Это должно быть проголосовано. shivams 8 лет назад 0
1
jcardinal

If you're using Google Chrome as your browser on both OSs, push browser may help: http://pushbrowserapp.com/

It's basically an extension that lets you send tabs from one device to another, currently supporting Chrome and iOS devices. In your situation, you'd click the link in Outlook, it'd open in Chrome in the VM, you'd click the push browser icon, and the tab would open in Chrome on your ubuntu machine.

0
docwhat

I'm in the same situation. Here's my better than nothing solution:

I created the script ~/bin/pburl that contains:

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

What this does is takes any URL you have in your clipboard and opens it as a URL using gnome's default url-handler (Chrome in my case).

My usage is:

  1. In Outlook (on the Guest) I "copy hyperlink".
  2. I click on the desktop or a non-VM window.
  3. I press control-space which launches Synapse and type pburl.

Presto! The URL opens.

It's not as good as just clicking would be, but it does shorten the whole copy-open-browser-paste routine.

0
Mark

У меня нет 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 на стороне клиента не будет иметь такой проблемы, или, возможно, он нуждается в ком-то еще, чтобы продолжить развивать и улучшать его.

Похожие вопросы