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.