Copie o texto do tmux remoto para a área de transferência x local

Copie o texto do tmux remoto para a área de transferência x local

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 -bou cat somefile | xclip -selection clipboardcopiar 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):

  1. Corrersshcom-Xpara ativar o encaminhamento X11.

  2. Instalarxsel(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)"

timemostrará 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.

  • tmuxpilha de bufferspode ser suficiente em alguns casos.

  • -XPode precisarxauthno servidor.

  • xseldepende 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 DISPLAYcoisas 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.

informação relacionada