Em vez de colocar tudo em uma única instrução expect
, você pode simplesmente espalhar cada parte do login em correspondências separadas, especialmente porque você sabe qual sequência obterá, assim você não precisa lidar com muitas respostas possíveis uma vez. Por exemplo:
#!/usr/bin/expect
proc abort { } { send_user "Timeout!" ; exit 2 }
set address [lindex $argv 0]
spawn telnet $address
expect timeout abort "Login: "
set timeout 5
send "ABC\r"
expect timeout abort "Password: "
send "ABC\r"
expect timeout abort "Login incorrect" exit "> "
send "passwd\r"
expect timeout abort "Username: "
send "ABC\r"
expect timeout abort "Password: "
send "ABC\r"
expect timeout abort "New Password: "
send "n3wp@ss\r"
expect timeout abort "Confirm New Password: "
send "n3wp@ss\r"
expect timeout abort "> "
send "save\r"
expect timeout abort "> "
send "quit\r"
expect timeout abort eof
Este script cria uma função abort
que imprimirá uma mensagem e sairá com o código de retorno 2 quando chamado. Ele define a variável address
como o primeiro parâmetro passado para o script. Ele inicia o comando telnet, em seguida, faz um expect
para o prompt de login ou um tempo limite (o tempo limite padrão é 10 segundos. Nós o definimos, por exemplo, 5 depois). timeout
é uma palavra-chave especial em vez de um padrão. O formato para o comando expect é comando padrão do comando padrão ... . O comando final pode ser omitido e significa passar para a próxima linha do script. Isto é o mesmo que o equivalente multilinha:
expect {
timeout abort
"Login incorrect" exit
"> "
}
Se o prompt de login não for visto, o tempo limite chamará nosso aborto, que será encerrado e, no seu script bash, você poderá testar essa falha.
Se o prompt for visto, enviamos o ID do usuário e, em seguida, a senha. Se obtivermos "Login incorreto", sairemos (código de saída 0), pois isso significa que a senha não é o padrão, senão, conseguimos fazer login e ver o prompt >
e continuar com a configuração. No final, pode haver algum comando útil, como quit
, você pode enviar para fechar a conexão e expect eof
aguardará o fechamento.