Control Ctrl-C en sesión SSH

20

Cuando inicio una sesión SSH que ejecuta un comando de ejecución prolongada, ¿qué sucede con el manejo de Ctrl+ C(SIGINT)?

Puedo ver que la sesión SSH está cerrada, pero no estoy seguro de quién recibe primero el SIGINT: ¿es ...

  1. el comando remoto de larga duración? es decir, (a) se llama al controlador de señal en el comando remoto y detiene el comando remoto, (b) el shell que generó detecta que el comando se detuvo y también se detiene (c) el sshd remoto detecta que el shell se detuvo, entonces cierra la conexión

    o

  2. el ssh local recibe la señal y cierra la conexión.

Creo que (1) está sucediendo, pero quiero asegurarme.

Tampoco estoy seguro de lo que sucede con el manejo de shell de SIGINT en este caso. Por ejemplo, si yo ...

ssh remote 'while true ; do sleep 1 ; date ; done'

y Ctrl+ C, entonces se cae la conexión remota. ¿Hay alguna manera de ejecutar el comando remoto en un shell que permanecerá vivo después de Ctrl+ C? Es decir, en este caso, ¿detener el ciclo y permitirme seguir trabajando en el shell remoto?

ttsiodras
fuente
3
Un ssh no interactivo ( ssh remote commanden oposición a ssh remote) será eliminado (en el lado local) por el SIGINT generado al escribir ctrl-C. El lado remoto probablemente (depende del sistema operativo) permanecerá ejecutándose hasta que intente leer o escribir en el socket cerrado. Si desea que todas sus pulsaciones de teclas, incluida ctrl-C, se transfieran al control remoto, use ssh remote.
Mark Plotnick el
@ MarkPlotnick: OK Mark: si agrega su respuesta a continuación como respuesta, la aceptaré ... En mis propias pruebas, verifiqué que el control remoto no recibe ninguna señal.
ttsiodras
relacionado: unix.stackexchange.com/questions/40023/…
bernard paulus

Respuestas:

23

sshse puede invocar de varias maneras diferentes, cada una de las cuales resulta en un tratamiento ligeramente diferente de señales iniciadas por terminales como Ctrl-C.

  • ssh remotehostejecutará una sesión interactiva el remotehost. En el lado del cliente, sshintentará establecer el tty utilizado por stdin en modo "sin procesar", y sshden el host remoto asignará un pseudo-tty y ejecutará su shell como un shell de inicio de sesión (por ejemplo -bash).

    Establecer el modo sin formato significa que los caracteres que normalmente enviarían señales (como Ctrl-Cy Ctrl-\) se insertan en su lugar en la secuencia de entrada. sshenviará tales caracteres como están al host remoto, donde probablemente enviarán SIGINT o SIGQUIT y, por lo general, matarán cualquier comando y lo devolverán a un shell en el host remoto. La conexión ssh permanecerá activa, siempre que el shell remoto esté activo.

  • ssh -t remotehost command args ...ejecutará una sesión interactiva remotehost, al igual que lo anterior, excepto en el lado remoto, your_shell -c "command args ..."se ejecutará. Como se indicó anteriormente, si escribe Ctrl-C, se enviará al host remoto, donde el comando probablemente recibirá SIGINT e inmediatamente saldrá, y luego el shell remoto saldrá. sshdLuego, el control remoto cierra la conexión e sshinformaConnection to remotehost closed.

  • ssh remotehost command args ...ejecutará una sesión no interactiva el remotehost. En el lado del cliente, sshserá no establecer el TTY a modo raw (bueno, excepto para leer en una contraseña o frase de contraseña). Si escribe Ctrl-C, sshse enviará SIGINT y se terminará inmediatamente, sin siquiera emitir un Connection to remotehost closedmensaje.

    Los your_shell -c "command args ..."procesos probablemente seguirán ejecutándose en el host remoto . O saldrán solos, o un proceso intentará escribir datos en el socket ssh ahora cerrado, lo que hará que se le envíe una señal SIGPIPE (típicamente) fatal.

Mark Plotnick
fuente
1
Técnicamente, el comando remoto no escribe directamente en el socket. Su stdout es una tubería. Y sshd en el otro extremo lee los datos, los cifra y los envía a través del socket. Sin embargo, el resultado final es el mismo. El comando obtendrá un sigpipe porque esa tubería desaparece cuando el cliente se desconecta.
Stéphane Chazelas
@ StéphaneChazelas Gracias, editaré la respuesta para corregirla.
Mark Plotnick