Bedingte Anweisung innerhalb Befehl von einem Bash-Skript namens erwarten
Frage
Ich habe versucht, einige Konfigurationssicherungen auf meinem Cisco-Geräten zu automatisieren, habe ich es geschafft, bereits das Skript zu tun, die die Aufgabe erfüllt, aber ich versuche, es zu verbessern Fehler zu behandeln.
Ich denke, das ist notwendig, um die Fehler auf zwei Schritte zu fangen, zuerst kurz nach dem ‚\‚$ Pass \ r \‘senden‘ Login-Fehler zu erhalten (Zugriffsnachrichten verweigert) und an den ‚erwartet \‚: \ end‘ 'Linie, sicher sein, dass die ausgegebenen Befehle konnten die Konfiguration aus dem Gerät ziehen.
Ich habe einige Möglichkeiten gesehen, es zu tun, wenn Sie auf einem erwartet Skript arbeiten, aber ich mag eine Bash-Skript verwenden, um die Lage sein, eine Liste der Geräte aus einer TXT-Datei zu liefern.
#!/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
Lösung
Sie müssen alternative Muster in den erwarten Aussagen, wo Sie Fehler fangen wollen. Wenn Sie sich für eine bestimmte Fehlermeldung suchen, können Sie festlegen, dass alternativ nur einen Timeout-Handler angeben, die schließlich ausgelöst wird, wenn die normale Ausgabe ausbleibt.
Eg. nach send \"$pass\r\"
statt expect \">\"
Versuch:
expect \">\" {} timeout {puts stderr {Could not log in}; exit}
dh. wenn die erwartete Ausgabe kommt vor dem Timeout (default 10 sec) nichts tun, und weiter, sonst beschweren und Verlassen erwarten. Sie könnten auch ein EOF Muster benötigen, den Fall zu passen, wo Ihre SSH-Sitzung endet.
Beachten Sie, dass da Sie keine Variablensubstitution tun in erwarten, brauchen Sie nicht \ „\“ um die Saiten, können Sie {} oder gar nichts, wenn es ein Wort ist, zum Beispiel. expect conf
und send {no pager}
.
BTW bin ich mit bstpierre, dass dieser Reiniger wäre, wenn Sie bash fallen gelassen und hat das Ganze in erwarten, aber wenn bash hat den Zweck erfüllt, die in Ordnung ist.
Andere Tipps
Wenn Sie nicht einfache Anführungszeichen verwenden (expect -c '...'
), dann sind die alle $ Variablen werden durch bash ersetzt werden nicht erwartet. Kann einfacher sein, die erwarten, dass Code in einer separaten Datei zu setzen, oder vielleicht eine heredoc.