El comando ssh no termina

El comando ssh no termina

Escribí un script para configurar el portapapeles de mi escritorio desde mi teléfono Android.

#!/bin/sh

ssh -Y user@host "export DISPLAY=:0; echo -n $(termux-clipboard-get) | xclip -selection clipboard"

El script funciona como se esperaba pero no finaliza. Tengo que presionar Ctrl+ Cpara volver al mensaje.

He usado la -fopción y regresa inmediatamente. De man ssh:

-f
Solicita sshpasar a segundo plano justo antes de la ejecución del comando. Esto es útil si sshva a solicitar contraseñas o frases de contraseña, pero el usuario las quiere en segundo plano. […]

No estoy seguro de si es la forma correcta de resolver esto. No es necesario ejecutarlo en segundo plano. Sólo necesita ejecutar un comando y regresar.

¿Por qué no sshregresa? ¿Es ssh -funa buena manera? ¿Existe una mejor manera?

Respuesta1

Deesta respuesta:

Las selecciones en X funcionan mediante dos clientes X que cooperan: un cliente X afirma que tiene una selección (primaria, secundaria, portapapeles) y otro cliente X que quiere pegar la selección se comunica con el primer cliente para recibirla.

En su caso el original xclipmuere pero su hijo sobrevive para reclamar que tiene la selección y servir para futuros clientes que quieran pegar. Parece que no se desconecta por completo y el servidor SSH espera a que salga; entonces su sshcliente espera a que salga. De ahí la necesidad de Ctrl+ C.

Más tarde, si otro cliente afirma que tiene la selección, el control remoto xclipsaldrá y desbloqueará su local ssh. Esto significa que su solución -fno es tan mala: los procesos en segundo plano no se acumularán, habrá como máximo uno detenido ssh.

La respuesta vinculada intenta resolver un problema que parece algo relacionado.Otra respuestaahí aconseja xsel. De hecho, en mis pruebas esto no bloquea:

ssh -Y user@host "export DISPLAY=:0; echo -n foobar | xsel -i -b"

Cambiar xclipa xseles crucial. Aún así, tu comando original se puede mejorar más.

  • Creo que no necesitas -Y(o -X) porque los comandos remotos no interactúan con tu servidor X local. Es suficiente configurarlo DISPLAYa la derecha para que apunte xsela la pantalla deseada, que eslocala xsel.

  • No hay necesidad de export. La variable sólo es relevante para xsel, por lo que este fragmento debería ser suficiente:DISPLAY=:0 xsel -i -b

  • Fallo grave. $(termux-clipboard-get)se expande localmente y todo lo que obtenga termux-clipboard-getse incrustará en la cadena que pase al shell remoto para seriterpretadocomo código.

    Por ejemplo, si termux-clipboard-getregresa ; rm -f /very/important/file; true, se ejecutará el shell remoto

    export DISPLAY=:0; echo -n ; rm -f /very/important/file; true | …
    

    ¿Ves lo que hace? Lo correcto es conectar a ssh:

    termux-clipboard-get | ssh user@host 'DISPLAY=:0 xsel -i -b'
    

    De esta manera, la salida de termux-clipboard-getnunca será tratada como código.

  • Supongo que solías echo -nobtener deliberadamente el resultado termux-clipboard-getsin ningún carácter de nueva línea al final. Si es así, deberías eliminar las nuevas líneas finales localmente yno confiar enecho:

    printf '%s' "$(termux-clipboard-get)" | …
    

La forma final puede ser:

printf '%s' "$(termux-clipboard-get)" | ssh user@host 'DISPLAY=:0 xsel -i -b'

Tenga en cuenta que el comando eliminará los caracteres de nueva línea finales incluso de los datos que deben interpretarse como binarios y no modificarse. Los caracteres NUL también serán problemáticos. Si necesita pasar algunos datos palabra por palabra, simplemente canalice termux-clipboard-getdirectamente desde:

termux-clipboard-get | ssh …

información relacionada