Linux command d'attendre qu'un server SSH soit en place

J'ai un script qui crée une machine virtuelle et me renvoie une adresse IP. Ensuite, j'aimerais faire quelque chose comme ça:

waitforssh 192.168.2.38 && ssh 192.168.2.38 

Et il attendra que la machine soit en place et que ssh réponde, puis ssh.

waitforssh est la command que je dois find.

Est-ce que nmap, netcat, fping ou ping effectuera le travail? J'ai essayé netcat mais il abandonne en quelques secondes si l'hôte est inaccessible.

Il doit gérer le fait que la machine elle-même démarre et peut prendre un certain time pour répondre aux packages réseau.

Je n'ai pas d'hôte pour lequel je peux et je contrôle si cela fonctionne ou non, mais cela devrait fonctionner:

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

Ou un script shell qui est plus explicite:

 #!/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 

Enregistrez-le comme (par exemple) waitforssh.sh et appelez-le avec sh waitforssh.sh 192.168.2.38

La command ssh peut recevoir une command à effectuer sur la machine distante comme dernier paramètre. ssh $MACHINE echo donc ssh $MACHINE echo dans une boucle. En cas de succès, il renvoie 0 en $ ?, lors de l'échec 255. Vous devez bien sûr utiliser l'authentification sans parabole avec des certificates.

Eh bien, je ne suis pas sûr de ce que vous entendez pour être en place , mais qu'en est-il?

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

Première command ping | ... | head -1 ping | ... | head -1 ping | ... | head -1 attend que le server ait envoyé une réponse de ping unique et existe. Ensuite, ssh entre en jeu. Soyez conscient que grep peut tamponner la sortie, donc c'est ce que – --line-buffered est pour.

Vous pouvez envelopper cette command avec la fonction bash pour l'utiliser exactement comme vous l'avez décrit.

 $ waitfor() { ping $1 | grep --line-buffered "bytes from" | head -1 } $ waitfor server.com && ssh server.com