Вопрос или проблема
Я пытался найти способ копировать и вставлять в/из моей виртуальной машины 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
, также могут быть полезны, но могут потребовать дополнительных мер для защиты передаваемых данных.
Важно протестировать каждое из решений, чтобы убедиться, что оно полностью соответствует вашим требованиям безопасности и удобства. Надеюсь, эти рекомендации помогут вам настроить удобное и безопасное окружение для обмена данными между вашим хостом и виртуальной машиной!