web-dev-qa-db-fra.com

Comment exécuter la commande ssh jusqu'à ce qu'elle réussisse?

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?

31
Philip Kirkbride

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
}
33
Hunter.S.Thompson
ssh [email protected]
until !!; do sleep 5 ; done

Le !! pour répéter la dernière commande.

18
GAD3R

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.

17
David Foerster
while ! ssh [email protected] true; do
    sleep 5
done; echo "Host is back up at $(date)!"
14
DopeGhoti

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.

4
Nobody

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
2
roaima