Instruction conditionnelle dans la commande expect appelée à partir d'un script bash
Question
J'ai essayé d'automatiser certaines sauvegardes de configuration sur mes périphériques cisco. J'ai déjà réussi à exécuter le script qui permet d'accomplir cette tâche, mais j'essaie de l'améliorer pour gérer également les erreurs.
Je pense que cela est nécessaire pour détecter les erreurs sur deux étapes, d’abord juste après le 'send \ " $ pass \ r \' quot; ' pour obtenir des erreurs de connexion (accès refusé aux messages) et à la position 'expect \ " ;: end \ "' ligne, pour vous assurer que les commandes émises sont capables d'extraire la configuration du périphérique.
J'ai déjà vu des façons de le faire si vous travaillez sur un script attendu, mais je souhaite utiliser un script bash pour pouvoir fournir une liste de périphériques à partir d'un fichier .txt.
#!/bin/bash
data=$(date +%d-%m-%Y)
dataOntem=$(date +%d-%m-%Y -d "-1 day")
hora=$(date +%d-%m-%Y-%H:%M:%S)
log=/firewall/log/bkpCisco.$data.log
user=MYUSER
pass=MYPASS
for firewall in `cat /firewall/script/firewall.cisco`
do
VAR=$(expect -c "
spawn ssh $user@$firewall
expect \"assword:\"
send \"$pass\r\"
expect \">\"
send \"ena\r\"
expect \"assword:\"
send \"$pass\r\"
expect \"#\"
send \"conf t\r\"
expect \"conf\"
send \"no pager\r\"
send \"sh run\r\"
log_file -noappend /firewall/backup/$firewall.$data.cfg.tmp
expect \": end\"
log_file
send \"pager 24\r\"
send \"exit\r\"
send \"exit\r\"
")
echo "$VAR"
done
La solution
Vous avez besoin de modèles alternatifs dans les instructions expect pour lesquelles vous voulez intercepter les erreurs. Si vous recherchez un message d'erreur spécifique, vous pouvez le spécifier. Vous pouvez également spécifier un gestionnaire de délai d'attente qui sera éventuellement déclenché lorsque la sortie normale ne s'affiche pas.
Par exemple. après envoyer \ " $ pass \ r \ "quot
au lieu de s'attendre à \" > \ "
essayer:
expect \">\" {} timeout {puts stderr {Could not log in}; exit}
c'est à dire. si la sortie attendue arrive avant la fin du délai (10 sec par défaut), ne rien faire et continuer, sinon, se plaindre et sortir de expect. Vous pourriez également avoir besoin d’un motif eof correspondant au cas où votre session ssh se termine.
Notez que puisque vous ne faites aucune substitution de variable dans expect, vous n’avez pas besoin de \ " \ " autour de vos chaînes, vous pouvez utiliser {} ou même rien quand il s’agit d’un seul mot, par exemple. expect conf
et envoi {pas de pager}
.
Je suis d'accord avec bstpierre pour dire que ce serait plus propre si vous laissiez bash et que vous accomplissiez tout le travail comme prévu, mais si bash fait le travail, ce n'est pas grave.
Autres conseils
Si vous n'utilisez pas de guillemets simples ( expect -c '...'
), alors toutes les variables $ seront remplacées par bash pas prévu. Peut-être plus facile de mettre le code attendu dans un fichier séparé, ou peut-être un heredoc.