Expect

Da Wikipedia, l'enciclopedia libera.
expect
Sviluppatore Don Libes
Ultima versione 5.45 (11 settembre 2010)
Sistema operativo Unix-like
Linguaggio
Genere
Licenza public domain
(Licenza libera)
Sito web http://expect.nist.gov/

Expect è uno strumento di amministrazione di sistemi Unix-like scritto da Don Libes per automatizzare applicazioni interattive come SSH, SFTP, Telnet, FTP, rlogin. È un'estensione del linguaggio tcl. Utilizza una pty per eseguire un sottoprocesso in maniera trasparente, permettendo l'automazione di processi che sono accessibili tramite terminale. Con l'estensione Tk le applicazioni possono essere eseguite in gui X11.

Expect sfrutta le espressioni regolari, permettendo di creare script per controllare intelligentemente programmi che non hanno al loro interno un sistema di scripting o macro.

Esempi[modifica | modifica wikitesto]

Ecco un semplice script che automatizza una sessione telnet.

# Si assume che  $remote_server, $my_user_id, $my_password, and $my_command siano letti in precedenza
# nello script.
# Apre una sessione telnet ad un server remoto, invia user e password, esegue un comando.
 
spawn telnet $remote_server
expect "username:"
# Invia il nome utente
send "$my_user_id\r"
# Attende il prompt, in alcuni casi inviare la password o un comando
# prima del prompt puó causare problemi.
expect "password:"
# Invia la password ed attende nuovamente il prompt
send "$my_password\r"
expect "%"
# Invia il comando
send "$my_command\r"
expect "%"
# Salva l'output del comando nella variabile "result"
# Questa variabile potrà essere visualizzata in seguito o salvata su file
set results $expect_out(buffer)
# Invia il comando di termine sessione ed attende l'eof
send "exit\r"
expect eof

Un esempio di

#!/usr/local/bin/expect -f
# `-- inserire qui la posizione di expect
# per sapere la posizione di expect eseguire "which expect" a terminale
 
# Procedura per eseguire la connessione.
# Ritorna 0 se è andata a buon fine, 1 altrimenti.
 
proc connect {passw} {
  expect {
    "Password:" {
      send "$passw\r"
        expect {
          "sftp*" {
            return 0
          }
        }
    }
  }
  # timed out
  return 1
}
 
# Legge i parametri forniti da linea di comando
set user [lindex $argv 0]
set passw [lindex $argv 1]
set host [lindex $argv 2]
set location [lindex $argv 3]
set file1 [lindex $argv 4]
set file2 [lindex $argv 5]
 
# decommentando le righe seguenti stampa un resume dei parametri di input
#puts "Argument data:\n";
#puts "user: $user";
#puts "passw: $passw";
#puts "host: $host";
#puts "location: $location";
#puts "file1: $file1";
#puts "file2: $file2";
 
# Controlla che tutti i parametri siano stati inseriti.
if { $user == "" || $passw == "" || $host == "" || $location == "" || $file1 == "" || $file2 == "" }  {
  puts "Usage: <user> <passw> <host> <location> <file1 to send> <file2 to send>\n"
  exit 1
}
 
# Connessione all'host
spawn sftp $user@$host
 
# Esegue la procedura "connect"
set rez [connect $passw]
 
# Se l'invio della password è andata a buon fine invia il file e termina lo script
if { $rez == 0 } {
  send "cd $location\r"
  set timeout -1
  send "put $file2\r"
  send "put $file1\r"
  send "ls -l\r"
  send "quit\r"
  expect eof
  exit 0
}
 
# Se l'invio della password ha dato errore stampa un messaggio di errore ed esce.
puts "\nError connecting to server: $host, user: $user and password: $passw!\n"
exit 1

Utilizzo[modifica | modifica wikitesto]

Expect viene utilizzato come una "colla" per collegare vari strumenti assieme. L'idea generale è quella di utilizzare strumenti esistenti all'interno del sistema per risolvere i problemi piuttosto che risolverli all'interno di expect.

La chiave di successo di expect è l'utilizzo con software commerciale, molti di questi programmi hanno un qualche tipo di interfaccia a riga di comando ma soffrono di mancanza di un serio sistema di automazione in quanto concepiti per l'amministrazione da parte dell'utente ma non sono state utilizzate ulteriori risorse per sviluppare un sistema di scripting. Uno script di expect può controllare variabili d'ambiente per recuperare informazioni maggiori integrandolo con comandi unix ed infine entrare all'interno dell'interfaccia del prodotto, eseguire azioni e prendere decisioni intelligenti su quali azioni eseguire.

Ogni volta che un'operazione expect viene completata il risultato viene salvato in una variabile chiamata $expect_out. Questo permette di aumentare le informazione da mostrare all'utente e aiuta a prendere una decisione su quale sia il prossimo comando da inviare in base alle circostanze.

Esistono suite di testing basate su Expect. DejaGNU è una suite di test molto utilizzata per testare gcc e molto comoda per testare su target remoti come piattaforme embedded.

È possibile generare automaticamente gli script con autexpect. Questo tool osserva le azioni di una sessione di lavoro e genera lo script expect tramite euristica. Lo script generato è spesso lungo e difficile da comprendere ma è sempre possibile pulire lo script per ottenere un codice più pulito.

È possibile avviare lo script via cron per eseguire operazioni di amministrazione schedulati. Non c'è bisogno di alcuna modifica perché utilizza solo strumenti del sistema dove viene eseguito.