Como executar o comando ssh até ter sucesso?

26

Às vezes, reinicio um dispositivo e preciso recuperar ssh quando estiver pronto.

Eu quero executar o comando ssh a cada 5 segundos até que o comando seja bem-sucedido.

Minha primeira tentativa:

watch -n5 ssh [email protected] && exit 1

Como posso fazer isso?

    
por Philip Kirkbride 15.11.2017 / 18:37

6 respostas

27

Outra opção seria usar until .

until ssh [email protected]; do
    sleep 5
done

Se você fizer isso repetidamente para vários hosts, coloque-o em uma função em ~/.bashrc .

repeat()
{
read -p "Enter the hostname or IP of your server :" servername
until ssh $servername; do
    sleep 5
done
}
    
por 15.11.2017 / 18:45
17
ssh [email protected]
until !!; do sleep 5 ; done

O !! para repetir o último comando.

    
por 15.11.2017 / 21:05
13

O OpenSSH tem uma configuração de ConnectionAttempts que faz quase o que você deseja. O padrão é 1, mas você pode alterá-lo em ssh_config ou na linha de comando:

ssh -o 'ConnectionAttempts 10' ...

Infelizmente, não é possível ajustar o intervalo de tentativas que é fixado em 1 segundo, mas você pode ajustar o tempo limite da tentativa de conexão em ConnectTimeout (em segundos) da mesma maneira.

    
por 16.11.2017 / 01:06
13
while ! ssh [email protected] true; do
    sleep 5
done; echo "Host is back up at $(date)!"
    
por 15.11.2017 / 18:42
4

autossh mantém as sessões do ssh ativas. Com os parâmetros certos, você também pode iniciá-lo quando é impossível conectar-se e tentará até que seja bem-sucedido. Isso funciona bem, mas se você quiser que a parte de conexão re funcione bem com sessões interativas, será necessário combiná-la com screen ou equivalente.

Eu recomendo isso:

AUTOSSH_POLL=5 AUTOSSH_GATETIME=0 autossh -M 0 -o ServerAliveInterval=5 -o ServerAliveCountMax=1 user@host

Mas veja a sua página de manual para detalhes. Com os parâmetros acima, autossh tentará iniciar ssh a cada AUTOSSH_POLL segundos, AUTOSSH_GATETIME=0 faz com que tente novamente se a primeira tentativa falhar (então definitivamente o que você quer), -M 0 desabilita verificação de conexão por autossh, todas as opções posteriores são passados para o ssh. As duas opções -o fazem o ssh sair se as conexões caírem por mais de 5s.

    
por 16.11.2017 / 22:04
2

Correndo o risco de lançar código em uma resposta, esse script funciona para mim diariamente. Eu chamo de ressh e pode ser usado simplesmente como ressh {hostname} , ou com cuidado, 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
    
por 16.11.2017 / 23:50