Esperar não reconhece saída no roteador Cisco

1

Estou escrevendo um script com expect para configurar os roteadores Cisco automaticamente via ssh . Uma parte deste script é copiar uma imagem em flash , se ela não existir:

Para essa expectativa, envia um copy e aguarda Destination filename , em seguida, envia um return .

cisco#copy tftp://10.xx.xx.3/name_of_image.bin flash:
Destination filename [name_of_image.bin]?

Agora existem duas opções:

  1. O arquivo não existe e é copiado para flash:
  2. O arquivo existe e o script pula esta parte.

Se o arquivo já existir, será exibido assim:

%Warning:There is a file already existing with this name
Do you want to over write? [confirm]

Agora, para o meu problema: Os scripts aguardam Do you want to over write? [confirm] e depois devem sair, pois a imagem já está em flash. Mas atualmente parece que expect não consegue reconhecer essa linha e fica preso na confirmação. Ele tentou vários padrões como [confirm] , *[confirm]* , Do , *write* e outros.

Meu código para esse trabalho é assim no momento:

        expect "*#"
        send "copy tftp://10.$ip_local.3/name_of_image.bin flash:\r"
        expect "Destination filename"
        send "\r"

        expect {
          "Do you want to over write? [confirm]"{
           interact
           abort
        }
        expect "*#"
        send "exit\r"

O que estou fazendo de errado?

    
por user6679493 19.07.2017 / 15:59

1 resposta

0

Algumas coisas estão erradas:

  • em uma string de aspas duplas [confirm] tentará chamar o comando expect "confirm" - colchetes em espera são como backticks no shell
  • espera precisa ter argumentos separados por espaço em branco. Portanto, é essencial colocar um espaço antes da chave de abertura
  • seu script não espera o prompt de substituição condicionalmente . Você precisa usar o formulário de vários padrões do comando expect , onde o primeiro correspondido ganha.

Tente isto:

expect {
    -exact {Do you want to over write? [confirm]} {
        send "\r"
        exp_continue
    }
    "*#"
}
send "exit\r"
expect eof

Notas

  • Estou usando a correspondência "exata", pois você tem os caracteres curinga da glob ? e [...] que interfeririam.
  • Estou usando as cotações de sem interpolação da expectativa (chaves) para impedir que [confirm] tente substituir o comando
  • Espero que o prompt de substituição ou o prompt de comando
  • Eu uso exp_continue para permanecer dentro desse comando expect se o prompt de substituição aparecer. Isso significa que ainda posso procurar o prompt de comando.
  • os dois marcadores acima explicam como implementar a correspondência condicional.
  • Eu suponho que você só quer apertar enter no prompt de substituição.
  • depois de você exit , aguarde que eof permita que a sessão ssh termine normalmente
por 19.07.2017 / 20:00