Instruction conditionnelle dans la commande expect appelée à partir d'un script bash

StackOverflow https://stackoverflow.com/questions/1638369

  •  08-07-2019
  •  | 
  •  

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
Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top