Question

Je suis en train de créer un script bash qui permettrait de se connecter aux ordinateurs distants et de créer des clés privées et publiques.

Mon problème est que les machines distantes ne sont pas très fiables et qu'elles ne sont pas toujours opérationnelles. J'ai besoin d'un script bash qui permettrait de vérifier si la connexion SSH est active. Avant de créer les clés pour une utilisation future.

Était-ce utile?

La solution

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 consisterait à utiliser nmap (vous n'avez pas besoin de clés ni de login-stuff):

$ 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 string)

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 l'état actuel du port ssh vous intéresse, vous pouvez remplacer grep open par egrep 'open | closed | filtré' :

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

Juste pour être complet.

Autres conseils

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

Vous pouvez utiliser quelque chose comme ceci

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

Ceci produira "ok". si la connexion ssh est ok

Complétant la réponse de @ Adrià Cidre , vous pouvez effectuer:

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

Essayez:

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

Juste au cas où quelqu'un voudrait seulement vérifier si le port 22 est ouvert sur une machine distante, cette simple commande netcat est utile. Je l'ai utilisé parce que 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 qu'un autre test de fichier existe réellement:

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

N'oubliez pas les guillemets dans "$ (ssh ...)" & <; code>.

Pour vous connecter à un serveur avec plusieurs interfaces

ssh -o ConnectTimeout=1 -q Necktwi@192.168.1.61;[ $? = 1 ] || ssh -o ConnectTimeout=1 -q Necktwi@192.168.1.51

Exemple d'utilisation du script BASH 4+:

# -- ip/host and res which is result of nmap (note must have nmap installed)
ip="192.168.0.1"
res=$(nmap ${ip} -PN -p ssh | grep open)

# -- if result contains open, we can reach ssh else assume failure) --
if [[ "${res}" =~ "open" ]] ;then
    echo "It's Open! Let's SSH to it.."
else
    echo "The host ${ip} is not accessible!"
fi

Je sens 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 d’exécuter quelque chose comme monit , qui vérifie si le démon est en cours d'exécution et le redémarre s'il ne l'est pas. t (vous donne le temps de trouver le problème fondamental derrière la fermeture de sshd). Ou le service réseau est-il gênant? Essayez de regarder man ifup . The Whole Damn Thing aime-t-il simplement vous arrêter? Eh bien, c’est un gros problème ... essayez de consulter vos journaux (commencez par syslog) pour rechercher les défaillances matérielles ou les services qui ferment votre boxen (peut-être un moniteur de température?).

Rendre vos scripts tolérants aux pannes est excellent, mais vous pouvez également vouloir rendre vos boxen tolérants aux fautes.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top