Script de relance automatique du serveur SSH

Lorsque l’on administre un serveur à distance sans accès physique sur la machine, bien souvent, l’accès au serveur tient à un fil : celui du SSH. Si, pour une raison ou une autre, le serveur SSH s’arrête… les ennuis commencent pour l’administrateur et les utilisateurs.

Même si les connexions SSH actives ne sont pas interrompues lors de l’arrêt du serveur (à condition de ne pas tout stopper avec un killall !), il suffit d’un peu de malchance pour que celles-ci le soient : un plantage de votre système, une coupure électrique, une déconnexion de votre FAI juste après l’arrêt du serveur SSH et vous voilà coincé à la porte de votre serveur distant.

Pour éviter cela, j’ai imaginé un script qui vérifierait régulièrement l’état du serveur SSH et le relancerait si besoin, avec restauration d’une sauvegarde du fichier sshd_config en cas d’échec lors du redémarrage. Ce script est évidemment à placer dans la crontab d’un utilisateur ayant les droits requis pour travailler dans le répertoire de configuration de SSH et redémarrer le service… c’est à dire root, pour faire simple.

Attention :

- Vérifiez bien votre configuration pour les variables déclarées en entête du fichier. Par exemple, le service se nomme « ssh » sur Debian / Ubuntu, et « sshd » sur Red Hat / Fedora.

- Testez le script sur un environnement de test dans un premier temps, pour éviter de faire des erreurs sur un environnement de production.

#!/bin/bash
 
n_service="ssh"                      # Nom du service
f_exe="/usr/sbin/sshd"               # Exécutable du service
f_origine="/etc/ssh/sshd_config"     # Fichier de configuration actuelle
f_secours="/var/scripts/sshd_config" # Sauvegarde de la configuration
f_log="/var/log/restart_ssh"         # Fichier de log
 
now="$(date +%d/%m/%Y' - '%H:%M)"    # Date et heure pour le log
 
if ! ps ax | grep $f_exe | grep -v grep &> /dev/null
then
        /etc/init.d/$n_service start &> /dev/null
        if ps ax | grep $f_exe | grep -v grep &> /dev/null
        then
                echo "[$now] $n_service redémarré automatiquement" >> $f_log
        else
                rm $f_origine
                cp $f_secours $f_origine
                /etc/init.d/$n_service start &> /dev/null
                if ps ax | grep $f_exe | grep -v grep &> /dev/null
                then
                        echo "[$now] $n_service redémarré après restauration" >> $f_log
                else
                        echo "[$now] $n_service arrêté, restauration inefficace" >> $f_log
                fi
        fi
fi

Crontab root (à adapter selon vos souhaits, ici un lancement du script toutes les minutes) :

#       minute (de 0 à 59)
 
#       |       heure (de 0 à 23)
 
#       |       |       jour (de 1 à 31)
 
#       |       |       |       mois (de 1 à 12)
 
#       |       |       |       |       jour de la semaine (de 0 à 6, 0 = dimanche)
 
#       |       |       |       |       |       commande
 
        */1     *       *       *       *       /bin/bash /var/scripts/restart_ssh.sh


Laisser un commentaire

Votre commentaire