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?
ssh -o ConnectTimeout=10 <hostName>
Où 10 est le temps en secondes.
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.
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
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
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.