Automatisation d’envoi de commandes sur routeurs Cisco en telnet avec « Expect »

Samuel Chevalley
5 octobre 2016

Dans l’exemple suivant, nous voulons automatiser un envoi de commande via Telnet qui nécessite d’être en mode « configuration » sur plusieurs routeurs Cisco. Pour ce faire, nous allons utiliser Expect qui est un outil d’automatisation de tâches Unix, pour des applications interactive comme ssh, telnet, ftp, passwd, fsck ou autre.

Le script présenté par la suite permet de créer un autre script sous Expect qui permettra lui d’enchaîner les commandes sur les équipements voulus.

Prérequis :
– Créer un fichier nommé « liste » dans lequel sera listé les IP ou nom des équipements
– Créer un fichier nommé « commande » dans lequel sera listé les commandes à envoyer aux équipements

Dans le même dossier, créer un fichier avec le script ci-dessous :

#!/bin/bash
 
echo "veuillez donner le mot de passe RO"
stty -echo
read passwordRO
stty echo
echo "veuillez donner le mot de passe Enable"
stty -echo
read passwordRW
stty echo
 
 
liste=./liste
commande=./commande
 
rm -f telnet_cisco.sh &2>/dev/null
 
echo -e "Génération du fichier telnet_cisco.sh\n"
touch telnet_cisco.sh
echo '#!/usr/bin/expect -f' > telnet_cisco.sh
 
 
for i in `cat $liste`
do
        cat >> telnet_cisco.sh << EOF 
spawn telnet $i 
expect "Password:" 
send "${passwordRO}\r" 
send "enable\r" 
expect "Password:" 
send "${passwordRW}\r" 
expect "#" 
send "conf t\r" 
expect "#" 
EOF 
 
cat $commande | while read line 
        do 
                echo "send \"${line}\r\"" >> telnet_cisco.sh
                echo "expect \"#\"" >> telnet_cisco.sh
        done
 
        cat >> telnet_cisco.sh << EOF
send "exit\r"
expect "closed"
EOF
 
        echo -e "$i OK"
done
chmod u+x telnet_cisco.sh

Ce script permet de se connecter en telnet aux équipements, de rentrer en mode « enable » puis « configure terminal » afin de modifier de la conf.
 
Imaginons que :
commande = ip tftp source-interface vlan 55
liste = switch1
switch2
switch3
passwordRO = toto
passwordRW = tata
 
Le script Expect généré sera :

#!/usr/bin/expect -f
spawn telnet switch1
expect "Password:"
send "toto\r"
send "enable\r"
expect "Password:"
send "tata\r"
expect "#"
send "conf t\r"
expect "#"
send "ip tftp source-interface vlan 55\r"
expect "#"
send "exit\r"
expect "closed"
spawn telnet switch2
expect "Password:"
send "toto\r"
send "enable\r"
expect "Password:"
send "tata\r"
expect "#"
send "conf t\r"
expect "#"
send "ip tftp source-interface vlan 55\r"
expect "#"
send "exit\r"
expect "closed"
spawn telnet switch3
expect "Password:"
send "toto\r"
send "enable\r"
expect "Password:"
send "tata\r"
expect "#"
send "conf t\r"
expect "#"
send "ip tftp source-interface vlan 55\r"
expect "#"
send "exit\r"
expect "closed"

Il ne restera plus qu’à exécuter ce script qui réalisera les actions.