Il est important d’avoir une sauvegarde des équipements régulière afin de pouvoir intervenir rapidement et remettre en fonction un équipement.
Ci-dessous un script "Except" qui se connecte à l'équipement "Firewall Fortinet et Switch Aruba" en SSH et exécute les commandes à votre place pour effectuer une sauvegarde et envoyer le fichier vers un serveur FTP ou TFTP.
" Expect est un langage de scripting créé par Don Libes comme extension au langage Tcl.
Il permet de simuler des sessions interactives avec par exemple SSH, Telnet, ou autres programmes qui nécessitent une intervention humaine.
Expect n’est pas à proprement parler un langage de programmation, il n’est donc pas nécessaire d’avoir d’importantes notions de programmation pour pouvoir créer des scripts d’automatisation.
Afin de scripter correctement via ce langage, il est important de connaitre les retours possibles de l’application afin de les « attendre » (expect) et d’agir en fonction de ces retours.
En fonction de ces retours, on envoie telle ou telle commande."
Procédure réalisée sur Debian 10.6.
Prérequis : sudo apt install expect
Créer un dossier "script_sauvegarde" qui comportera 4 éléments :
iplist.txt (fichier)
script.sh (fichier)
start.sh (fichier)
log (dossier)
Taper les commandes suivantes afin de rendre les fichiers .sh exécutable :
chmod +x script.sh
chmod +x start.sh
Éditer le fichier start.sh et coller le texte suivant :
#!/bin/bash
#On définit la variable de répertoire de travail
WORKING_DIRECTORY=/usr/local/bin/script_sauvegarde
#Le fichier qui comporte les équipements à sauvegarder
FILE=iplist.txt
#Le script de sauvegarde
SCRIPT=script.sh
#Pour chaque ligne du fichier iplist.txt, on lit les deux champs et on les sépare par des « pipe »
for LINE in `cat $WORKING_DIRECTORY/$FILE | awk '{print $1 "|" $2 }'`
do {
#Pour chacune des lignes, la variable "ip" est l’adresse IP de l'équipement, c’est le 1er champ du fichier
ip=`echo $LINE | awk -F'|' '{ print $1}'`;
#La variable hostname est le nom du firewall, c’est le 2ème champ du fichier.
hostname=`echo $LINE | awk -F'|' '{ print $2}'`;
#On lance le script avec les deux paramètres.
$WORKING_DIRECTORY/$SCRIPT $ip $hostname;
#On a commenté cette ligne qui n’affiche que les deux paramètres, si nécessaire, on peut la dé-commenter pour voir comment est traité le fichier.
# echo $ip $hostname
}
done
Éditer le fichier script.sh et coller le texte suivant pour un Firewall "Fortinet" :
#!/usr/bin/expect -f
#On définit la variable ip 1er paramètre de start.sh et hostname 2ème paramètre de start.sh
set ip [lindex $argv 0]
set hostname [lindex $argv 1]
set timeout 15
#Le répertoire de log
set logdir /usr/local/bin/script_sauvegarde/log
#La date au format AAAA-MM-JJ
set DATE [exec date +%Y-%m-%d]
#Le script logue le contenu de la session interactive dans le fichier « results.log.AAAA-MM-JJ »
log_file -a $logdir/results.log.$DATE
#On annonce les informations de l'équipement sur laquelle on est connecté, ceci afin que le fichier de log soit plus lisible.
send_user "\n"
send_user ">>>>> Ouverture connexion sur $hostname - $ip @ [exec date] <<<<<\n"
send_user "\n"
#On lance une session ssh vers l'équipement avec le compte admin ou un compte AD.
spawn ssh admin@$ip
#On attend un retour qui peut être "quelquechose)?", si on ne s’est jamais connecté (validation clé RSA) . On répond yes puis « Entrée ».
expect {
")?" { send "yes\r" ; exp_continue }
#La demande de mot de passe, on l’envoie.
"assword:" { send "Password\r" }
#Si aucun des cas précédents ne s’est présenté, c’est que la connexion ssh n’a pas abouti au bout de 20 secondes, on affiche le message, et on quitte le script Expect.
timeout { send_user "Erreur|$hostname|$ip|Connexion SSH impossible\n" ; exit }
}
#On exécute les commandes et à chaque fois on attend le prompt # avant de lancer la commande suivante.
expect "#"
send "config global\r"
expect "#"
send "execute backup full-config ftp Sauvegardes/Firewall/FW-$hostname-$DATE.cfg IP_SERVEUR_FTP:21 login_ftp pass_ftp\r"
expect "#"
send "end\r"
expect "#"
send "quit\r"
#Annonce fermeture de connexion
send_user "\n"
send_user ">>>>> Fermeture connection sur $hostname - $ip @ [exec date] <<<<<\n"
send_user "\n"
exit
Éditer le fichier script.sh et coller le texte suivant pour un Switch "Aruba" :
#!/usr/bin/expect -f
#On définit la variable ip 1er paramètre de start.sh et hostname 2ème paramètre de start.sh
set ip [lindex $argv 0]
set hostname [lindex $argv 1]
set timeout 15
#Le répertoire de log
set logdir /usr/local/bin/script_sauvegarde/log
#La date au format AAAA-MM-JJ
set DATE [exec date +%Y-%m-%d]
#Le script logue le contenu de la session interactive dans le fichier « results.log.AAAA-MM-JJ »
log_file -a $logdir/results.log.$DATE
#On annonce les informations de l'équipement sur laquelle on est connecté, ceci afin que le fichier de log soit plus lisible.
send_user "\n"
send_user ">>>>> Ouverture connexion sur $hostname - $ip @ [exec date] <<<<<\n"
send_user "\n"
#On lance une session ssh vers l'équipement avec le compte admin ou un compte AD.
spawn ssh admin@$ip
#On attend un retour qui peut être "quelquechose)?", si on ne s’est jamais connecté (validation clé RSA) . On répond yes puis « Entrée ».
expect {
")?" { send "yes\r" ; exp_continue }
#La demande de mot de passe, on l’envoie.
"assword:" { send "Password\r" }
#Si aucun des cas précédents ne s’est présenté, c’est que la connexion ssh n’a pas abouti au bout de 20 secondes, on affiche le message, et on quitte le script Expect.
timeout { send_user "Erreur|$hostname|$ip|Connexion SSH impossible\n" ; exit }
}
#On exécute les commandes et à chaque fois on attend le prompt # avant de lancer la commande suivante.
expect "continue "
send "\r"
expect "#"
send "system-view\r"
expect "#"
send "tftp client\r"
expect "#"
send "end\r"
expect "#"
send "copy running-config tftp IP_SERVEUR_TFTP SW-$hostname-$DATE.cfg\r"
expect "#"
send "quit\r"
expect "#"
send "quit\r"
expect ")?"
send "y\r"
#Annonce fermeture de connexion
send_user "\n"
send_user ">>>>> Fermeture connection sur $hostname - $ip @ [exec date] <<<<<\n"
send_user "\n"
exit
Éditer le fichier iplist.txt et ajouter les adresses IP et les noms des équipements comme ceci :
192.168.10.1 Switch_1
192.168.10.2 Switch_2
192.168.10.3 Switch_3
192.168.10.254 Firewall
Si vous rencontrez une erreur au niveau des clés RSA modifier la ligne suivante :
spawn ssh admin@$ip
par
spawn ssh -c aes128-ctr,aes192-ctr,aes256-ctr,aes128-cbc,3des-cbc admin@$ip