2011-02-08 2 views
113

Sto eseguendo uno script che si collega tramite SSH senza password su un host remoto. Voglio impostare un timeout, in modo che se l'host remoto sta prendendo un tempo infinito per correre, voglio uscire da quella sessione ssh e continuare altre righe nel mio script sh.Come si fa a ssh con un timeout in uno script?

Qualche idea su come farlo?

+0

Questo dovrebbe probabilmente essere chiuso per essere in linea con la chiusura di un duplicato completo di questa [come ridurre il valore di timeout della connessione ssh \ [chiuso \]] (https://stackoverflow.com/questions/18389367/how-to-decrease-ssh-connection-timeout-value) – Murmel

+0

Se si è reindirizzati qui solo a * " rimanere più tempo nella sessione 'ssh'" * (domanda "Come aumentare il timeout della connessione SSH?"), questo è il ** posto sbagliato **. La risposta è a [questo link su ssh-timeout] (https://bjornjohansen.no/ssh-timeout). –

risposta

190
ssh -o ConnectTimeout=10 <hostName> 

Dove 10 è il tempo in secondi.

+4

ConnectTimeout imposta solo un timeout sulla configurazione della connessione, giusto? –

+0

Sì .___________ – johndodo

+4

Questo non funziona per "l'host remoto sta impiegando un tempo infinito per eseguire": "ssh -o ConnectTimeout = 5 host 'sleep 10'" attende per 10 secondi, non 5. –

-8

come sull'utilizzo di questo comando nel ciclo

set timeout -1 
+0

Puoi darmi maggiori informazioni su come impostare il timeout se lo uso in un loop .. lo script viene eseguito su un host remoto – user57421

0

Beh, si potrebbe utilizzare nohup per eseguire tutto ciò che è in esecuzione su 'modalità non-blocking'. Quindi puoi continuare a controllare se qualunque cosa doveva funzionare, correre, altrimenti uscire.

 
nohup ./my-script-that-may-take-long-to-finish.sh & 
./check-if-previous-script-ran-or-exit.sh 
 

echo "Script ended on Feb 15, 2011, 9:20AM" > /tmp/done.txt 

Così nel secondo basta controllare se il file esiste.

+0

Ha senso. ma, lo script che è in esecuzione mi dà un po 'di output, che viene visualizzato sulla console .. come controllare se il mio script precedente è stato eseguito o chiuso? $? o qualsiasi altra cosa ? – user57421

+0

Benché si possa fare in modo che lo script crei un file una volta terminato. Ho aggiunto il commento alla risposta .... grrr – Eduardo

84

Utilizzare -o ConnectTimeout e -o BatchMode=yes -o StrictHostKeyChecking=no.

ConnectTimeout mantiene lo script da appendere, BatchMode mantiene da appendere con Host sconosciuto, YES per aggiungere known_hosts, e StrictHostKeyChecking aggiunge l'impronta digitale automaticamente.

**** NOTA **** Il "StrictHostKeyChecking" era destinato esclusivamente alle reti interne in cui ci si fida degli host. A seconda della versione del client SSH, "Sei sicuro di voler aggiungere la tua impronta digitale" può causare il blocco del client per un tempo indefinito (principalmente vecchie versioni in esecuzione su AIX). La maggior parte delle versioni moderne non soffre di questo problema. Se devi gestire le impronte digitali con più host, ti consiglio di mantenere il file known_hosts con una sorta di strumento di gestione della configurazione come puppet/ansible/chef/salt/etc.

+8

Non solo '-o StrictHostKeyChecking = no' non risolve la domanda, ma è una pessima idea se ti interessa la sicurezza, che potrebbe essere la ragione per cui stai usando SSH in primo luogo. – Dolph

+4

È opportuno sottolineare le possibili implicazioni di sicurezza di -o StrictHostKeyChecking = no. Tuttavia, impedirà che lo script si blocchi durante l'esecuzione. – Doug

+1

ATTENZIONE !!!! Come ha scritto @Dolph, NON usare 'StrictHostKeyChecking = no' se ci si preoccupa della sicurezza. @Doug: lo script non si blocca - insisterà solo che tu esegui manualmente l'accesso all'host remoto per la prima volta, in modo da conoscere l'host. Ma ti proteggerà dagli attacchi MITM. Si prega di modificare questa risposta per riflettere questo come è un consiglio molto pericoloso così com'è. E non è stato nemmeno chiesto. – johndodo

13

È inoltre possibile connettersi con flag

-o ServerAliveInterval=<secs>
in modo che il client SSH invii un pacchetto null al server ogni <secs> secondi, solo per mantenere attiva la connessione. In Linux questo potrebbe essere impostato anche a livello globale in /etc/ssh/ssh_config o per utente in ~/.ssh/config.

+1

Sembra il contrario di ciò che la domanda richiede. –

29

prova:

timeout 5 ssh [email protected] 

timeout esegue il comando ssh (con args) e invia un SIGTERM se ssh non ritorno dopo il 5 secondo. per maggiori dettagli su timeout, leggere questo documento: http://man7.org/linux/man-pages/man1/timeout.1.html

oppure è possibile utilizzare il parametro di ssh:

ssh -o ConnectTimeout=3 [email protected] 
+2

Se stai cercando questo comando su un Mac, prova 'brew install coreutils' e quindi usa' gtimeout' (fonte: http://stackoverflow.com/questions/3504945/timeout-command-on-mac-os- X). – larcher

+0

Questo potrebbe non fare quello che vuoi. Si consideri il comando 'timeout 3s ssh user @ server 'sleep 5; echo blarg >>/tmp/blarg'' Questo uccide il processo sul lato client SSH, ma/tmp/blarg viene comunque modificato sul server remoto. Ciò significa che se si sta eseguendo un lavoro intensivo della CPU su un server remoto, si verificheranno processi di perdita. –