Pergunta

Eu tenho tentado para automatizar alguns backups de configuração em meus dispositivos Cisco, eu já consegui fazer o script que realiza a tarefa, mas eu estou tentando melhorá-lo para lidar com erros também.

Eu acho que é necessário para pegar os erros em duas etapas, a primeira logo após o 'send \ '$ passagem \ r \'' para obter erros de login (acesso negado mensagens) e na 'espera \ ': fim \' "linha, para ter certeza de que os comandos emitidos foram capazes de puxar a configuração do dispositivo.

Eu vi algumas maneiras de fazer isso, se você trabalha em um esperar script, mas eu quero usar um script para ser capaz de fornecer uma lista de dispositivos a partir de um arquivo .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
Foi útil?

Solução

Você precisa de padrões alternativos na espera declarações em que deseja capturar erros. Se você está procurando uma mensagem de erro específico que você pode especificar que, em alternativa basta especificar um manipulador de tempo limite que acabará gatilho quando a saída normal não aparece.

Por exemplo. após send \"$pass\r\" em vez de tentar expect \">\":

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

ie. Se a saída esperada chega antes do tempo limite (padrão 10 seg) não fazer nada e continuar, caso contrário, reclamar e saída de esperar. Você também pode precisar de um padrão de EOF para coincidir com o caso em que a sessão termina ssh. Note-se que desde que você não faça qualquer substituição de variáveis ??em espera, você não precisa de \ "\" em torno de suas cordas, você pode usar {} ou mesmo nada quando é uma palavra, por exemplo. expect conf e send {no pager}.

BTW Concordo com bstpierre que este seria mais limpa se você caiu bash e fez a coisa toda em esperar, mas se o bash faz o trabalho que é ok.

Outras dicas

Não Se você não usar aspas simples (expect -c '...'), então todos os $ variáveis ??serão substituídos pelo bash esperar. Pode ser mais fácil colocar a esperar código em um arquivo separado, ou talvez um heredoc.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top