#Gnu/Linux, Planet Libre
Scripter des commandes à distance : EXPECT
25 octobre 2013 Rédigé par bartounet

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
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
#2
Merci.
Certains équipements ne gerent même pas le ssh
Expect gère aussi le telnet Commentaire de Votre Nom
#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
#4
@Votre Nom :
Merci de l'info
Je vais tester ça Commentaire de bartounet
#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
#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
#7
@Pierre :
Merci pour l'info je ne connaissais pas
Cependant la marque de mes switchs n'est pas supportée Commentaire de bartounet
Fil RSS des commentaires de cet article
Les commentaires sont fermés.