Manejo de Ctrl-C en la sesión SSH

Pregunta:

Cuando inicio una sesión SSH que ejecuta un comando de larga ejecución, ¿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 obtiene el SIGINT primero: ¿es …

  1. el comando remoto de larga duración? es decir, (a) se llama al manejador de señales 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, por lo que 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 estar seguro.

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 , luego se interrumpe la conexión remota. ¿Hay alguna forma de ejecutar el comando remoto en un shell que permanecerá vivo después de Ctrl + C ? Es decir, en este caso, ¿detener el bucle y permitirme seguir trabajando en el shell remoto?

Respuesta:

ssh se puede invocar de diferentes formas, cada una de las cuales da como resultado un tratamiento ligeramente diferente de las señales iniciadas por el terminal como Ctrl-C .

  • ssh remotehost ejecutará una sesión interactiva en remotehost . En el lado del cliente, ssh intentará establecer el tty usado por stdin en modo "raw", y sshd en 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-C y Ctrl- \ ) se insertan en el flujo de entrada. ssh enviará dichos caracteres tal cual al host remoto, donde probablemente enviarán SIGINT o SIGQUIT y, por lo general, eliminarán cualquier comando y lo devolverán a un shell en el host remoto. La conexión ssh permanecerá activa, mientras el shell remoto esté activo.

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

  • ssh remotehost command args ... ejecutará una sesión no interactiva en remotehost . En el lado del cliente, ssh no configurará el tty en modo sin procesar (bueno, excepto para leer una contraseña o frase de contraseña). Si escribe Ctrl-C , ssh se enviará SIGINT y se terminará de inmediato, sin siquiera emitir un mensaje de Connection to remotehost closed .

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

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top

web tasarım