Blog de Robert Sebille


Vers mon curriculum vitae - Conception

Accueil > Technique > Informatique > Shell bash > Tester si une connexion ssh est ouverte sur un serveur distant.

Robert Sebille

Tester si une connexion ssh est ouverte sur un serveur distant.

lundi 30 décembre 2013, par Robert

Il peut-être utile dans un script se connectant à un serveur distant via ssh, de vérifier avant l’exécution de la connexion, si celle-ci est possible.

Alors, voyons le man de ssh :

ssh [nombreuses options] [user@]hostname [command]

. . .
    -q      Quiet mode.  Causes most warning and diagnostic messages to be suppressed.
. . .
EXIT STATUS
    ssh exits with the exit status of the remote command or with 255 if an error occurred.

ssh -q remote.host-ssh-enabled-domain.tld <command> va exécuter "command" sur remote.host-ssh-enabled-domain.tld, puis se déconnecter (Cette déconnexion automatique est une des choses que l’on cherche pour faire un test de connexion).

- Si la connexion réussit, "command" va s’exécuter dans le shell distant (sur remote.host-ssh-enabled-domain.tld), puis renvoyer son code de retour sur le shell de la machine locale ayant initié la connexion ssh.
- Si la connexion échoue, c’est alors la commande ssh elle-même qui enverra son code de retour local : 255

On peut tester (en adaptant bien sur à une situation réelle) :

mamachine~ moi$ ssh -q remote.host-ssh-enabled-domain.tld echo > /dev/null
mamachine~ moi$ echo $?
0
mamachine~ moi$ ssh -q remote.host-ssh-enabled-domain.tld ls > /dev/null
mamachine~ moi$ echo $?
0
mamachine~ moi$ ssh -q remote.host-ssh-enabled-domain.tld azery > /dev/null
bash: azery: command not found
mamachine~ moi$ echo $?
127
mamachine~ moi$ ssh -q remote.host-ssh-disabled-domain.tld ls > /dev/null
mamachine~ moi$ echo $?
255

Bref, on détourne l’idée première de la ligne de commande de ssh, exécuter une commande sur un serveur, pour profiter de la déconnexion et surtout ici du code de retour.

Et le code de test ?

ssh -q remote.host-ssh-enabled-domain.tld echo > /dev/null
# On teste si la connexion a réussi
if [ "$?" == "255" ]
# si on veut tester si la commande a réussi:
# if [ "$?" != "0" ]
then
   echo "Connexion ssh impossible"
# si on teste si la réussite de la commande:
#    echo "Connexion ssh impossible ou échec de la commande"
else
   echo "Connexion ssh ouverte"
fi

Et les passphrases de connexion ?

Evidemment, si on fait un script d’automatisation, il vaut mieux éviter la demande de mot de passe de connexion. Cela peut se faire en créant une paire de clés privée/publique, et en exportant la clé publique sur le serveur à tester. Je vous renvoie à cet article particulièrement clair sur la procédure à suivre.

Et que devient le code de test ? Voici, par exemple :

ssh -q -i /home/moi/.ssh_test/cle_privee_test remote.host-ssh-enabled-domain.tld echo > /dev/null
# On teste si la connexion a réussi
if [ "$?" == "255" ]
then
   echo "Connexion ssh impossible"
else
   echo "Connexion ssh ouvert"
fi

Dans ce cas plus aucun mot de passe ne sera demandé.

Attention alors à votre clé privée sur votre machine locale, car c’est maintenant elle qui ouvre la serrure de l’accès ssh à votre serveur.

Messages

  • Bonjour
    Post tres interressant , mais je reste confrontée à un gros souci . Est -il possible d’avoir le code retour sans renseigner le mot de passe ?
    En fait je teste le Ok /KO des connexion ssh depuis un serveurs vers plusieurs autres et en cas de KO , je souhaiterai continuer le test sur les serveurs suivants de ma liste sans interuption du traitement qui me demande un mdp .
    voici mon script

    cat listedesserveurs.txt | while IFS= : read SERVEUR USER
    do
    #echo "SERVEUR : $SERVEUR USER : $USER"

    /usr/bin/ssh -n -o StrictHostKeyChecking=no -q "$USER@$SERVEUR" "echo" > /dev/null

    if [ $ ? -eq 255 ]
    then
    echo "Connexion ssh impossible vers $SERVEUR"
    else
    echo "Connexion ssh ouverte sur $SERVEUR"
    fi
    done

    • Je vous recommande la méthode décrite ci-dessus : "créer une paire de clés privée/publique" (sans mot de passe), avec cet article qui décrit comment faire

      A ce moment, votre commande deviendrait :
      /usr/bin/ssh -n -i </home/moi/.ssh_test/cle_privee_test> -o StrictHostKeyChecking=no -q "$USER@$SERVEUR" "echo" > /dev/null
      où en général, moi/.ssh_test/cle_privee_test> sera /.ssh/id_rsa mais ça peut être un autre chemin et un autre nom, si vous avez plusieurs clés.

      Cependant, il faut aussi que les serveurs ssh de vos serveurs distants soient configurés pour accepter l’authentification par clé privée/publique, ce qui se fait via le fichier sshd_config en général dans /etc/ssh/ sous linux.

      En général (ça peut dépendre un peu des configurations), il faut mettre :

      PubkeyAuthentication        yes
      UsePAM  no

      (Profitez en si ce n’est fait pour mettre
      PermitRootLogin no
      avec yes, c’est une option dangereuse)

      Relancer ensuite le serveur ssh :
      service ssh restart

      Testez avec un serveur, puis quand ça marche reportez sur les autres ?
      Si vous avez encore des problèmes d’accès ou de mot de passe :
      - Vérifiez vos droits sur votre répertoire d’arrivée
      - Vérifiez les droits de la clé privée qui doit appartenir au user qui se connecte et avoir absolument les droits 600.
      - Vérifiez la configuration des serveurs ssh distants
      - Vérifiez les logs /var/log/auth.log sur le serveur distant ..

      Voici une doc (ubuntu) qui reprend aussi les aspects de configuration serveur :
      http://doc.ubuntu-fr.org/ssh, et renvoie aussi vers une page de configuration avancée.

      Attention enfin, que si vous créez une paire de clé sans mot de passe, c’est le user propriétaire de la clé qui détient la clé d’accès à vos serveurs ssh. Une session à ne pas laisser traîner ouverte et à protéger par un mot de passe fort.

      J’espère que ça vous aide ...

Un message, un commentaire ?

modération a priori

Ce forum est modéré a priori : votre contribution n’apparaîtra qu’après avoir été validée par un administrateur du site.

Qui êtes-vous ?
Votre message

Pour créer des paragraphes, laissez simplement des lignes vides.