Comando Linux para esperar que um servidor SSH esteja ativo

6

Eu tenho um script que cria uma máquina virtual e me devolve um endereço IP. Então eu gostaria de fazer algo assim:

waitforssh 192.168.2.38 && ssh 192.168.2.38

E ele vai esperar que a máquina esteja ativa e o ssh esteja respondendo, então ssh dentro dela.

waitforssh é o comando que preciso encontrar.

O nmap, o netcat, o fping ou o ping funcionariam? Eu tentei netcat mas desiste em apenas alguns segundos, se o host está inacessível.

Ele precisa lidar com o fato de que a própria máquina está inicializando e pode levar algum tempo para responder aos pacotes de rede.

    
por Weboide 19.06.2010 / 18:13

4 respostas

9

Eu não tenho um host que eu possa usar e controlar se está ativado ou não, mas isso deve funcionar:

while ! ssh <ip>
do
    echo "Trying again..."
done

Ou um script de shell mais explícito:

#!/bin/sh

ssh $1
while test $? -gt 0
do
   sleep 5 # highly recommended - if it's in your local network, it can try an awful lot pretty quick...
   echo "Trying again..."
   ssh $1
done

Salve-o como (digamos) waitforssh.sh e, em seguida, chame-o com sh waitforssh.sh 192.168.2.38

    
por 19.06.2010 / 18:21
1

O comando ssh pode receber um comando para executar na máquina remota como o último parâmetro. Então, chame ssh $MACHINE echo em um loop. No sucesso, ele retorna 0 em $ ?, na falha 255. É claro que você deve usar a autenticação sem senha com certificados.

    
por 19.06.2010 / 18:21
1

Bem, não tenho certeza do que você quer dizer com estar em , mas e:

$ ping host.com | grep --line-buffered "bytes from" | head -1 && ssh host.com

O primeiro comando ping | ... | head -1 aguarda que o servidor envie uma única resposta ping e exista. Então o ssh entra em jogo. Esteja ciente de que grep pode armazenar em buffer a saída, então é para isso que o --line-buffered é válido.

Você pode envolver este comando com a função bash para usá-lo exatamente da maneira que você descreveu.

$ waitfor() { ping $1 | grep --line-buffered "bytes from" | head -1 }
$ waitfor server.com && ssh server.com
    
por 16.01.2015 / 07:13
0
function hurryup () { 
    until ssh -o ConnectTimeout=2 "$1"@"$2"
        do sleep 1
    done
}
hurryup root "10.10.0.3"

-o ConnectTimeout=2 é uma maneira um pouco hacky de se locomover, não respondendo a pacotes de rede, reportando ssh: connect to host 10.10.0.3 port 22: Operation timed out até que seja responsivo.

Então, quando o host responder aos pacotes de rede, o segundo que durar acontecerá entre ssh: connect to host 10.10.0.3 port 22: Connection refused enquanto esperamos que o ssh apareça.

    
por 24.08.2018 / 01:45