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 …
-
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
-
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 enremotehost
. En el lado del cliente,ssh
intentará establecer el tty usado por stdin en modo "raw", ysshd
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 enremotehost
, al igual que la anterior, excepto en el lado remoto, seyour_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, elsshd
remoto cierra la conexión yssh
informaConnection to remotehost closed.
-
ssh remotehost command args ...
ejecutará una sesión no interactiva enremotehost
. 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 deConnection 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.