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

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

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

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

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

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

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

решение1

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

  1. Бегатьsshс-Xдля включения пересылки X11.

  2. Установитьxsel(изменить выбор X).

    sudo apt install xsel
    

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

date +%Y-%m-%d_%T | xsel -b  # Or tee >(xsel -b) to send output also to stdout

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

echo "Time on server is $(xsel -b)"

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

Примечания

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

    Варианты выбора

    -p, --primary: работать с ПЕРВИЧНЫМ выделением (по умолчанию).
    -b, --clipboard: работать с выделением БУФЕРА ОБМЕНА.

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

  • -XМожет понадобитьсяxauthна сервере.

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

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

решение2

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

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

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

# Bash function.
personal-ssh-session() {  # Call manually
    if [[ ! -v _SSH_DISPLAY && -v DISPLAY ]]; then
        export _SSH_DISPLAY=${DISPLAY}
        echo "Using redirect _SSH_DISPLAY=${_SSH_DISPLAY}"
    fi
    export DISPLAY=:1
}


# Bash script, `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 bind command - be sure ${_DOTFILES} is set, or use something else
bind -T copy-mode-vi Enter send-keys -X copy-pipe \
    '${_DOTFILES}/tmux-copy.sh'

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

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

решение3

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

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

set-clipboard [вкл | внешний | выкл]

Попытайтесь задать содержимое буфера обмена терминала с помощью escape-последовательности xterm(1), если в описании terminfo(5) есть запись Ms (см. раздел РАСШИРЕНИЯ TERMINFO).

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

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

disallowedWindowOps: 20,21,SetXprop

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

Связанный контент