Usando o script esperado para automatizar a verificação de senha para uma infinidade de roteadores

3

A tarefa em mãos é verificar as senhas de vários roteadores e alterá-las caso alguma senha ainda esteja definida como padrão, ou seja, (para .eg) Login: ABC, Senha: ABC.

Eu escrevi um script de expectativa para isso, mas tive um pequeno problema.

Aqui está o código:

#!/usr/bin/expect -f

spawn telnet 10.15.160.69 #using a test IP, later it will read IP's from a list.

expect {

 "Login: " {
   send "ABC\r"
   exp_continue
  }
 "Password: " {

    send "ABC\r"
    exp_continue
  }

  "> " {

    send "passwd\r"
    expect "Username: "
    send "ABC\r"
    expect "Password: "
    send "ABC\r"
    expect "New Password: "
    send "n3wp@ss\r"
    expect "Confirm New Password: "
    send "n3wp@ss\r"
    expect "> "
    send "save\r"

  }
}

Agora, os roteadores têm um comportamento peculiar de não fazer logout após três tentativas de senha, em vez disso, ele solicita o login e a senha até que as credenciais corretas sejam fornecidas ou Ctrl+D (EOF) seja pressionado.

Por favor, veja abaixo:

Trying 10.15.160.69...
Connected to 10.15.160.69.
Escape character is '^]'.
BCM96816 Broadband Router
Login:     
Password: 
Login incorrect. Try again.
Login: 
Password: 
Login incorrect. Try again.
Login: 
Password: 
Authorization failed after trying 3 times!!!.

Login: Password: 
Login incorrect. Try again.
Login: 
Password: 
Login incorrect. Try again.
Login: 
Password: 
Authorization failed after trying 3 times!!!.
Login: 
Password: 
Login incorrect. Try again.

O envio de um eof no script faz com que ele saia completamente.

O script expect é chamado de um script bash:

#!/bin/bash

for host in $(cat ipnmap.txt);do
echo "${host}";

/usr/bin/expect passchange1.sh $host
done

Eu percebo que a mesma funcionalidade pode ser implementada com o esperado, mas eu fiz isso no bash como uma preferência.

O que é necessário é que o script passe para o próximo IP assim que o roteador solicitar as credenciais uma segunda vez, porque se ele não foi bem-sucedido na primeira vez, significa que o roteador não tem seu padrão senha e é isso que queremos, e podemos passar para o próximo IP / Router (a mudança de senha só é necessária se o roteador tiver nome de usuário / senha padrão).

Eu apreciaria muito qualquer orientação que pudesse ser fornecida para resolver esse problema. Obrigado

    
por Mustafa Mujahid 03.12.2016 / 06:12

1 resposta

1

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.

    
por 03.12.2016 / 15:15