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
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
4 octobre 2014, 10:49, par christelle
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
4 octobre 2014, 13:48, par Robert
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 ?
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 ..
Si vous avez encore des problèmes d’accès ou de mot de passe :
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 ...