Общий буфер обмена для Windows/Linux систем, с активацией по требованию

image

Виртуальные машины плотно вошли в мое рабочее окружение, VMware, VirtualBox, Hyper-V и RDP. Наличие поддержки у них общего буфера обмена — это удобная возможность обмена данными между системами. Но есть и ряд минусов:

  • Автоматическая синхронизация буфера обмена далеко не безопасна, можно случайно «засветить» чувствительные данные в другой системе.
  • Проблема передачи данных между двумя виртуальными машинами, приходится пользоваться хостовой машиной, как мост с промежуточным этапом вставки-копирования данных.
  • В Hyper-V, работа с буфером обмена для виртуалок с Linux, «из коробки» поддерживается пока только для Ubuntu.

Решил в свободное время сделать утилиту для совместного использования буфера обмена на разных системах, которая бы осуществляла перенос данных только по требованию пользователя. Реализовал это кроссплатформенное приложение на .NET Avalonia UI, с поддержкой ОС Windows и Linux. Применение его в своей повседневной работе сделало настолько удобным работу с виртуалками, что я решил поделиться этим приложением в статье на хабре.

Визуально приложение — это небольшое окно, которое всегда поверх других окон. Окно можно расположить в любом удобном месте рабочего стола. После клика на окне приложения и нажатием клавиш Ctrl+V, или «Paste» в контекстном меню, можно отправить содержимое буфера обмена в другую систему, где запущено такое же приложение.

В принципе, больших проблем создание приложения не вызвало. Нюансы возникли при работе с буфером обмена, так как форматы данных различаются для Windows и для Linux, хотя это было в целом ожидаемым. Форматы разделил на две группы, текст\графика и файлы. Поддерживать аудио не стал, так как пока не сталкивался с этим форматом, но архитектура программы позволяет добавить поддержку при необходимости. У каждой из групп форматов есть свой список конвертеров для сериализации\десериализации данных. Честно говоря, соответствие форматов для текста и графики между Windows и Linux подбирал опытным путем, найти какие-либо готовые таблицы соответствия не смог. На текущий момент корректно переносятся данные между системами, Windows10/11, Linux Ubuntu (18–22) и Linux Mint (20–21).

Копирование-вставка файлов осуществляется через временную папку, т.е. файлы передаются и сохраняются на принимающей стороне в папке tmp/ShareClipbrd_60D54950, затем уже эти файлы копируется в локальный буфер обмена, и вставка файлов происходит из этой папки. Содержимое временной папки не очищается автоматически, только замещается новыми файлами\папками при последующих операциях копирования-вставки.

Сами данные передаются по TCP/IP соединению. В настройках, контекстное меню с настройками вызывается правым кликом, в поле «Host address» необходимо указать сетевой адрес хоста, с указанием номера порта, например «WIN-U2EPЕ64NN1:61002». В поле «Partner address» указывается, соответственно сетевой адрес партнерской системы, также с указанием номера порта, например «linux-sandbox-01:61002».

Для систем, в которых не используются доменные имена и IP-адреса выделяются динамически, был добавлен сервис mDNS. С помощью этого сервиса обе части приложения автоматически определяют свои адреса в локальной сети. Этот сервис включается при указании специальной строки в поле адресов. Строка должна начинаться с префикса «mdns:», затем идет цифро-буквенный идентификатор, например «mdns: win10_linux». Если необходимо для Firewall использовать конкретный номер порта, то его можно указать после идентификатора через двоеточие, например «mdns: win10_linux:61002». Для поля «Partner address» соответственно указывается префикс «mdns:» и идентификатор партнера, номер порта вводить не нужно.

Пример сетевых настроек.
image

Чтобы быстро переключаться между системами, имеются 3 профиля сетевых настроек, переход на другой профиль инициирует соединение в соответствии с настройками этого профиля. Для удобства проверки статуса соединения, на окне приложения есть пара круглых индикаторов, один показывает соединение к партнеру, а второй наоборот от партнера.
Код проекта открытый и расположен на github.com/viordash/ShareClipbrd. Готовые exe-шники для Windows и Linux есть в github.com/viordash/ShareClipbrd/releases.

© Habrahabr.ru