Cuando inicio una sesión SSH que ejecuta un comando de ejecución prolongada, ¿qué sucede con Ctrl? +C (SIGINT) manejo?
Puedo ver que la sesión de SSH está cerrada, pero no estoy seguro de quién obtiene el SIGINT primero:es…
-
el comando remoto de larga ejecución? es decir, (a) se llama al controlador de señal en el comando remoto y detiene el comando remoto, (b) el shell que lo 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 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 , luego se interrumpe la conexión remota. ¿Hay alguna manera de ejecutar el comando remoto bajo un shell que permanecerá activo después de Ctrl? +C ? Es decir, en este caso, ¿detener el ciclo y permitirme seguir trabajando en el shell remoto?
Respuesta aceptada:
ssh
se puede invocar de diferentes maneras, 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 utilizado por stdin en modo "sin procesar", 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 procesar significa que los caracteres que normalmente enviarían señales (como Ctrl-C y Ctrl- ) en su lugar, simplemente se insertan en el flujo de entrada.
ssh
enviará dichos caracteres tal 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 enremotehost
, igual que el anterior, excepto en el lado remoto,your_shell -c "command args ..."
se ejecutará. Como arriba, si escribe Ctrl-C , se enviará al host remoto, donde el comando probablemente recibirá SIGINT e inmediatamente saldrá, y luego se cerrará el shell remoto. Elsshd
remoto luego 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 configure 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 cancelará de inmediato, sin siquiera emitir unaConnection to remotehost closed
mensaje.El
your_shell -c "command args ..."
los 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 provocará que se le envíe una señal SIGPIPE (típicamente) fatal.