Eu ssh no meu VPS e executo o tmux. Posso copiar/colar do remoto para o local e do local para o remoto - usando o mouse e o shift.
Mas eu não sei copiargrandes quantidades de texto.
Se eu estivesse trabalhando localmente, poderia fazer isso: cat somefile.txt | xsel -b
ou cat somefile | xclip -selection clipboard
copiar para a área de transferência. (É claro que não posso fazer isso porque o servidor remoto não executa x e, mesmo assim, a área de transferência não corresponde à usada no tmux.)
Então, como copio o texto na sessão tmux e para que ele seja duplicado na área de transferência do meu sistema local?
ATUALIZAÇÃO:
Na verdade, isso é aplicável mesmo sem o tmux - como copiar e colar buffers grandes entre um shell remoto e local.
Responder1
Para ter uma área de transferência bidirecional (maisaqui):
Correr
ssh
com-X
para ativar o encaminhamento X11.Instalar
xsel
(manipular a seleção X).sudo apt install xsel
É isso. Agora, para testar a execução remota → local no host remoto:
date +%Y-%m-%d_%T | xsel -b # Or tee >(xsel -b) to send output also to stdout
No host local:
echo "Time on server is $(xsel -b)"
time
mostrará quanto tempo levou para o comando copiar o texto para a área de transferência.
Notas
Você também pode usar o buffer primário:
Opções de seleção
-p
,--primary
: opera na seleção PRIMARY (padrão).
-b
,--clipboard
: opera na seleção CLIPBOARD.tmux
pilha de bufferspode ser suficiente em alguns casos.-X
Pode precisarxauth
no servidor.xsel
depende de libx11-6 e libc6 (apt depends xsel
).Se você receber
xsel: Can't open display: (null)
chequeesta resposta.
Responder2
Além da excelente resposta de Pablo acima, se você estiver fazendo DISPLAY
coisas esotéricas, por exemplo, encaminhamento do X11 para a área de transferência, mas usando exibição local para aprendizado de máquina OpenGL/CUDA, talvez você queira redirecionar suas exibições.
Se você desviar um display encaminhado pelo X11 para um env var separado, poderá ter o "melhor" dos dois mundos.
Pode ser algo assim:
# 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'
Exemplo dehttps://github.com/eacousineau/dotfiles_template
- Execute dentro da sessão SSH direta do X11:função bash_aliases
- Isso configurará o DISPLAY para usar placa gfx local versus encaminhamento X11 (provavelmente renderização de software)
- Adicione script para lidar com o redirecionamento para a área de transferência; isso também despeja coisas atuais
~/tmp/tmux-clipboard.txt
, apenas para garantir:script bash - Diga ao tmux para usar este script:comando de ligação tmux
Responder3
A maneira geral correta de lidar com isso (que também funciona através de SSH em túnel, por exemplo, host -ssh-> servidor A -ssh-> servidor B) é com a sequência de escape xterm OSC52. O que acontece é que o aplicativo (neste caso tmux ou, digamos, neovim, com o plugin osc52) emitirá um buffer de cópia de sequência OSC52, se o seu terminal o anunciar, e então o seu terminal irá atribuí-lo automaticamente à área de transferência no seu host local . Observe que, neste caso, a sequência de escape e sua carga viajarão de forma transparente pela sessão SSH. a sequência de escape cuida de evitar que o conteúdo do buffer, por mais longo que seja, sobrecarregue ou corrompa a saída do terminal.
Veja o documento da página de manual do tmux:
set-prancheta [ligado | externo | desligado]
Tente definir o conteúdo da área de transferência do terminal usando a sequência de escape xterm(1), se houver uma entrada Ms na descrição do terminfo(5) (consulte a seção EXTENSÕES DO TERMINFO).
Se ativado, o tmux aceitará a sequência de escape para criar um buffer e tentará definir a área de transferência do terminal. Se definido como externo, o tmux tentará definir a área de transferência do terminal, mas ignorará as tentativas dos aplicativos de definir buffers do tmux. Se estiver desativado, o tmux não aceitará a sequência de escape da área de transferência nem tentará definir a área de transferência.
Observe que esse recurso precisa ser habilitado em xterm(1) configurando o recurso:
não permitidoWindowOps: 20,21,SetXprop
Ou alterando esta propriedade no menu interativo xterm(1) quando necessário.