Creación de scripts expect prácticos para tareas comunes
En este paso, crearemos scripts expect prácticos para tareas comunes que los administradores de sistemas a menudo necesitan automatizar. Nos centraremos en las operaciones de archivos, las interacciones con usuarios y la monitorización del sistema.
Automatización de la transferencia de archivos con expect
Creemos un script expect que automatice la transferencia de un archivo utilizando el comando scp. Dado que no podemos realizar una transferencia de archivos real en este entorno, lo simularemos:
cd ~/project
nano file_transfer.sh
Ingrese el siguiente contenido para simular una transferencia de archivos similar a SCP:
#!/bin/bash
echo "scp file transfer simulation"
echo "Source file: $1"
echo "Destination: $2"
echo "Password: "
read -s password
if [ "$password" == "transfer123" ]; then
echo "Transferring file..."
echo "0%"
sleep 1
echo "25%"
sleep 1
echo "50%"
sleep 1
echo "75%"
sleep 1
echo "100%"
echo "File transfer completed successfully."
else
echo "Authentication failed."
exit 1
fi
Guarde el archivo y hágalo ejecutable:
chmod +x ~/project/file_transfer.sh
Ahora, creemos un script expect para automatizar esta transferencia de archivos:
cd ~/project
nano file_transfer.exp
Ingrese el siguiente contenido:
#!/usr/bin/expect -f
## Set variables
set timeout 10
set source_file "local_file.txt"
set destination "user@remote:/path/to/destination/"
set password "transfer123"
## Create a dummy source file
spawn bash -c "echo 'This is a test file' > $source_file"
expect eof
## Start the file transfer simulation
spawn ./file_transfer.sh $source_file $destination
## Handle the password prompt
expect "Password: "
send "$password\r"
## Monitor the transfer progress
expect "0%"
puts "Transfer started..."
expect "25%"
puts "Transfer 1/4 complete..."
expect "50%"
puts "Transfer 1/2 complete..."
expect "75%"
puts "Transfer 3/4 complete..."
expect "100%"
puts "Transfer almost done..."
expect "File transfer completed successfully."
puts "File transfer automation completed!"
## Clean up the dummy file
spawn bash -c "rm $source_file"
expect eof
Guarde el archivo y hágalo ejecutable:
chmod +x ~/project/file_transfer.exp
Ejecute el script de automatización de transferencia de archivos:
cd ~/project
./file_transfer.exp
Ejemplo de salida:
spawn bash -c echo 'This is a test file' > local_file.txt
spawn ./file_transfer.sh local_file.txt user@remote:/path/to/destination/
scp file transfer simulation
Source file: local_file.txt
Destination: user@remote:/path/to/destination/
Password:
Transferring file...
0%
Transfer started...
25%
Transfer 1/4 complete...
50%
Transfer 1/2 complete...
75%
Transfer 3/4 complete...
100%
Transfer almost done...
File transfer completed successfully.
File transfer automation completed!
spawn bash -c rm local_file.txt
Automatización de la creación de usuarios con expect
Ahora, creemos un script expect que automatice la creación de usuarios. Nuevamente, simularemos este proceso:
cd ~/project
nano create_user.sh
Ingrese el siguiente contenido:
#!/bin/bash
echo "User creation utility"
echo "Please enter new username: "
read username
echo "Please enter password for $username: "
read -s password
echo "Please confirm password: "
read -s password_confirm
if [ "$password" != "$password_confirm" ]; then
echo "Error: Passwords do not match."
exit 1
fi
echo "Creating user $username..."
echo "User $username created successfully."
echo "Do you want to add this user to the sudo group? (yes/no): "
read sudo_choice
if [ "$sudo_choice" == "yes" ]; then
echo "Adding $username to sudo group..."
echo "User $username added to sudo group."
fi
echo "User setup completed."
Guarde el archivo y hágalo ejecutable:
chmod +x ~/project/create_user.sh
Ahora, creemos un script expect para automatizar la creación de usuarios:
cd ~/project
nano create_user.exp
Ingrese el siguiente contenido:
#!/usr/bin/expect -f
## Set variables
set timeout 10
set username "testuser"
set password "P@ssw0rd123"
set add_sudo "yes"
## Start the user creation utility
spawn ./create_user.sh
## Handle the username prompt
expect "Please enter new username: "
send "$username\r"
## Handle the password prompt
expect "Please enter password for $username: "
send "$password\r"
## Handle the password confirmation prompt
expect "Please confirm password: "
send "$password\r"
## Wait for the user creation confirmation
expect "User $username created successfully."
## Handle the sudo prompt
expect "Do you want to add this user to the sudo group? (yes/no): "
send "$add_sudo\r"
## If we chose to add to sudo, wait for confirmation
if {$add_sudo == "yes"} {
expect "User $username added to sudo group."
}
## Wait for completion
expect "User setup completed."
puts "\nUser creation automation completed successfully!"
Guarde el archivo y hágalo ejecutable:
chmod +x ~/project/create_user.exp
Ejecute el script de automatización de creación de usuarios:
cd ~/project
./create_user.exp
Ejemplo de salida:
spawn ./create_user.sh
User creation utility
Please enter new username:
testuser
Please enter password for testuser:
Please confirm password:
Creating user testuser...
User testuser created successfully.
Do you want to add this user to the sudo group? (yes/no):
yes
Adding testuser to sudo group...
User testuser added to sudo group.
User setup completed.
User creation automation completed successfully!
Comprender los scripts expect prácticos
Los scripts prácticos que creamos demuestran varios conceptos importantes para la automatización en el mundo real:
- Interacción secuencial: Ambos scripts siguen una secuencia definida de prompts y respuestas.
- Monitorización del progreso: El script de transferencia de archivos monitorea el progreso y proporciona actualizaciones fáciles de usar.
- Lógica condicional: El script de creación de usuarios utiliza lógica condicional para manejar la opción sudo.
- Configuración y limpieza del entorno: El script de transferencia de archivos crea y limpia archivos de prueba.
Estas técnicas se pueden aplicar para automatizar muchas tareas comunes de administración del sistema, como:
- Copias de seguridad remotas
- Instalaciones de software
- Configuración del sistema
- Operaciones por lotes
Al dominar expect, puede automatizar procesos interactivos complejos que de otro modo requerirían intervención manual, ahorrando tiempo y reduciendo la posibilidad de error humano.