Comment créer un script bash pour vérifier la connexion SSH?

Je suis en train de créer un script bash qui se connecterait aux machines distantes et créerait des clés privées et publiques.

Mon problème est que les machines distantes ne sont pas très fiables, et elles ne sont pas toujours en place. J’ai besoin d’un script bash qui vérifierait si la connexion SSH est active. Avant de créer les clés pour une utilisation future.

Vous pouvez vérifier cela avec la valeur de retour que ssh vous donne:

 $ ssh -q user@downhost exit $ echo $? 255 $ ssh -q user@uphost exit $ echo $? 0 

EDIT: Une autre approche serait d’utiliser nmap (vous n’aurez pas besoin de clés ou de login):

 $ a=`nmap uphost -PN -p ssh | grep open` $ b=`nmap downhost -PN -p ssh | grep open` $ echo $a 22/tcp open ssh $ echo $b (empty ssortingng) 

Mais vous devrez grep le message (nmap n’utilise pas la valeur de retour pour indiquer si un port a été filtré, fermé ou ouvert).

EDIT2:

Si vous êtes intéressé par l’état actuel du port ssh, vous pouvez remplacer grep open par egrep 'open|closed|filtered' :

 $ nmap host -PN -p ssh | egrep 'open|closed|filtered' 

Juste pour être complet.

 ssh -q -o "BatchMode=yes" -i /home/sicmapp/.ssh/id_rsa @. "echo 2>&1" && echo $host SSH_OK || echo $host SSH_NOK 

Vous pouvez utiliser quelque chose comme ça

 $(ssh -o BatchMode=yes -o ConnectTimeout=5 user@host echo ok 2>&1) 

Cela affichera “ok” si la connexion ssh est correcte

En complément de la réponse de @Adrià Cidre vous pouvez faire:

 status=$(ssh -o BatchMode=yes -o ConnectTimeout=5 user@host echo ok 2>&1) if [[ $status == ok ]] ; then echo auth ok, do something elif [[ $status == "Permission denied"* ]] ; then echo no_auth else echo other_error fi 

Essayer:

 echo quit | telnet IP 22 2>/dev/null | grep Connected 

Juste au cas où quelqu’un souhaiterait seulement vérifier si le port 22 est ouvert sur une machine distante, cette commande netcat simple est utile. Je l’ai utilisé car nmap et telnet n’étaient pas disponibles pour moi. De plus, ma configuration ssh utilise l’authentification par mot de passe du clavier.

C’est une variante de la solution proposée par GUESSWHOz.

 nc -q 0 -w 1 "${remote_ip}" 22 < /dev/null &> /dev/null && echo "Port is reachable" || echo "Port is unreachable" 

Si vous souhaitez vérifier qu’un dossier distant existe, ou tout autre test de fichier vraiment:

 if [ -n "$(ssh "${user}@${server}" [ -d "$folder" ] && echo 1; exit)" ]; then # exists else # doesn't exist fi 

N’oubliez pas les guillemets dans "$(ssh ...)" .

J’ai l’impression que vous essayez de résoudre le mauvais problème ici. Ne devriez-vous pas essayer de rendre les démons ssh plus stables? Essayez de lancer quelque chose comme monit , qui vérifiera si le démon est en cours d’exécution et le redémarre si ce n’est pas le cas (en vous laissant le temps de trouver le problème racine après la fermeture de sshd). Ou le service réseau est-il gênant? Essayez de regarder man ifup . Est-ce que le tout Damn Thing aime juste vous fermer? Eh bien, c’est un plus gros problème … essayez de consulter vos journaux (en commençant par syslog) pour trouver des pannes matérielles ou des services qui ferment votre boxen (peut-être un moniteur de température?).

Rendre vos scripts tolérants aux pannes est génial, mais vous pouvez également vouloir rendre votre boxen tolérant aux pannes.