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
