Parfois, je redémarre un appareil et j'ai besoin de ssh
de retour quand il est prêt.
Je veux exécuter la commande ssh toutes les 5 secondes jusqu'à ce que la commande réussisse.
Ma première tentative:
watch -n5 ssh [email protected] && exit 1
Comment puis-je faire ceci?
Une autre option serait d'utiliser until
.
until ssh [email protected]; do
sleep 5
done
Si vous le faites à plusieurs reprises pour un certain nombre d'hôtes, mettez-le dans une fonction dans votre ~/.bashrc
.
repeat()
{
read -p "Enter the hostname or IP of your server :" servername
until ssh $servername; do
sleep 5
done
}
ssh [email protected]
until !!; do sleep 5 ; done
Le !!
pour répéter la dernière commande.
OpenSSH a un paramètre ConnectionAttempts
qui fait presque ce que vous voulez. La valeur par défaut est 1 mais vous pouvez la modifier dans ssh_config
ou sur la ligne de commande:
ssh -o 'ConnectionAttempts 10' ...
Malheureusement, vous ne pouvez pas ajuster l'intervalle de tentative qui est fixé à 1 seconde, mais vous pouvez régler le délai d'expiration de la tentative de connexion ConnectTimeout
(en secondes) de la même manière.
while ! ssh [email protected] true; do
sleep 5
done; echo "Host is back up at $(date)!"
autossh
maintient les sessions ssh actives. Avec les bons paramètres, vous pouvez également le lancer lorsqu'il est actuellement impossible de se connecter et il essaiera jusqu'à ce qu'il réussisse. Cela fonctionne très bien, mais si vous voulez que la partie re connect fonctionne correctement avec les sessions interactives, vous devrez la combiner avec screen
ou équivalent.
Je recommande ceci:
AUTOSSH_POLL=5 AUTOSSH_GATETIME=0 autossh -M 0 -o ServerAliveInterval=5 -o ServerAliveCountMax=1 user@Host
Mais consultez sa page de manuel pour plus de détails. Avec les paramètres ci-dessus, autossh
essaiera de lancer ssh tous les AUTOSSH_POLL
secondes, AUTOSSH_GATETIME=0
le fait réessayer si le premier essai échoue (donc définitivement ce que vous voulez), -M 0
désactive la vérification de connexion par autossh, toutes les options ultérieures sont passées à ssh. Les deux -o
les options font quitter ssh si les connexions tombent pendant plus de 5s.
Au risque de simplement lancer du code sur une réponse, ce script fonctionne pour moi au quotidien. Je l'appelle ressh
et il peut être utilisé aussi simplement que ressh {hostname}
, ou avec soin, ressh -S {session_name} {hostname}
#!/bin/bash
#
# Repeatedly attempt to reconnect to a remote ssh server
########################################################################
#
prefix="${0/*\/}"
port=
session=
action=ssh # How to connect remotely
while getopts 'l:Lp:P:S:' OPT
do
case "$OPT" in
l) [[ s == "$OPTARG" ]] && action=list ;;
L) action=list ;;
[Pp]) port="$OPTARG" ;;
S) session="$OPTARG";; ## ; [[ $session =~ ^[0-9]+$ ]] && session="${prefix}-$session" ;;
esac
done
shift $(($OPTIND - 1))
Host="$1"
shift
if [[ -z "$Host" ]]
then
echo "ERROR: Missing hostname" >&2
exit 1
fi
if [[ list == "$action" ]]
then
ssh ${port:+-p $port} "$Host" "screen -ls"
exit 0
fi
# Connect repeatedly to the target Host system
#
[[ -z "$session" ]] && session="${prefix}-$$.$Host"
while :
do
ssh -tt ${port:+-p $port} "$Host" "screen -dr $session || screen -S $session $*"
ss=$?
[[ 0 -eq $ss ]] && break
[[ 255 -eq $ss ]] && sleep 4
sleep 1
echo "Reconnecting to session $session on $Host..."
done
# All done
#
exit 0