traduccion script example bash ssh

example - Terminar sesión SSH ejecutada por script bash



bash traduccion (4)

Tengo un script que puedo ejecutar localmente para iniciar un servidor de forma remota:

#!/bin/bash ssh [email protected] <<EOF nohup /path/to/run.sh & EOF echo ''done''

Después de ejecutar nohup, se cuelga. Tengo que presionar ctrl-c para salir del script.

He intentado agregar una salida explícita al final del documento aquí y usar el argumento "-t" para ssh. Ninguno de los dos funciona ¿Cómo hago que este script salga inmediatamente?

EDITAR: El cliente es OSX 10.6, el servidor es Ubuntu.


Creo que el problema es que nohup no puede redirigir la salida cuando vienes de ssh, solo redirige a nohup.out cuando cree que está conectada a un terminal, y la anulación estándar que tienes evitará eso, incluso con -t .

Una solución alternativa podría ser redirigir la salida usted mismo, entonces el cliente ssh puede desconectarse, no está esperando a que se cierre la transmisión. Algo como:

nohup /path/to/run.sh > run.log &

(Esto me funcionó en una prueba simple conectándome a un servidor Ubuntu desde un cliente OS X).


El problema podría ser que ...

... ssh is respecting the POSIX standard when not closing the session if a process is still attached to the tty.

Por lo tanto, una solución podría ser separar el stdin del comando nohup del tty:

nohup /path/to/run.sh </dev/null &

Ver: SSH se cuelga en la salida al usar nohup

Otro enfoque más podría ser usar ssh -t -t para forzar la asignación pseudo-tty incluso si stdin no es un terminal.

man ssh | less -Ip ''multiple -t'' ssh -t -t [email protected] <<EOF nohup /path/to/run.sh & EOF

Ver: subshell BASH spawn para SSH y continuar con el flujo del programa


La redirección de la entrada estándar del host remoto desde un documento aquí mientras se invoca a ssh sin un comando explícito lleva al mensaje: el Pseudo-terminal will not be allocated because stdin is not a terminal.

Para evitar este mensaje, utilice el conmutador -T ssh para indicar al host remoto que no es necesario asignar un pseudo-terminal o especificar explícitamente un comando (como /bin/sh ) para que el host remoto ejecute los comandos proporcionados por El documento aquí.

Si se le da un comando explícito a ssh , el valor predeterminado es no proporcionar un shell de inicio de sesión en forma de pseudo-terminal, es decir, no habrá sesión de inicio de sesión normal cuando se especifique un comando (consulte man ssh ).

Sin un comando especificado para ssh , por otro lado, el valor predeterminado es crear un pseudo-tty para una sesión de inicio de sesión interactiva en el host remoto.

- ssh [email protected] <<EOF + ssh -T [email protected] <<EOF + ssh [email protected] /bin/bash <<EOF

Como regla general, ssh -t o incluso ssh -t -t solo deben usarse si hay comandos que esperan que stdin / stdout sea un terminal (como top o vim ) o si es necesario eliminar el shell remoto y su hijos cuando el comando ssh client finaliza la ejecución (ver: el comando ssh continúa inesperadamente en otro sistema después de que ssh termina ).

Por lo que puedo decir, la única manera de combinar un comando ssh que no asigna un pseudo-tty y un nohup que escriba en nohup.out en el host remoto es dejar que el comando nohup ejecute en un pseudo-terminal no creado por el mecanismo ssh . Esto se puede hacer con el comando de script , por ejemplo, y evitará el tcgetattr: Inappropriate ioctl for device .

#!/bin/bash ssh localhost /bin/sh <<EOF #0<&- script -q /dev/null nohup sleep 10 1>&- & #0<&- script -q -c "nohup sh -c ''date; sleep 10 1>&- &''" /dev/null # Linux 0<&- script -q /dev/null nohup sh -c ''date; sleep 10 1>&- &'' # FreeBSD, Mac OS X cat nohup.out exit 0 EOF echo ''done'' exit 0


Necesitas agregar una exit 0 al final.