Script expect per fer canvis de configuració remots
Expect és un llenguatge de programació interpretat pensat principalment per a facilitar-nos la feina a l’hora d’enviar dades a aplicacions que requereixen interactivitat per tal d’automatitzar tasques, els exemples típics serien sessions de telnet o ftp o aplicacions on hagem d’introduir un password per teclat.
A mi m’ha tocat fer un scriptillo que anés connectant a varies màquines per ssh, i executés una comanda dins de cada màquina, com veureu amb expect és molt fàcil
Partim d’un fitxer CSV on tindrem el llistat de IP’s on hem de connectar amb els corresponents logins i passwords.
list.csv:
IP ; Login ; Passwd
Des-de un shell-script farem el bucle per totes les màquines per on vulguem passar, per exemple:
#!/bin/sh
for linea in `cat list.csv`; do
param1=`echo $linea |cut -f 1 -d \";\"`
param2=`echo $linea |cut -f 2 -d \";\"`
param3=`echo $linea |cut -f 2 -d \";\"`
./set-config.expect $param1 $param2 $param3
done
Ara el fitxer amb expect:
set-config.expect:
#!/usr/bin/expect -f
set force_conservative 1 ;# set to 1 to force conservative mode even if
;# script wasn't run conservatively originally
if {$force_conservative} {
set send_slow {1 .001}
proc send {ignore arg} {
sleep .1
exp_send -s -- $arg
}
}
puts \"\n\"
send_user \"\n============================\n\"
send_user \"$argv0 [lrange $argv 0 2]\n\"
send_user \"============================\n\"
spawn ssh -l [lrange $argv 1 1] [lrange $argv 0 0]
expect \"continue connecting (yes/no)*\"
send -- \"yes\r\"
expect \"assword:*\"
send -- \"[lrange $argv 2 2]\r\"
send -- \"/bin/ls\r\" # or whatever you want...
expect {
timeout {exit}
-gl \"\[*]\$*\"
}
puts \"\n\"
exit
Fàcil, no? Si voleu fer alguna cosa una mica més currada sempre podeu consultar el tutorial de expect.


