Expect
In informatica Expect è uno strumento di amministrazione di sistemi Unix-like scritto da Don Libes per automatizzare applicazioni interattive come SSH, SFTP, Telnet, FTP, rlogin.[1] È 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. EsempiEcco 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
UtilizzoExpect 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 informazioni 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. Note
Collegamenti esterni
|