Создание практических скриптов expect для общих задач
На этом этапе мы создадим практические скрипты expect
для общих задач, которые системным администраторам часто необходимо автоматизировать. Мы сосредоточимся на операциях с файлами, взаимодействии с пользователями и мониторинге системы.
Автоматизация передачи файлов с помощью expect
Давайте создадим скрипт expect
, который автоматизирует передачу файла с помощью команды scp
. Поскольку мы не можем выполнить фактическую передачу файла в этой среде, мы будем ее имитировать:
cd ~/project
nano file_transfer.sh
Введите следующее содержимое, чтобы имитировать передачу файла, подобную 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
Сохраните файл и сделайте его исполняемым:
chmod +x ~/project/file_transfer.sh
Теперь давайте создадим скрипт expect
для автоматизации этой передачи файла:
cd ~/project
nano file_transfer.exp
Введите следующее содержимое:
#!/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
Сохраните файл и сделайте его исполняемым:
chmod +x ~/project/file_transfer.exp
Запустите скрипт автоматизации передачи файлов:
cd ~/project
./file_transfer.exp
Пример вывода:
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
Автоматизация создания пользователей с помощью expect
Теперь давайте создадим скрипт expect
, который автоматизирует создание пользователей. Опять же, мы будем имитировать этот процесс:
cd ~/project
nano create_user.sh
Введите следующее содержимое:
#!/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."
Сохраните файл и сделайте его исполняемым:
chmod +x ~/project/create_user.sh
Теперь давайте создадим скрипт expect
для автоматизации создания пользователей:
cd ~/project
nano create_user.exp
Введите следующее содержимое:
#!/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!"
Сохраните файл и сделайте его исполняемым:
chmod +x ~/project/create_user.exp
Запустите скрипт автоматизации создания пользователей:
cd ~/project
./create_user.exp
Пример вывода:
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!
Понимание практических скриптов expect
Практические скрипты, которые мы создали, демонстрируют несколько важных концепций для реальной автоматизации:
- Последовательное взаимодействие: Оба скрипта следуют определенной последовательности запросов и ответов.
- Мониторинг прогресса: Скрипт передачи файлов отслеживает прогресс и предоставляет удобные обновления для пользователя.
- Условная логика: Скрипт создания пользователей использует условную логику для обработки опции sudo.
- Настройка и очистка среды: Скрипт передачи файлов создает и очищает тестовые файлы.
Эти методы можно применять для автоматизации многих общих задач администрирования системы, таких как:
- Удаленное резервное копирование
- Установка программного обеспечения
- Настройка системы
- Пакетные операции
Освоив expect
, вы можете автоматизировать сложные интерактивные процессы, которые в противном случае потребовали бы ручного вмешательства, экономя время и снижая вероятность человеческих ошибок.