Cuando un programa solicita la entrada del usuario, espere enviar la respuesta sin ninguna interacción del usuario.
Instalación
Sistemas basados en Debian apt como Ubuntu
sudo apt update
sudo apt install -y expect
Sistemas basados en Red Hat como Centos
# Centos 7
sudo yum install -y expect
# Centos 8
sudo dnf install -y expect
Si obtiene errores sobre la ubicación del comando Expect, puede obtener la ubicación usando el comando which:
which expect
which autoexpect
Ejemplo
Guarda esto en name.sh
#!/bin/bash
echo "What is your name?"
read name
echo "Your name is ${name}"
Haga que el script sea ejecutable:
chmod +x name.sh
# Execute
./name.sh
Cuando ejecuto el script manualmente, me pide que ingrese el nombre con What is your name?
luego se imprime después de ingresar.
Podemos usar expect
para dar una respuesta automatizada a la consulta. Aquí está el guión:
Guarda esto en auto.exp
#!/usr/bin/expect
set timeout -1
spawn ./name.sh
expect "What is your name?\r"
send -- "John\r"
expect eof
Hacer legible y ejecutable:
chmod +x auto.exp
Este es el resultado cuando el script se ejecuta con ./auto.exp
:
➜ ./auto.exp
spawn ./name.sh
What is your name?
John
Your name is John
Trabajar con variables
Puede usar el comando set para definir variables en secuencias de comandos esperadas como esta:
set user kip
set age 10
Para acceder a la variable, preceda con $
como en bash (por ejemplo, $user
)
Para definir los argumentos de la línea de comandos en los scripts esperados, usamos la siguiente sintaxis:
set USER [lindex $argv 0]
Aquí definimos una variable USUARIO, que es igual al primer argumento pasado.
Puede obtener el primer y el segundo argumento y almacenarlos en variables como esta:
set USER [lindex $argv 0]
set PASSWORD [lindex $argv 1]
Ejemplo de script con variables
Otra forma de hacerlo sin crear un script:
Ejemplo para cambiar la contraseña de sftp. Guárdelos en ./sftp_password_change.exp
.
#!/usr/bin/expect
set timeout 10
set curpass [lindex $argv 0];
set newpass [lindex $argv 1];
set user [lindex $argv 2];
set server [lindex $argv 3];
expect <<EOF
spawn sftp -P 15422 [email protected]$server
expect "Password:"
send "$curpass\r"
expect "Old Password:"
send "$curpass\r"
expect "New Password:"
send "$newpass\r"
expect "Reenter New Password:"
send "$newpass\r"
expect "sftp>"
send "exit\n"
Ejecute el sctipt con
./sftp_password_change.exp $curpass $newpass $user $server
Espera automática
autoexpect
El comando le permite proporcionar su secuencia de comandos como un argumento y luego creará la secuencia de comandos para usted.
Utiliza un comando como autoexpect ./installapp y creará una secuencia de comandos de expectativa con las respuestas que proporcione:
$ autoexpect ./name.sh
autoexpect started, file is script.exp
What is your name?
John
Your name is John
autoexpect done, file is script.exp
El script.exp
resultante El archivo incluirá una explicación de que se creó con autoexpect e incluirá las respuestas que proporcionó.
La herramienta autoexpect prepara el script para ejecutar una instalación de forma no interactiva. Luego puede realizar instalaciones sin tener que proporcionar los detalles o simplemente programarlas para que se ejecuten solas.
Este es el contenido generado sin comentarios
$ cat script.exp
#!/usr/bin/expect -f
#
set force_conservative 0 ;# set to 1 to force conservative mode even if
;# script wasn't run conservatively originally
if {$force_conservative} {
set send_slow {1 .1}
proc send {ignore arg} {
sleep .1
exp_send -s -- $arg
}
}
set timeout -1
spawn ./name.sh
match_max 100000
expect -exact "What is your name?\r
"
send -- "John\r"
expect eof
Conclusión
El expect
El comando es útil para ejecutar secuencias de comandos que requieren una larga serie de respuestas y le permite ejecutarlas sin supervisión, mientras que autoesperar facilita la creación de secuencias de comandos esperadas sin preocuparse por los detalles sintácticos.