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. Готовые exe-шники для Windows и Linux есть тут.

UPD! забыл напомнить, что для запуска необходимо наличие установленного .NET Runtime 7.

Комментарии (6)


  1. datacompboy
    14.10.2023 13:45
    +5

    Честно говоря, соответствие форматов для текста и графики между Windows и Linux подбирал опытным путем, найти какие-либо готовые таблицы соответствия не смог. 

    Самая мякота и пропущена!


    1. viordash Автор
      14.10.2023 13:45

      если вы про соответствие форматов, то наверно можно понять из Converters в https://github.com/viordash/ShareClipbrd/blob/main/ShareClipbrd/Clipboard.Core/ClipboardData.cs


      1. datacompboy
        14.10.2023 13:45

        Я про:

        • как выяснялось соответствие?

        • как конверсия рождалась?

        • чем генерились тесты?

        и так далее :)


        1. viordash Автор
          14.10.2023 13:45
          +2

          я вроде писал, что подбиралось опытным путем, например копировал текст, смотрел название форматов (GetFormats()), определял тип данных (строка или массив байт), ну и на основании этого строилась конверсия.


  1. vvzvlad
    14.10.2023 13:45

    А макось?(


    1. viordash Автор
      14.10.2023 13:45

      к сожалению у меня нет ни опыта разработки под макось, да и необходимости работать в макоси не было. Но Авалония может и в макось (https://docs.avaloniaui.net/docs/next/guides/platforms/macos-development), так что если есть желание и возможность, то пуллреквесты приветствуются