Я подключаюсь по ssh к своему VPS и запускаю tmux. Я могу копировать/вставлять с удаленного на локальный и с локального на удаленный - используя мышь и shift.
Но я не знаю, как копировать.большие объемы текста.
Если бы я работал локально, я мог бы сделать это: cat somefile.txt | xsel -b
или cat somefile | xclip -selection clipboard
скопировать в буфер обмена. (Конечно, я не могу этого сделать, так как на удаленном сервере не запущен x, и даже в этом случае буфер обмена не будет соответствовать тому, который используется в tmux.)
Итак, как скопировать текст в сеансе tmux и продублировать его по сети в буфер обмена моей локальной системы?
ОБНОВЛЕНИЕ:
На самом деле, это применимо даже без tmux — как копировать и вставлять большие буферы между удаленной и локальной оболочкой.
решение1
Чтобы иметь двунаправленный буфер обмена (подробнее)здесь):
Вот и все. Теперь, чтобы протестировать удаленный → локальный запуск на удаленном хосте:
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) при необходимости.