KVM ВМ – копировать и вставлять без доступа к буферу обмена хоста

Вопрос или проблема

Я пытался найти способ копировать и вставлять в/из моей виртуальной машины Debian KVM/QEMU без предоставления ВМ доступа к буферу обмена хоста и без доступа хоста к буферу обмена ВМ.

Хост работает на Debian 11 с KDE, а ВМ – на Debian 11 с XFCE4 (управляется с помощью virt-manager).

Моя причина заключается в том, что я буду копировать и вставлять различные вещи в операционной системе хоста (пароли и тому подобное), которые не хочу, чтобы ВМ могла видеть, и то же самое внутри ВМ.

Мое текущее, очень грубое решение – это общий файловая система с директорией в /tmp на обеих системах – ВМ и хосте, и файл, в который я пишу и читаю с помощью нескольких bash-скриптов, по одному разу. Я запускаю терминал с двумя окнами и вставляю туда вещи, которые хочу поделиться с ВМ, а ВМ может вставлять вещи, которые я хочу поделиться с хостом.

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

Идеально было бы иметь альтернативные сочетания клавиш на обеих ОС (alt-c, alt-v), которые копируют выделенные данные в отдельный общий буфер обмена между хостом и ВМ. Я поиграл с глобальными сочетаниями клавиш KDE, но проблема сводится к чтению текстовых выделений из программы в скрипте, вызываемом сочетанием клавиш.

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

Да, это хороший вопрос. В идеале, хотелось бы иметь возможность временно включать и выключать общий буфер обмена. Существует проблема с virt-manager (https://github.com/virt-manager/virt-manager/issues/358), в которой запрашивается эта возможность. Это было признано “слишком нишевым”, и даже был открыт pull request (https://github.com/virt-manager/virt-manager/pull/166), который не был принят.

Мое обычное решение – это обмен текстом туда и обратно в общем терминале (с использованием tmux). Это работает, но мне это не очень нравится.

Вы не приводите много деталей о вашем подходе с общим файлом, но вы, безусловно, можете автоматизировать процессы, используя xclip, например.

Чтобы скопировать буфер обмена в общий файл, используйте что-то вроде

xclip -i -selection clipboard share_file_name

А чтобы скопировать из общего файла в буфер обмена, используйте что-то вроде

xclip -o -selection clipboard > share_file_name

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

Одним из недостатков вышеописанного подхода является то, что вам нужно иметь общий файл, доступный как хосту, так и ВМ. Если вы не доверяете ВМ, тогда, возможно, не стоит иметь и общие файлы.

Без общих файлов все еще есть некоторые варианты. Программа вроде netcat или какое-то другое приложение для обмена текстом могут быть использованы для обмена текстом. Для случая вставки текста из буфера обмена хоста в приложение на ВМ, я использую скрипт автонабора с помощью xclip и xdotool. Например, мой скрипт xautotype_clipboard содержит:

#!/bin/bash
delay=${1:-5}
txt=$(/bin/xclip -o -selection clipboard)
/bin/xdotool sleep "${delay}" type "${txt}"

Я копирую текст в буфер обмена хоста, а затем запускаю вышеупомянутый скрипт (используя сочетание клавиш оконного менеджера). Я перемещаю мышь к ВМ, туда, где хочу вставить текст. Скрипт вставляет текст так, будто я его набрал. Скрипт принимает необязательный аргумент, задержку в секундах. По умолчанию она составляет 5, и это время, прежде чем начнется автонабор. Это дает время для того, чтобы расположить мышь в правильном окне/приложении.

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

Для нескольких строк текста скрипт можно модифицировать так, чтобы он набирал по одной строке за раз. Мой файл xautotype_clipboard2 содержит:

#!/bin/bash
delay=${1:-5}
IFS=

do_autotype()
{ local first=1
  local string
  while read string
  do
    if [[ "${first}" == 1 ]]
    then
      /bin/xdotool sleep "${delay}" type "${string}"
      first=0
    else
      /bin/xdotool type "${string}"
    fi
    /bin/xdotool key Return
  done
}

echo $(/bin/xclip -o -selection clipboard) | do_autotype

Это работает для буферов обмена хоста, содержащих несколько строк текста.

К сожалению, у меня нет аналогичного решения для перехода от ВМ обратно к хосту.

Обратите внимание, что с помощью xclip вы можете указать, какой выбор вы хотите использовать. В приведенном выше примере я использую -selection clipboard, но вы также можете использовать -selection primary или -selection secondary, в зависимости от того, какой выбор X вы хотите использовать.

Редактирование-1: Также, пожалуйста, убедитесь, что тестируете, чтобы убедиться, что это делает то, что вы хотите. xautotype_clipboard удалит символы перевода строки. xautotype_clipboard2 добавит символ перевода строки в конце, даже если его там не было.

Ответ или решение

Копирование и вставка в KVM VM без доступа к буферу обмена хоста

Ваша задача – обеспечить возможность копирования и вставки данных между хостом и виртуальной машиной (VM) на базе KVM/QEMU без доступа к буферу обмена хоста и в то же время с минимальными неудобствами. Проблема копирования чувствительных данных, таких как пароли, из одного окружения в другое требует проработанного подхода. Рассмотрим несколько вариантов для решения данной проблемы.

1. Использование общего терминала с tmux

Один из простейших и наиболее гибких подходов – использование терминального мультиплексора, такого как tmux. Возможно, вы уже обращались к этому решению. Создайте общий сеанс tmux на хосте, который будет доступен и для VM. Таким образом, вы сможете обмениваться текстом через текстовые команды. Это может быть не идеальное решение, но оно довольно эффективно для быстрого обмена информацией.

2. Автоматизация обмена с использованием xclip и xdotool

Как вы упомянули в своем запросе, вы можете использовать утилиты xclip и xdotool для автоматизации процесса. Вот пример сценария, который может помочь вам в копировании текста в общий файл, доступный как на хосте, так и в вашей VM:

Копирование текста из буфера обмена в файл
#!/bin/bash
xclip -o -selection clipboard > /path/to/shared/file
Вставка текста из файла в буфер обмена
#!/bin/bash
cat /path/to/shared/file | xclip -i -selection clipboard

Вы можете назначить горячие клавиши для запуска этих сценариев на вашем хосте и на VM, что значительно упростит процесс.

3. Использование сетевого взаимодействия

Если вы не хотите использовать общие файлы, вы можете рассмотреть вариант использования сетевых инструментов, таких как netcat. Этот метод позволяет отправлять текстовые данные между хостом и VM через сокеты:

# На хосте
echo "Текст для VM" | nc -l -p 12345

# На VM
nc <IP-адрес хоста> 12345

Это позволит вам передавать данные между двумя системами без необходимости хранения их в файлах.

4. Автонабор текста с помощью xdotool

Для вставки текста из буфера обмена в VM я рекомендую использовать xdotool. Вот пример скрипта, который имитирует нажатие клавиш для ввода текста в активное окно:

#!/bin/bash
sleep 5
txt=$(xclip -o -selection clipboard)
xdotool type "$txt"

Этот скрипт вводит текст, который вы скопировали в буфер обмена хоста, в активное окно вашей VM. Вы можете использовать команду sleep для ожидания 5 секунд, чтобы иметь возможность переключиться обратно на виртуальную машину перед тем, как текст будет напечатан.

Заключение

Каждый из предложенных методов имеет свои плюсы и минусы. Использование сценариев с xclip и xdotool может потребовать небольшой тонкой настройки, однако они обеспечивают необходимую функциональность, сохраняя безопасность. Сетевые решения, такие как netcat, также могут быть полезны, но могут потребовать дополнительных мер для защиты передаваемых данных.

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

Оцените материал
Добавить комментарий

Капча загружается...