Scripter des commandes à distance : EXPECT

Trim

Cela faisait un moment que je cherchais un outil capable d'envoyer une liste de commande à distance.
La pupart du temps quand on souhaite envoyer des commandes à distance, on est confronté au problème du mot de passe.
En effet il faut entrer le mot de passe et cela empêche de pouvoir scripter à distance...


  A quoi sa sert

Dans le cadre du travail, j'ai dut scripter quelques petites lignes de commandes pour backuper tous mes switchs. ( plus de 80 !!)
Avant de connaitre la fameuse commande, je me tappais les switchs 1 par 1... et du coup moins souvent.

Depuis j'ai découvert la commande EXPECT



Le script:

Après avoir installé le paquet expect sur votre distribution Gnu/Linux préférée vous pouvez commencer.

#!/usr/bin/expect
#expect.sh
set username admin
set password motdepasse
set tftp 192.168.1.10
set switch [lrange $argv 0 0]
set switchname [lrange $argv 1 1]


set timeout 60
spawn ssh $username@$switch
sleep 2
send "$password\\n"
sleep 2
send "\\031"
sleep 2
send "save config\\n"
sleep 12
send "copy config tftp address $tftp filename $switch-$switchname.cc\\n"
sleep 10
send "copy running-config tftp address $tftp filename $switch-$switchname.ascii\\n"
sleep 2
send "exit\\n"
interact


Vous l'aurez compris, le script est ultra simple, il va envoyer des commandes en ssh directement au switch.
expect permet en fait d'enchainer des commandes comme si vous tappiez vous même sur le clavier.

Ce genre de bidouille n'a bien sur pas vraiment d'interêt sur un systeme qui peut directement executer des scripts, par contre cela prend tout son sens sur des systèmes figés comme des switchs, des routeurs, des bornes Wifi etc...
Pour info le send "\\031" correspond à un "Ctrl-Y" ( nécessaire pour se connecter sur des switchs Nortell)

Ce genre de script est utilisable dans de nombreuses situations !

Pour finir j'ai créer un autre script qui lance la commande précédente en boucle switch par switch.
#!/bin/bash
#backupswitchs.sh
#SWITCH1 192.168.1.1
#SWITCH2 192.168.1.2
#SWITCH3 192.168.1.3
#SWITCH4 192.168.1.4
#SWITCH5 192.168.1.5

SWITCHS=$(cat /root/backupswitchs.sh| grep "#" | grep "10." | awk '{print $2}')

for i in $SWITCHS
do
NAME=$(cat /root/backupswitchs.sh | grep -w $i | grep "#" | awk '{print $1}' | cut -d"#" -f2)
/root/expect.sh $i $NAME
done

Voilà, au final mes switchs sont backupés en TFP en binaire et en ascii :)

 
Vus : 1927
Publié par Bartounet : 24