Info16.fr

Le blog de B@rtounet

#Gnu/Linux, Planet Libre

Scripter des commandes à distance : EXPECT

25 octobre 2013 Rédigé par bartounet

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 :)

 

Information sur bartounet auteur de l'article

7 commentaires

#1 

Bonjour,
Tu peux encore simplifier cela en n'utilisant que ssh :
"ssh login@machineDistante bash < script.sh"
et avant cela pour tes histoires de mot de passe, tu peux l'outrepasser en faisant depuis ton serveur source vers chacun un "ssh-copy-id login@machineDistante" qui te demandera une seule fois le mot de passe distant et copiera la clé ssh locale sur le serveur.
néanmoins, je ne l'ai jamais testé sur un switch mais je pense que le protocole ssh étant présent, ça se tente. Commentaire de Votre Nom

Répondre

#2 

Merci.
Certains équipements ne gerent même pas le ssh
Expect gère aussi le telnet Commentaire de Votre Nom

Répondre

#3 

Salut,

C'est dommage d'utiliser le langage expect sans utiliser la commande "expect" qui remplace trèèèèèèèèèès avantageusement les "sleep".

ex:
spawn ssh $username@$switch
expect "password:"
send "$password\n"

Comme ça, si la durée qui précède le prompt de password excède le sleep, le script marche toujours. Et si la durée est inférieure le script gagne du temps à l'exécution.

;-) Commentaire de Votre Nom

Répondre

#4 

@Votre Nom :
Merci de l'info
Je vais tester ça Commentaire de bartounet

Répondre

#5 

C'est sur la même méthode que fonctionne rancid (http://www.shrubbery.net/rancid/) mais il gère de manière transparente les différents modèles d'équipements, peux exécuter la sauvegarde à une heure donnée et restaure d'autres infos utile.
Il fait même un versionning des modifications et peux gérer des mots de passe différents par équipements

Deux très bons articles sur ce point sont
- http://doc.ubuntu-fr.org/rancid
- http://alexnogard.com/backup-de-vos-switches-cisco-hp-juniper-2524-automatise-rancid/ Commentaire de Pierre

Répondre

#6 

Dommage de continuer à utiliser telnet, sinon fabric (http://fabfile.org/) aurait largement mieux fait l'affaire (j'en parle pour ceux qui n'auraient pas la même contrainte que toi). Commentaire de Votre Nom

Répondre

#7 

@Pierre :
Merci pour l'info je ne connaissais pas
Cependant la marque de mes switchs n'est pas supportée Commentaire de bartounet

Répondre

Fil RSS des commentaires de cet article

Les commentaires sont fermés.