Criando Scripts expect Práticos para Tarefas Comuns
Nesta etapa, criaremos scripts expect práticos para tarefas comuns que os administradores de sistema frequentemente precisam automatizar. Focaremos em operações de arquivos, interações com usuários e monitoramento do sistema.
Automatizando a Transferência de Arquivos com expect
Vamos criar um script expect que automatiza a transferência de um arquivo usando o comando scp. Como não podemos realizar uma transferência de arquivo real neste ambiente, vamos simulá-la:
cd ~/project
nano file_transfer.sh
Insira o seguinte conteúdo para simular uma transferência de arquivo semelhante ao 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
Salve o arquivo e torne-o executável:
chmod +x ~/project/file_transfer.sh
Agora, vamos criar um script expect para automatizar esta transferência de arquivo:
cd ~/project
nano file_transfer.exp
Insira o seguinte conteúdo:
#!/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
Salve o arquivo e torne-o executável:
chmod +x ~/project/file_transfer.exp
Execute o script de automação de transferência de arquivos:
cd ~/project
./file_transfer.exp
Exemplo de saída:
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
Automatizando a Criação de Usuários com expect
Agora, vamos criar um script expect que automatiza a criação de usuários. Novamente, vamos simular este processo:
cd ~/project
nano create_user.sh
Insira o seguinte conteúdo:
#!/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."
Salve o arquivo e torne-o executável:
chmod +x ~/project/create_user.sh
Agora, vamos criar um script expect para automatizar a criação de usuários:
cd ~/project
nano create_user.exp
Insira o seguinte conteúdo:
#!/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!"
Salve o arquivo e torne-o executável:
chmod +x ~/project/create_user.exp
Execute o script de automação de criação de usuários:
cd ~/project
./create_user.exp
Exemplo de saída:
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!
Compreendendo os Scripts expect Práticos
Os scripts práticos que criamos demonstram vários conceitos importantes para a automação do mundo real:
- Interação Sequencial: Ambos os scripts seguem uma sequência definida de prompts e respostas.
- Monitoramento de Progresso: O script de transferência de arquivos monitora o progresso e fornece atualizações amigáveis ao usuário.
- Lógica Condicional: O script de criação de usuários usa lógica condicional para lidar com a opção sudo.
- Configuração e Limpeza do Ambiente: O script de transferência de arquivos cria e limpa arquivos de teste.
Essas técnicas podem ser aplicadas para automatizar muitas tarefas comuns de administração de sistema, como:
- Backups remotos
- Instalações de software
- Configuração do sistema
- Operações em lote
Ao dominar o expect, você pode automatizar processos interativos complexos que, de outra forma, exigiriam intervenção manual, economizando tempo e reduzindo o potencial de erro humano.