Скопировать текст из удаленного tmux в локальный буфер обмена x.

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

Я подключаюсь по SSH к своему VPS и запускаю tmux. Я могу копировать/вставлять текст с удаленного на локальный и с локального на удаленный – используя мышь и клавишу Shift.

Но я не знаю, как копировать большие объемы текста.

Если бы я работал локально, я мог бы сделать это: cat somefile.txt | xsel -b или cat somefile | xclip -selection clipboard, чтобы скопировать в буфер обмена. (Я не могу этого сделать, так как удаленный сервер не запускает X, и даже в этом случае буфер обмена не совпадет с тем, который используется в tmux.)

Так как мне копировать текст в сессии tmux и чтобы он дублировался через сеть в буфер обмена моей локальной системы?

ОБНОВЛЕНИЕ:
На самом деле, это применимо даже без tmux – как копировать и вставлять большие буферы между удаленной и локальной оболочкой.

Чтобы иметь двусторонний буфер обмена (больше здесь):

  1. Запустите ssh с -X, чтобы включить пересылку X11.

  2. Установите xsel (для работы с выборкой X).

    sudo apt install xsel
    

Вот и все. Теперь, чтобы протестировать удаленный → локальный, выполните на удаленном хосте:

date +%Y-%m-%d_%T | xsel -b  # Или tee >(xsel -b), чтобы отправить вывод также на stdout

На локальном хосте:

echo "Время на удаленном хосте: $(xsel -b)"

time покажет, сколько времени потребовалось команде, чтобы скопировать текст в буфер обмена.

Заметки

  • Вы также можете использовать первичный буфер вместо:

    Опции выбора

    -p, --primary: работать с первичным выбором (по умолчанию).
    -b, --clipboard: работать с выбором буфера обмена.

  • tmux стек буферов может быть достаточным в некоторых случаях.

  • -X может потребовать xauth на сервере.

  • xsel зависит от libx11-6 и libc6 (apt depends xsel).

  • Если вы получаете xsel: Can't open display: (null), проверьте этот ответ.

В дополнение к отличному ответу Пабло выше, если вы делаете эзотерические вещи с DISPLAY, например, пересылка X11 для буфера обмена, но используете локальный экран для задач машинного обучения с OpenGL / CUDA, то вы можете захотеть перенаправить свои дисплеи.

Если вы перехватываете пересылаемый X11-дисплей в отдельную переменную окружения, то вы можете получить “лучшее” из обоих миров.

Это может выглядеть примерно так:

# Функция Bash.
personal-ssh-session() {  # Вызывается вручную
    if [[ ! -v _SSH_DISPLAY && -v DISPLAY ]]; then
        export _SSH_DISPLAY=${DISPLAY}
        echo "Используется перенаправление _SSH_DISPLAY=${_SSH_DISPLAY}"
    fi
    export DISPLAY=:1
}

# Скрипт Bash, `tmux-copy.sh`
#!/bin/bash
set -e
if [[ -n "${_SSH_DISPLAY}" ]]; then
    export DISPLAY=${_SSH_DISPLAY}
fi
mkdir -p ~/tmp
tee ~/tmp/tmux-clipboard.txt | xclip -in -selection clipboard

# команда привязки tmux - обязательно, чтобы ${_DOTFILES} была установлена, или используйте что-то другое
bind -T copy-mode-vi Enter send-keys -X copy-pipe \
    '${_DOTFILES}/tmux-copy.sh'

Пример из https://github.com/eacousineau/dotfiles_template

  • Запустите внутри сессии SSH с пересылкой X11: функция bash_aliases
    • Это установит DISPLAY для использования локальной графической карты вместо пересылки X11 (скорее всего, программный рендеринг)
  • Добавьте скрипт для обработки перенаправления для буфера обмена; это также сбрасывает текущие данные в ~/tmp/tmux-clipboard.txt, на всякий случай: bash-скрипт
  • Скажите tmux использовать этот скрипт: команда привязки tmux

Общий правильный способ решения этой проблемы (который также работает через туннелированный SSH, например, хост -ssh-> сервер A -ssh-> сервер B) – это использование последовательности escape OSC52 xterm. Что происходит, так это то, что приложение (в данном случае tmux или, скажем, neovim с плагином osc52) будет отправлять последовательность OSC52 для копирования буфера, если ваш терминал это поддерживает, а затем ваш терминал автоматически назначит это на буфер обмена на вашем локальном хосте. Обратите внимание, что в этом случае последовательность escape и ее содержимое будут прозрачно передаваться через сессию SSH. Последовательность escape заботится о том, чтобы содержимое буфера, каким бы длинным оно ни было, не загромождало и не портило вывод терминала.

Смотрите документацию страницы man tmux:

set-clipboard [on | external | off]

Попытаться установить содержимое буфера обмена терминала с использованием последовательности escape xterm(1), если в описании terminfo(5) есть запись Ms (см. раздел TERMINFO EXTENSIONS).

Если установлено на on, tmux будет как принимать последовательность escape для создания буфера, так и пытаться установить буфер обмена терминала. Если установлено на external, tmux будет пытаться установить буфер обмена терминала, но игнорировать попытки приложений установить буферы tmux. Если off, tmux не будет ни принимать последовательность escape для буфера обмена, ни пытаться установить буфер обмена.

Обратите внимание, что эта функция должна быть включена в xterm(1), установив ресурс:

disallowedWindowOps: 20,21,SetXprop

Либо изменяя это свойство из интерактивного меню xterm(1) при необходимости.

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

Копирование текста из удаленного tmux в локальный буфер обмена

Работа с буфером обмена между удаленными и локальными системами в процессе SSH-сессии может представлять определенные трудности, особенно когда речь идет о копировании больших объемов текста. Рассмотрим несколько решений для этой задачи, начиная с необходимых настроек.

Шаги для установки копирования текста из удаленного tmux в локальный буфер обмена

  1. Включите X11-перенаправление: Это позволяет использовать графическую подсистему X на локальной машине, обеспечивая доступ к буферу обмена. Чтобы активировать X11-перенаправление, подключитесь к вашему VPS с помощью следующей команды:

    ssh -X user@your-vps-ip

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

  2. Установите xsel или xclip: Эти утилиты позволяют взаимодействовать с буфером обмена X. Чтобы установить, выполните на удаленном сервере:

    sudo apt install xsel xclip
  3. Копирование текста: Теперь вы можете использовать команду xsel или xclip, чтобы копировать текст. Например, чтобы скопировать текст из файла или стандартного вывода, выполните:

    cat largefile.txt | xsel -b

    или

    cat largefile.txt | xclip -selection clipboard

    Здесь -b указывает на использование буфера обмена.

Использование OSC52 для копирования текста

Для более продвинутого способа копирования, который не требует использования X11, можно использовать специальный ESC-последовательности, называемую OSC52. Эта последовательность позволяет автоматически передавать содержимое буфера в локальный буфер обмена без преобладания в терминальном выводе.

  1. Настройка tmux: Чтобы включить поддержку этих ESC-последовательностей в tmux, добавьте следующие строки в ваш ~/.tmux.conf:

    set-option -g set-clipboard on
  2. Копирование через OSC52: Вы можете использовать комбинации клавиш для копирования выделенного текста в буфер обмена. Например, выделите текст в режиме копирования tmux и используйте последовательность. Некоторые терминалы поддерживают эту функциональность по умолчанию.

Варианты настройки для различных случаев

  • Использование скриптов: Вы можете создать bash-скрипт, чтобы упростить задачу копирования в буфер обмена. Например, следующий скрипт выводит содержимое в временную директорию и копирует его в буфер обмена:

    #!/bin/bash
    set -e
    mkdir -p ~/tmp
    tee ~/tmp/tmux-clipboard.txt | xclip -in -selection clipboard
  • Использование переключения дисплеев: Если вы хотите отделить графическое окружение от X11, вы можете перенаправить дисплей. Это может быть полезно для определенных приложений, работающих с графикой. Пример функции в вашем .bashrc:

    personal-ssh-session() {
       export DISPLAY=:1
    }

Заключение

Копирование текста из удаленного tmux в локальный буфер обмена может быть осуществлено несколькими способами. Используйте X11-перенаправление для простоты или OSC52 для более сложных сценариев. Настройка этих функциональностей не только упростит вашу работу, но и ускорит процессы копирования больших объемов данных. Подходите к выбору метода с учетом ваших потребностей и окружения.

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

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