Il blog sull'informatica

Script expect condizionali

Scenario

Più di 1000 dispositivi di rete dai quali bisogna ricavare (tramite telnet/CLI) un determinato parametro di configurazione. Purtroppo non tutti possiedono le medesime credenziali di accesso, ergo occorre fare in modo che lo scrip expect (adoperato per automatizzare la suddetta procedura) sia in grado di utilizzare la seconda coppia di credenziali nel caso in cui il primo tentativo di login fallisse.

Soluzione

Definire 2 condizioni distinte in modo da consentire allo scrip di “capire” quali sono le credenziali corrette e quindi di procedere con l’individuazione del parametro di configurazione di interesse. Di seguito riporto il codice:

#!/usr/bin/expect

set timeout 120
set hostname [lindex $argv 0]
log_file -noappend $hostname.log ;

spawn telnet $hostname
expect "NAME:"
send "pippo\r"
expect "PASSWORD:"
send "pluto\r"
expect ">"
send "\r"
expect {
        ">" {
        send "get parameters\r"
        expect ">"
        send "exit\r"
        expect eof
        exit 0
        }
        "NAME:" {
        send "foo\r"
        expect "PASSWORD:"
        send "bar\r"
        exp_continue
        }
}

expect eof

exit 0

In soldoni esso è in grado di verificare la validità delle credenziali utilizzando una direttiva expect che riesce a gestire 2 output distinti:

1) viene restituito il carattere >, ovvero il login è andato a buon fine:

        ">" {
        send "get parameters\r"
        expect ">"
        send "exit\r"
        expect eof
        exit 0
        }

2) viene restituita la stringa NAME: ed in questo caso sarà necessario fornire la seconda coppia di credenziali:

        "NAME:" {
        send "foo\r"
        expect "PASSWORD:"
        send "bar\r"
        exp_continue
        }

Da notare che, in quest’ultimo caso, è presente la direttiva exp_continue in grado di far eseguire allo scrip la prima condizione definita (ovvero il prompt uguale a >, sinonimo di login riuscito).

Inoltre, occorre precisare che è sempre buona norma tenere traccia delle azioni eseguite da uno scrip di automazione, ragion per cui ho deciso di creare dei log appositi (il cui nome è identico all’hostname del dispositivo a cui expect sta tentando di connettersi):

log_file -noappend $hostname.log ;

Alla prossima.

Script expect condizionaliultima modifica: 2016-02-27T08:25:26+01:00da
Reposta per primo quest’articolo