Istruzione condizionale all'interno del comando prevede un comando chiamato da uno script bash

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

  •  08-07-2019
  •  | 
  •  

Domanda

Ho cercato di automatizzare alcuni backup di configurazione sui miei dispositivi Cisco, sono già riuscito a fare lo script che compie l'attività ma sto cercando di migliorarlo per gestire anche gli errori.

Penso che sia necessario rilevare gli errori in due passaggi, prima subito dopo 'invia \ " $ pass \ r \ "' per ottenere errori di accesso (accesso ai messaggi negati) e alla voce "prevedono \ " ;: end \ "" linea, per essere sicuri che i comandi emessi siano stati in grado di estrarre la configurazione dal dispositivo.

Ho visto alcuni modi per farlo se lavori su uno script prevede, ma voglio usare uno script bash per essere in grado di fornire un elenco di dispositivi da un file .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
È stato utile?

Soluzione

Sono necessari schemi alternativi nelle dichiarazioni di aspettativa in cui si desidera rilevare errori. Se stai cercando un messaggio di errore specifico, puoi specificare che, in alternativa, specifica un gestore di timeout che alla fine si innescherà quando non viene visualizzato l'output normale.

Eg. dopo invia \ " $ pass \ r \ " invece di prevede \ " > \ " prova:

expect \">\" {} timeout {puts stderr {Could not log in}; exit}

es. se l'output previsto arriva prima del timeout (predefinito 10 secondi), non fare nulla e continuare, altrimenti lamentarsi e uscire da aspettarsi. Potrebbe anche essere necessario un modello di eof per abbinare il caso in cui termina la sessione SSH. Tieni presente che poiché non esegui alcuna sostituzione variabile in attesa, non hai bisogno di \ " \ " attorno alle tue stringhe, puoi usare {} o addirittura nulla quando è una parola, ad es. prevede conf e invia {no pager} .

A proposito, sono d'accordo con bstpierre sul fatto che sarebbe più pulito se avessi lasciato cadere bash e avessi fatto tutto il necessario, ma se bash fa il lavoro, va bene.

Altri suggerimenti

Se non usi virgolette singole ( prevedono -c '...' ), allora tutte le variabili $ saranno sostituite da bash non aspettarti. Potrebbe essere più semplice inserire il codice di aspettativa in un file separato, o forse un ereditario.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top