bash - configurar - ssh protocolo
¿Cómo hacer que ssh mate el proceso remoto cuando interrumpo el ssh? (4)
En un script bash, ejecuto un comando en una máquina remota a través de ssh. Si el usuario rompe el script presionando Ctrl + C, solo detiene el script, ni siquiera el cliente ssh. Además, incluso si elimino el cliente ssh, el comando remoto aún se está ejecutando ...
¿Cómo se puede hacer que bash mate el cliente ssh local y la invocación remota de comandos en Crtl + c?
Un simple script:
#/bin/bash
ssh -n -x root@db-host ''mysqldump db'' -r file.sql
trap "some_command" SIGINT
ejecutará some_command
localmente cuando presione Ctrl + C. help trap
le informará sobre sus otras opciones.
En cuanto al problema ssh
, no sé mucho sobre ssh. Tal vez puedas hacer que llame a ssh -n -x root@db-host ''killall mysqldump''
lugar de some_command
para matar el comando remoto?
¿Sabes lo que hacen las opciones que estás pasando a ssh? Supongo que no. La opción -n redirige la entrada de / dev / null, por lo que el proceso que está ejecutando en el host remoto probablemente no vea SIGINT desde Ctrl-C.
Ahora, hablemos de cuán mala idea es permitir inicios de sesión de raíz remotos:
Es una muy mala idea. Eche un vistazo a HOWTO: configure las claves ssh para obtener algunas sugerencias sobre cómo administrar de forma segura la ejecución remota de procesos a través de ssh. Si necesita ejecutar algo con privilegios de forma remota, probablemente querrá una solución que implique una clave pública ssh con un comando incrustado y una secuencia de comandos que se ejecute como raíz cortesía de sudo.
Eventualmente encontré una solución como esa:
#/bin/bash
ssh -t -x root@db-host ''mysqldump db'' -r file.sql
Entonces, uso ''-t'' en lugar de ''-n''. Eliminar "-n", o usar un usuario diferente de la raíz no ayuda.
Cuando finalice su sesión ssh, su shell obtendrá un SIGHUP. (señal de cuelgue). Debe asegurarse de que lo envíe a todos los procesos iniciados desde allí. Para bash, prueba shopt -s huponexit; your_command
shopt -s huponexit; your_command
Puede que eso no funcione, porque la página del manual dice que huponexit solo funciona para shells interactivos.
Recuerdo haber topado con esto con usuarios que ejecutaban trabajos en mi clúster, y si tenían que usar nohup o no (para obtener el comportamiento opuesto al que desea) pero no puedo encontrar nada en la página bash man sobre si los procesos secundarios ignoran SIGHUP por defecto. Con suerte, huponexit hará el truco. (Podría poner ese shopt en su .bashrc, en lugar de en la línea de comandos, creo).
Sin embargo, su ssh -t
debería funcionar, ya que cuando la conexión se cierra, las lecturas del terminal obtendrán EOF o un error, y eso hace que la mayoría de los programas salgan.