Copiar entrada al portapapeles a través de SSH?

33

Aquí está mi caso de uso:

  • A menudo estoy conectado a otras computadoras a través de SSH por trabajo y a menudo necesito copiar y pegar documentos / texto desde el servidor a editores que se ejecutan localmente para escribir ejemplos y compartir texto.
  • A menudo, si el texto es lo suficientemente pequeño, simplemente copiaré el resultado de mi programa de terminal (gnome-terminal en este momento) y lo pegaré.
  • Sin embargo, cuando se trata de documentos completos, mis opciones son bastante limitadas. Puedo copiar el documento trozo por trozo o scpen la máquina local.

¿Hay alguna manera de usar un programa como el xclipque me permitirá copiar de forma remota stdinal portapapeles del servidor X local? Algo en el sentido de:

cat myconffile.conf | sed {...} | copy-over-ssh-to-local-clipboard

sería increíble. ¿Existe algo para hacer esto posible?

Naftuli Kay
fuente

Respuestas:

20

Si ejecuta ssh con reenvío X, esto es transparente: los comandos remotos (incluidos xclip) tienen acceso a su servidor X (incluido su teclado). Asegúrese de tener ForwardX11 yesen su ~/.ssh/configy X11Forwarding yesen el servidor sshd_config(dependiendo de sus distribuciones, estas opciones pueden estar activadas o desactivadas de forma predeterminada).

<myconffile.conf sed {...} | xclip -i

Hay otras formas de trabajar en archivos remotos que pueden ser más convenientes, por ejemplo, montando directorios remotos en su máquina local con SSHfs , o abriendo archivos remotos en Emacs con Tramp . Si tiene configurados ssh y FUSE y SSHfs instalado, SSHfs es tan fácil como mkdir ~/net/myserver; sshfs myserver:/ ~/net/myserver. Si tiene configurado ssh y Emacs instalado, Tramp es tan fácil como abrirlo /myserver:/path/to/file.

Gilles 'SO- deja de ser malvado'
fuente
1
¿Alguna vulnerabilidad de seguridad para ejecutar cosas de esta manera por defecto en el archivo conf?
Naftuli Kay
No. Todo el tráfico x11 se reenvía a través del canal SSH.
Shadur
2
@TKKocheran No realmente. En el lado del servidor, ninguno. En el lado del cliente, un poco, ya que le da al administrador del servidor un camino hacia su cliente, pero en el 99% de los casos el administrador del servidor tiene un camino de todos modos; ver Si alguien ha iniciado sesión en SSH en mi computadora, ¿puedo acceder a su computadora?
Gilles 'SO- deja de ser malvado'
7

No necesitas nada especial; ya que xclipfunciona stdin, solo

ssh remotehost xclip < myconf.conf

¿Por qué necesitaría ser modificado con sed? sshes transparente a los datos cuando no se usa como terminal, y se usa comúnmente en tuberías como

tar cfz - somedir | ssh remotehost 'cd destdir; tar xfz -'`
geekosaur
fuente
¿Hay alguna manera de hacerlo desde una sesión SSH existente? Realmente preferiría no tener que abrir otra ventana de terminal si ya tengo una abierta para la máquina en cuestión.
Naftuli Kay
Y sed` es solo un ejemplo, si quisiera realizar algún procesamiento stdinantes de copiarlo en el portapapeles, me gustaría esa opción.
Naftuli Kay
No, no hay forma de inyectar datos en una sshsesión existente (no sería muy seguro si pudiera). Puede configurar las ssh ControlMastercosas para multiplexar conexiones adicionales sobre una existente, pero en realidad no es algo para principiantes y aún lo hace de la misma manera después, cambiando a otro terminal local y ejecutando el comando anterior (que no abre un nuevo ventana de terminal).
geekosaur
@NaftuliKay Para obtener una solución que funcione dentro de su sesión SSH normal, vea mi respuesta .
Tanius
5

Así es como lo haría en OSX desde su máquina local

ssh remotehost.com "<some/file.txt" | pbcopy
William Casarin
fuente
3

Si su máquina local está ejecutando Windows (7+), puede usar esto desde la línea de comandos:

ssh user@server cat /home/user/file | clip
d.raev
fuente
1

~ / .ssh / config:

Host REMOTEHOST
    ...
    ForwardX11 yes

/ etc / ssh / sshd_config:

X11Forwarding yes

golpetazo:

$ xclip -o | ssh REMOTEHOST 'DISPLAY=:0 xclip -i'
superqwerty
fuente
1

Muy similar a las soluciones de @ d-raev y @ william-casarin, sin embargo, es diferente, así que comparto lo que funcionó para mí.

El comando

ssh user@host "cat <myconffile.conf" | xclip -sel clip

Explicación

Esto se utiliza sshpara crear un túnel seguro, iniciar sesión en user@ hosto ip, luego ejecutar catpara imprimir el contenido de <myconffile.confy stdoutluego canalizarlo al comando xclip -sel clipen su máquina local, que coloca el contenido <myconffile.confen el portapapeles de su máquina local.

Uso de ejemplo del mundo real

Utilizo esta estructura de comandos para tareas como pegar claves ssh en github (permitiendo una simple selección de ctrl-V o pegar después de ejecutar el comando) con Bash en Ubuntu 16.04 y 18.04. Echa un vistazo man ssh, man caty man xclippara el comportamiento y la opción de detalles.

Jason R Stevens CFA
fuente
Esto incluso funciona para copiar desde servidores sin cabeza, donde xclipno se ejecutará ya que no hay X.
Tanius
0

Tengo un problema similar con el portapapeles de LUbuntu lxterminal(probado varios terminales) pegando a una sshsesión. Si el portapapeles tiene más de aproximadamente 100 bytes, la sesión expira y falla.

Si me conecto a través de ssh a casi cualquier servidor CentOS 5.xy luego me conecto al servidor de destino, el pegado del portapapeles funciona sin ningún problema para un tamaño de datos razonable.

Vasyl
fuente
0

Copiar desde un servidor sin cabeza al portapapeles local, desde dentro de su sesión SSH habitual:

  1. Instalar ncaten su máquina local y remota. (En su máquina remota también puede hacerlo con nco sin formato telnet, pero en la máquina local necesitamos las opciones para ejecutar comandos ( -c/ -e) que no están disponibles en ncdistribuciones habituales como Debian y Ubuntu).

    apt install nmap
    
  2. En su máquina local, configure un servidor que escuche en la interfaz local que copiará el contenido que ingresa en el puerto 10009 a su portapapeles X:

    ncat --keep-open --listen --sh-exec "xclip -selection clipboard" localhost 10009
    

    O utilice la versión abreviada equivalente:

    ncat -klc "xclip -sel c" localhost 10009
    
  3. SSH en la máquina remota de tal manera que se establezca un túnel inverso desde el puerto 10008 de la máquina remota al puerto 10009 en su máquina local (donde su servidor está escuchando). Puede usar esa sesión SSH para su trabajo normal.

    ssh -R 10008:localhost:10009 [email protected]
    
  4. Cuando desee copiar el contenido de un archivo desde una máquina remota al portapapeles local, ejecute en el shell SSH:

    ncat --send-only localhost 10008 < file.txt
    

    Y, por supuesto, es mejor cuando se empaqueta como un acceso directo de shell o script. Podríamos llamarlo rclip"portapapeles remoto [copiar a]" en analogía con el conocido xclip.

Ventajas

  • No es necesario abrir otra sesión SSH en la máquina remota.

  • No es necesario xclipen la máquina remota, por lo que funciona si no puede instalarlo o no puede usarlo porque es un servidor sin cabeza sin X.

Seguridad

Lo hacemos ncat -l localhost 10009para el servidor, lo que significa que solo escucha en la interfaz de red con la localhostdirección IP. Esta interfaz de bucle local solo permite conexiones desde su propia máquina (incluidas, en este caso, las de túnel inverso a través de SSH). Entonces, incluso si no está detrás de un firewall, su puerto 10009 no está expuesto a nadie en Internet.

Fuente

Adaptado de gist dergachev / ssh-forward-clipboard.md para trabajar en Linux. Esa esencia también contiene instrucciones sobre cómo hacer que el túnel inverso SSH sea un valor predeterminado.

Tanius
fuente
-1

https://secure.wikimedia.org/wikipedia/en/wiki/Base64

Puede convertir sus datos del portapapeles con Base64 a texto ASCII. Entonces puede empujar eso dentro de una conexión SSH ya existente.

LanceBaynes
fuente
¿Por qué convertir a algo? Ya es texto en este caso e incluso si fuera binario, no habría razón para que no pudieras enviarlo a través de una tubería como esta.
Caleb
portapapeles podría contener datos binarios, por ejemplo: una aplicación compilada
LanceBaynes
Sí, podría, pero ¿por qué sería un problema? Los datos binarios se pueden transferir a través de una tubería y un túnel ssh.
Caleb