Расшарить между компьютерами какой-либо документ — просто. Предоставить удаленный доступ к рабочему столу — нет проблем. Но почему-то до сих пор нельзя просто «поделиться» запущенным приложением — взять и быстро перенести его окно из одной системы в другую. С появлением проекта WinSwitch это стало возможным.

 

Что такое WinSwitch?

Если ты часто имеешь дело с виртуальными машинами, то наверняка знаешь о такой замечательной возможности как перенос окон из гостевой операционной системы, запущенной в виртуальном окружении, в хостовую ОС (основную систему на компьютере). То есть если на виртуальной машине крутится винда, а сама виртуальная машина работает на Ubuntu, то любые запущенные приложения можно «перенести» из Windows в Ubuntu. Что самое прикольное, — они будут работать так, как если бы были запущены самым обычным способом. У меня давно возникла идея реализовать что-то подобное, но не в плоскости виртуальной машины, а с точки зрения протоколов для доступа к удаленному рабочему столу. RDP или VNC без проблем позволяют получить картинку с компьютера, который может находиться за тысячи километров, и вполне комфортно с ним взаимодействовать. Но зачем нужна картинка полного рабочего стола, когда работать приходится с одним или двумя конкретными приложениями? Ведь можно же отображать только их окна? Удивительно, но реализации такой простой идеи долго не было. Пока не появился WinSwitch!

Запуск приложения на локальном WinSwtich сервере через контекстное меню
Запуск приложения на локальном WinSwtich сервере через контекстное меню

Как это выглядит? Запустив какое-либо приложение через специальный сервер, ты сможешь напрямую перенести его на любое устройство, где будет установлен соответствующий клиент. Тут нужно понимать — не файлы приложения, а именно окно программы, с которым можно работать. Теперь, если нужно продолжить работу над текущим документом в Microsoft Word или, скажем, над проектом в Visual Studio на другом компьютере, можно просто «перетащить» туда окно. А поскольку проект кроссплатформенный, то это еще и отличный способ работать с приложением в том случае, когда для нужной системы нет подходящей версии. Или вот еще пример: у меня дома рядом стоят компьютер на Windows и ноутбук на Ubuntu, — теперь я без проблем могу перекидывать приложения с одной системы на другую (ну и с одного экрана на другой). Хоть даже Visual Studio. В результате можно расшарить не документ, а приложение.

Успешное соединение с удаленным сервером ant-vb
Успешное соединение с удаленным сервером ant-vb
 

Установка

Теперь, когда понятно, о чем идет речь, попробуем WinSwitch в действии. Для примера организуем связь между двумя машинами, выбрав в качестве плацдарма две разных ОС — Ubuntu Natty Narwhal (11.04) и Windows XP.

Windows. Тут все довольно примитивно: на официальном сайте winswitch.org скачиваем инсталлятор, который все сделает за нас. Для корректной работы программе понадобится mDNS-сервер (подробней об mDNS смотри во врезке) — если на машине он не установлен (а он, скорее всего, не установлен), то инсталлятор выдаст соответствующее сообщение и предоставит ссылку на дистрибутив.

Запуск приложения на локальном WinSwitch сервере
Запуск приложения на локальном WinSwitch сервере

Linux. Я, как уже было отмечено выше, буду использовать Ubuntu, но, само собой, подойдет и любой другой дистрибутив тукса. В убунте приложение можно установить через менеджер пакетов, предварительно прописав цифровую подпись репозитория с нужными нам пакетами:

sudo su -
wget -O — https://winswitch.org/gpg.asc | apt-key add -

echo "deb http://winswitch.org/ natty main" > /etc/apt/sources.list.d/winswitch.list
apt-get update
apt-get install winswitch

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

 

Настройка

WinSwitch состоит из двух частей: сервера и клиента (так называемого апплета). Клиент необходим в системе, чтобы в нее можно было «перетащить» приложения — его можно запустить сразу после установки через меню. Также при старте апплета автоматически запускается локальный сервер, чтобы иметь возможность расшарить приложения с локальной машины. При запуске клиент пытается определить все доступные сервера в сети при помощи mDNS.

Подключение у удаленному рабочему столу Ubuntu через VNC
Подключение у удаленному рабочему столу Ubuntu через VNC

Конфигурирование как клиента, так и сервера осуществляется через конфигурационные файлы. При первом запуске программа создает необходимые папки и генерирует конфиги, что может занять некоторое время. Как только программа запустилась, идем искать конфиги сервера. В *nix они будут в папке ~/.winswitch/server/server.conf, а в Windows — *\Application Data\Window-Switch\server\server.conf. Рассмотрим наиболее важные для нас параметры. Каждый сервер имеет свой идентификатор, имя и тип, — все это автоматически генерируется при запуске и выглядит примерно так:

# Identity
ID="8796747538515"
name="testpc"
type="workstation"

Тут можно все оставлять без изменений. Далее в конфиге идут публичный и приватный ключи, используемые для шифрования трафика. Нас же, прежде всего, будет интересовать параметр listen_on, определяющий, на каком интерфейсе и порту сервер будет ожидать подключений. Его, в принципе, тоже можно оставить в состоянии «по умолчанию», но я для порядка все же поставил listen_on=»*:32123″ (это означает, что сервер будет ожидать подключения на 32123 порту на всех сетевых интерфейсах). Далее идет еще один интересный параметр allow_root_logins, который в целях безопасности рекомендуется установить в значение False. Он определяет, можно ли будет подключиться к данному серверу под администратором/рутом. Параметр allow_root_authentication дает возможность соединиться с сервером под любым пользователем, не зная его пароля. Его я тоже отключил из соображений безопасности. Следующая интересная секция — mDNS settings — позволяет включать/отключать сервис mDNS, используемый для того, чтобы клиенты при запуске могли самостоятельно находить в сети доступные сервера. Если установить параметр mDNS_publish в значение False, то автоматический поиск серверов будет отключен и их придется добавлять вручную. Чтобы клиенты обнаруживали не только сервера, но и имя пользователя, под которым можно зайти, есть опция mDNS_publish_username. Еще одна полезная возможность — запуск сервера в режиме отладки — может сильно помочь, когда надо прояснить, почему что-то не работает. Остальные опции в случае необходимости ты можешь изучить сам, так как они достаточно хорошо прокомментированы в самом файле.

Сапер, "отправленный" из другой операционной системы
Сапер, «отправленный» из другой операционной системы
 

Тест-драйв

Наша задача — запустить какую-нибудь программу и «отправить» ее с одного компьютера на другой. В идеальном случае все заработает без лишних заморочек. Сначала поработаем на машине с Windows XP. Открываем меню «Пуск» и запускаем клиент Window-Switch. Как уже обсуждалось выше, при запуске апплета автоматически запустился и сервер. Апплет его тут же обнаружил и подключился к нему. Теперь идем в Ubuntu. Открываем стартовое меню и выбираем «Internet -> WindowSwitch». Апплет стартует, запускается сервер. Появляется окно, в котором сообщается, что найден сервер с именем testpc и ID=8796747538515. Подтверждаем, что мы хотим с ним соединиться, после чего нас попросят ввести пароль для пользователя user. В винде появилось такое же окно, сообщающее, что найден сервер ant-vb и просьбой ввести пароль пользователя ant для соединения. Связь установлена — попробуем отправить приложение с одной системы на другую. Идем в линукс, жмем на значок WinSwitch в трее и выбираем «Start Application -> Games -> Mines». Появляется аналог виндового сапера (можно чуть поломать голову), – теперь мы готовы его расшарить. Опять жмем на иконку приложения в трее, выбираем «Mines -> Send to user on testpc». И приложение исчезает. Переходим в винду и видим, что оно появилось там. Вуаля!

Ручной запуск Avahi-демона
Ручной запуск Avahi-демона

Надо сказать, что WinSwitch уже содержит список предопределенных приложений, рассортированных по категориям, которые можно расшарить. Но можно запустить и свое приложение, если выбрать «Start Application -> Custom Command». Для удобства эта фича также интегрируется в контекстное меню, так что будет достаточно выбрать нужную программу, щелкнуть по ней правой клавишей и выбрать «Open in Window Switch». Кроме приложений, можно получить доступ к самому рабочему столу («Main Unix Display -> VNC Copy»). Помимо непосредственно окна можно форвардить также и звук (для этого используется библиотека GStreamer).

Ручное добавление сервера для подключения
Ручное добавление сервера для подключения
 

Отладка

Я не зря сделал выше ремарку «в идеальном случае», — с первого раза у меня система не запустилась. Нажав на значок апплета в трее, я понял, что он видит только локальный сервер. Можно, конечно, добавить сервер вручную, но тогда весь смысл автоматизации теряется. Поэтому вернусь к этому моменту и расскажу, в чем было дело.

Сообщение, свидетельствующее об успешном соединении с удаленной Windows-машиной
Сообщение, свидетельствующее об успешном соединении с удаленной Windows-машиной

Прежде всего надо бы посмотреть логи. Начал я с винды. Лог клиента располагался здесь: *\Application Data\Window-Switch\client\applet.log. Ситуации он не прояснил, так как в нем я не увидел информации о какой-либо ошибке. Ну что ж, тогда проверим сервер. К сожалению, логов сервера я не нашел. Пообщавшись с документацией на официальном сайте, было решено следующее: чтобы посмотреть отладочные сообщения сервера, надо запустить его в консоли с параметром —debug-mode. Запускаем консоль, переходим в папку программы (C:\Program Files\WinSwitch) и запускаем сервер:

Switch-Server.exe --debug-mode

Покопавшись в сообщениях сервера, ничего криминального я снова не обнаружил. Так что, скорее всего, проблема кроется в Linux-версии. Переходим в линукс. Заходим в консоль и запускаем уже линуксовый сервер в отладочном режиме:

winswitch_server --debug-mode

В результате вываливаемся с ошибкой:

[EE] 2012/23/02 19:13:18 WinSwitchServer.check() running as root (uid=0) is currently broken

И снова общение с официальным сайтом прояснило ситуацию. Оказывается, сервер и апплет нельзя запускать под рутом (а у меня как раз была открыта консоль с правами рута). Ну что ж, попробуем проделать тот же трюк под обычным пользователем. Запускаем сервер в режиме отладки под обычным пользователем. И ищем в консоли все строки, начинающиеся на [DD] (отладочные сообщения). Пролистывая лог из конца в начало, обратим внимание на стек вызовов функций. Похоже, тут произошла какая-то ошибка, и программа выкинула нам traceback. Смотрим, что вызывалось последним:

AvahiPublisher.__init__(Window Switch for ant on ant-vb,32123,_shifter._tcp.,,,['username=ant', 'ssh_tunnel=False', 'version=0.12.11', 'ID=8796747971533'],-1)

Немного поясню. Avahi — это система, производящая анализ локальной сети на предмет выявления различных сервисов. К примеру, можно подключить ноутбук к локальной сети и сразу получить информацию об имеющихся принтерах, разделяемых ресурсах, сервисах обмена сообщениями и прочих услугах. Подобная технология существует в Mac OS X (Rendezvous, Bonjour) и отлично себя зарекомендовала. Avahi во многом базируется на реализации протокола mDNS — flexmdns. Так как в конфиге сервера у нас включена возможность обнаружения через mDNS, а сам mDNS-сервер у нас не запущен или не установлен, то автоматическое обнаружение и не срабатывает. Смотрим список процессов – действительно, Avahi нет. Но в списке установленных приложений он фигурирует, — значит, придется просто запустить его вручную:

avahi-daemon

Сообщение «Service ant-vb (/services/udisks.service) successfully established» свидетельствует о том, что avahi стартанул успешно. Может теперь все заработает? Запускаем сервер WinSwitch заново. Сообщение об ошибке инициализации mDNS уже не присутствует. На всякий случай проверим лог-файл апплета, который можно найти по следующему пути ~/.winswitch/client/applet.log. Там тоже обнаруживаются записи, свидетельствующие о наличии проблем с mDNS. Записей о других критических ошибках — не обнаружено. Так как проблему с mDNS мы уже решили, запустив демон ahavi, то теперь вроде бы все должно быть нормально. Выключаем сервер, который мы запустили вручную, и идем в меню, чтобы запустить апплет. Бинго! С этого момента все заработало.

На данной вкладке можно настроить используемые протоколы
На данной вкладке можно настроить используемые протоколы

 

Что такое mDNS?

Multicast DNS (mDNS) является способом использования привычных программных интерфейсов DNS в небольших сетях, где нет необходимости в обычном DNS-сервере. Проще говоря, использование mDNS позволяет клиенту определить IP-адрес хоста без помощи централизованного DNS-сервера. Машина, ищущая конкретный хост, посылает широковещательный mDNS-запрос. Соответствующий хост отвечает на этот запрос широковещательным ответом, «представляя» себя другим участникам сети. Таким образом все машины в сети обновляют свой mDNS-кэш и получают информацию и о новых хостах/сервисах. Чтобы аннулировать свое «представление» (например, в случае выключения машины) хост должен отправить response-пакет с TTL = 0. По умолчанию mDNS использует зарезервированную зону «.local». Протокол mDNS используют такие системы обнаружения сервисов как Bonjour (Apple) и Avahi (Linux).

Ручное добавление сервера для подключения
Ручное добавление сервера для подключения
 

Использовать или нет?

WinSwich – это вполне работоспособная реализация отличной идеи, которую я успешно использую уже несколько недель. Уверен, что очень скоро появятся коммерческие проекты, эксплуатирующие подобный подход, но уже с более человеческим интерфейсом, простой настройкой и — в идеальном варианте — прозрачным переносом окон из одной системы в другую (на случай, если два компьютера стоят рядом). Последнее несложно реализовать, если скомбинировать проект WinSwitch и Direct Input, позволяющий расшарить между стоящими рядом компьютерами клавиатуру и мышку.

Полный доступ к удаленному рабочему столу Windows-машины из-под Ubuntu
Полный доступ к удаленному рабочему столу Windows-машины из-под Ubuntu

 

1 комментарий

  1. AdVv

    01.08.2016 at 11:22

    На фразе «Удивительно, но реализации такой простой идеи долго не было. Пока не появился WinSwitch!» поперхнулся. Техлоногии сто лет в обед исполняется. Seamless Window умел дремучий Citrix Metaframe на Windows 2000, аналогичная технология уже встроена в Windows Server 2012, путем несложного хака заводится и на десктопных версиях, начиная с Windows 7 точно.

Оставить мнение

Check Also

Используй, свободно! Как работает уязвимость use-after-free в почтовике Exim

В самом популярном на сегодняшний день почтовом сервере Exim был обнаружен опасный баг: ес…