web-dev-qa-db-fra.com

Comment faire ssh avec un délai d'attente dans un script?

J'exécute un script se connectant via un SSH sans mot de passe sur un hôte distant. Je souhaite définir un délai d'expiration afin que, si l'hôte distant prend un temps infini pour s'exécuter, je souhaite sortir de cette session ssh et poursuivre les autres lignes de mon script sh.

Une idée sur la façon de le faire?

146
user57421
ssh -o ConnectTimeout=10  <hostName>

Où 10 est le temps en secondes.

249
user57421

Utilisez le -o ConnectTimeout et -o BatchMode=yes -o StrictHostKeyChecking=no.

ConnectTimeout empêche le script de s'accrocher, BatchMode l'empêche de s'accrocher à l'hôte inconnu, OUI à ajouter à known_hosts et StrictHostKeyChecking ajoute l'empreinte digitale automatiquement.

**** NOTE **** Le "StrictHostKeyChecking" était uniquement destiné aux réseaux internes sur lesquels vous avez confiance. Selon la version du client SSH, l'option "Êtes-vous sûr de vouloir ajouter votre empreinte digitale" peut entraîner le blocage indéfini du client (principalement les anciennes versions exécutées sous AIX). La plupart des versions modernes ne souffrent pas de ce problème. Si vous devez gérer des empreintes digitales avec plusieurs hôtes, nous vous recommandons de conserver le fichier known_hosts avec un outil de gestion de la configuration tel que puppet/ansible/chef/salt/etc.

100
Doug

essaye ça:

timeout 5 ssh user@ip

timeout exécute la commande ssh (avec args) et envoie un SIGTERM si ssh ne revient pas après 5 secondes. pour plus de détails sur timeout, lisez ce document: http://man7.org/linux/man-pages/man1/timeout.1.html

ou vous pouvez utiliser le param de ssh:

ssh -o ConnectTimeout=3 user@ip
42
Lee HoYo

Si tout échoue (y compris en n'ayant pas la commande timeout), le concept de ce script Shell fonctionnera:

 #!/bin/bash
 set -u
 ssh $1 "sleep 10 ; uptime" > /tmp/outputfile 2>&1 & PIDssh=$!
 Count=0
 while test $Count -lt 5 && ps -p $PIDssh > /dev/null
 do
    echo -n .
    sleep 1
    Count=$((Count+1))
 done
 echo ""

 if ps -p $PIDssh > /dev/null
 then
    echo "ssh still running, killing it"
    kill -HUP $PIDssh
 else
    echo "Exited"
 fi
0
Philip Kearns

Eh bien, vous pouvez utiliser Nohup pour exécuter tout ce que vous exécutez en "mode non bloquant". Vous pouvez donc continuer à vérifier si tout ce qui était censé fonctionner est exécuté, sinon quittez.

 Nohup ./my-script-that-may-take-long-to-finish.sh &. ____.]
 
 echo "Le script s'est terminé le 15 février 2011 à 9 h 20" "> /tmp/done.txt

Donc, dans le second, il vous suffit de vérifier si le fichier existe.

0
Eduardo