Estoy ejecutando un script que se conecta a través de SSH sin contraseña en un host remoto. Quiero establecer un tiempo de espera, de modo que si el host remoto tarda un tiempo infinito en ejecutarse, quiero salir de esa sesión ssh y continuar otras líneas en mi script sh.
¿Alguna idea de cómo hacerlo?
ssh
sesión" (pregunta "¿Cómo aumentar el tiempo de espera de la conexión SSH?"), Este es el lugar equivocado . La respuesta está en este enlace sobre ssh-timeout .Respuestas:
Donde 10 es tiempo en segundos. Este tiempo de espera se aplica solo a la creación de la conexión.
fuente
Usa el
-o ConnectTimeout
y-o BatchMode=yes -o StrictHostKeyChecking=no
.ConnectTimeout evita que el script se cuelgue, BatchMode evita que se cuelgue con Host unknown, YES para agregar a known_hosts, y StrictHostKeyChecking agrega la huella digital automáticamente.
**** NOTA **** El "StrictHostKeyChecking" solo estaba destinado a redes internas en las que confía en sus hosts. Dependiendo de la versión del cliente SSH, el "¿Está seguro de que desea agregar su huella digital" puede hacer que el cliente se cuelgue indefinidamente (principalmente versiones antiguas que se ejecutan en AIX). La mayoría de las versiones modernas no sufren este problema. Si tiene que lidiar con huellas digitales con varios hosts, le recomiendo mantener el archivo known_hosts con algún tipo de herramienta de administración de configuración como puppet / ansible / chef / salt / etc.
fuente
-o StrictHostKeyChecking=no
no aborda la cuestión, sino que es una idea terrible si te preocupa la seguridad, que podría ser la razón por la que estás usando SSH en primer lugar.StrictHostKeyChecking=no
si le preocupa la seguridad. @Doug: el script no se bloqueará: solo insistirá en que envíe ssh al host remoto manualmente la primera vez, para que conozca el host. Pero te protegerá contra los ataques MITM. Edite esta respuesta para reflejar esto, ya que es un consejo muy peligroso tal como está. Y ni siquiera fue pedido.prueba esto:
timeout ejecuta el comando ssh (con args) y envía un SIGTERM si ssh no regresa después de 5 segundos. Para obtener más detalles sobre el tiempo de espera, lea este documento: http://man7.org/linux/man-pages/man1/timeout.1.html
o puedes usar el parámetro de ssh:
fuente
brew install coreutils
y luego usegtimeout
(fuente: stackoverflow.com/questions/3504945/timeout-command-on-mac-os-x ).timeout 3s ssh user@server 'sleep 5; echo blarg >> /tmp/blarg'
Esto mata el proceso en el lado del cliente SSH, pero / tmp / blarg aún se modifica en el servidor remoto. Esto significa que si está ejecutando un trabajo fuera de control intensivo de CPU en el servidor remoto, perderá los procesos.También puedes conectarte con la bandera
entonces el cliente SSH enviará un paquete nulo al servidor cada<secs>
segundo, solo para mantener viva la conexión. En Linux, esto también se puede configurar globalmente en/etc/ssh/ssh_config
o por usuario~/.ssh/config
.fuente
Si todo lo demás falla (incluso no tener el
timeout
comando), el concepto en este script de shell funcionará:fuente
Bueno, podría usar nohup para ejecutar lo que esté ejecutando en 'modo sin bloqueo'. Por lo tanto, puede seguir comprobando si lo que se suponía que debía ejecutarse, se ejecutó, de lo contrario, salga.
Entonces, en el segundo, simplemente verifica si el archivo existe.
fuente