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 ...
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
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?
ssh remote command
en oposición assh 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, usessh remote
.Respuestas:
ssh
se 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 remotehost
ejecutará una sesión interactiva elremotehost
. 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 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.
ssh
enviará 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 interactivaremotehost
, 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á.sshd
Luego, el control remoto cierra la conexión essh
informaConnection to remotehost closed.
ssh remotehost command args ...
ejecutará una sesión no interactiva elremotehost
. En el lado del cliente,ssh
será no establecer el TTY a modo raw (bueno, excepto para leer en una contraseña o frase de contraseña). Si escribe Ctrl-C,ssh
se enviará SIGINT y se terminará inmediatamente, sin siquiera emitir unConnection to remotehost closed
mensaje.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.fuente