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.

This entry was posted in linux. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>