Copie texto desde tmux remoto al portapapeles x local

Copie texto desde tmux remoto al portapapeles x local

Entro en mi VPS y ejecuto tmux. Puedo copiar y pegar del control remoto al local y del local al remoto, usando el mouse y la tecla Mayús.

Pero no sé copiargrandes cantidades de texto.

Si estuviera trabajando localmente, podría hacer esto: cat somefile.txt | xsel -bo cat somefile | xclip -selection clipboardcopiar al portapapeles. (No puedo hacer eso, por supuesto, ya que el servidor remoto no ejecuta x, y aun así el portapapeles no coincidiría con el usado en tmux).

Entonces, ¿cómo copio texto en la sesión tmux y para que se duplique por cable en el portapapeles de mi sistema local?

ACTUALIZACIÓN:
En realidad, esto es aplicable incluso sin tmux: cómo copiar y pegar grandes buffers entre un shell remoto y local.

Respuesta1

Para tener portapapeles bidireccional (másaquí):

  1. Corrersshcon-Xpara habilitar el reenvío X11.

  2. Instalarxsel(manipular la selección X).

    sudo apt install xsel
    

Eso es todo. Ahora, para probar la ejecución remota → local en el host remoto:

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

En el servidor local:

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

timemostrará cuánto tiempo le tomó al comando copiar el texto al portapapeles.

Notas

  • También puedes usar el búfer primario en su lugar:

    Opciones de selección

    -p, --primary: opera en la selección PRIMARIA (predeterminada).
    -b, --clipboard: opera en la selección del PORTAPAPELES.

  • tmuxpila de bufferpodría ser suficiente en algunos casos.

  • -XPodria necesitarxauthen el servidor.

  • xselDepende de libx11-6 y libc6 ( apt depends xsel).

  • si recibes xsel: Can't open display: (null)chequeesta respuesta.

Respuesta2

Además de la excelente respuesta anterior de Pablo, si está haciendo DISPLAYcosas esotéricas, por ejemplo, reenvío X11 para el portapapeles pero usando la pantalla local para cosas de aprendizaje automático OpenGL/CUDA, entonces es posible que desee redirigir sus pantallas.

Si desvía una pantalla reenviada por X11 a una var de entorno separada, entonces puede tener lo "mejor" de ambos mundos.

Puede verse así:

# 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'

Ejemplo dehttps://github.com/eacousineau/dotfiles_template

  • Ejecute dentro de la sesión SSH directa X11:función bash_aliases
    • Esto configurará DISPLAY para usar la tarjeta gfx local frente al reenvío X11 (probablemente renderizado por software)
  • Agregue un script para manejar la redirección al portapapeles; esto también descarga el material actual ~/tmp/tmux-clipboard.txt, por si acaso:script de bash
  • Dile a tmux que use este script:comando de enlace tmux

Respuesta3

La forma general correcta de manejar esto (que también funciona a través de SSH tunelizado, por ejemplo, host -ssh-> servidor A -ssh-> servidor B) es con la secuencia de escape OSC52 xterm. Lo que sucede es que la aplicación (en este caso tmux o, digamos, neovim, con el complemento osc52) emitirá un búfer de copia de secuencia OSC52, si su terminal lo anuncia, y luego su terminal lo asignará automáticamente al portapapeles en su host local. . Tenga en cuenta que en este caso la secuencia de escape y su carga útil viajarán de forma transparente a través de la sesión SSH. la secuencia de escape se encarga de evitar que el contenido del búfer, por largo que sea, satura o corrompa la salida de su terminal.

Consulte el documento de la página de manual de tmux:

set-portapapeles [en | externo | apagado]

Intente configurar el contenido del portapapeles del terminal usando la secuencia de escape xterm(1), si hay una entrada Ms en la descripción de terminfo(5) (consulte la sección EXTENSIONES DE TERMINFO).

Si está activado, tmux aceptará la secuencia de escape para crear un búfer e intentará configurar el portapapeles del terminal. Si se configura como externo, tmux intentará configurar el portapapeles del terminal pero ignorará los intentos de las aplicaciones de configurar los buffers de tmux. Si está desactivado, tmux no aceptará la secuencia de escape del portapapeles ni intentará configurar el portapapeles.

Tenga en cuenta que esta característica debe habilitarse en xterm(1) configurando el recurso:

no permitidasWindowOps: 20,21,SetXprop

O cambiar esta propiedad desde el menú interactivo de xterm(1) cuando sea necesario.

información relacionada