为常见任务创建实用的 expect 脚本
在这一步中,我们将为系统管理员经常需要自动化的常见任务创建实用的 expect 脚本。我们将重点关注文件操作、用户交互和系统监控。
使用 expect 自动化文件传输
让我们创建一个 expect 脚本,使用 scp 命令自动化文件的传输。由于我们无法在此环境中执行实际的文件传输,我们将模拟它:
cd ~/project
nano file_transfer.sh
输入以下内容以模拟类似 SCP 的文件传输:
#!/bin/bash
echo "scp 文件传输模拟"
echo "源文件: $1"
echo "目标: $2"
echo "密码: "
read -s password
if [ "$password" == "transfer123" ]; then
echo "正在传输文件..."
echo "0%"
sleep 1
echo "25%"
sleep 1
echo "50%"
sleep 1
echo "75%"
sleep 1
echo "100%"
echo "文件传输成功完成。"
else
echo "身份验证失败。"
exit 1
fi
保存文件并使其可执行:
chmod +x ~/project/file_transfer.sh
现在,让我们创建一个 expect 脚本来自动化此文件传输:
cd ~/project
nano file_transfer.exp
输入以下内容:
#!/usr/bin/expect -f
## 设置变量
set timeout 10
set source_file "local_file.txt"
set destination "user@remote:/path/to/destination/"
set password "transfer123"
## 创建一个虚拟源文件
spawn bash -c "echo '这是一个测试文件' > $source_file"
expect eof
## 启动文件传输模拟
spawn ./file_transfer.sh $source_file $destination
## 处理密码提示
expect "密码: "
send "$password\r"
## 监控传输进度
expect "0%"
puts "传输开始..."
expect "25%"
puts "传输 1/4 完成..."
expect "50%"
puts "传输 1/2 完成..."
expect "75%"
puts "传输 3/4 完成..."
expect "100%"
puts "传输即将完成..."
expect "文件传输成功完成。"
puts "文件传输自动化完成!"
## 清理虚拟文件
spawn bash -c "rm $source_file"
expect eof
保存文件并使其可执行:
chmod +x ~/project/file_transfer.exp
运行文件传输自动化脚本:
cd ~/project
./file_transfer.exp
示例输出:
spawn bash -c echo '这是一个测试文件' > local_file.txt
spawn ./file_transfer.sh local_file.txt user@remote:/path/to/destination/
scp 文件传输模拟
源文件: local_file.txt
目标: user@remote:/path/to/destination/
密码:
正在传输文件...
0%
传输开始...
25%
传输 1/4 完成...
50%
传输 1/2 完成...
75%
传输 3/4 完成...
100%
传输即将完成...
文件传输成功完成。
文件传输自动化完成!
spawn bash -c rm local_file.txt
使用 expect 自动化用户创建
现在,让我们创建一个 expect 脚本来自动化用户创建。同样,我们将模拟这个过程:
cd ~/project
nano create_user.sh
输入以下内容:
#!/bin/bash
echo "用户创建实用程序"
echo "请输入新用户名: "
read username
echo "请输入 $username 的密码: "
read -s password
echo "请确认密码: "
read -s password_confirm
if [ "$password" != "$password_confirm" ]; then
echo "错误: 密码不匹配。"
exit 1
fi
echo "正在创建用户 $username..."
echo "用户 $username 创建成功。"
echo "你想要将此用户添加到 sudo 组吗? (yes/no): "
read sudo_choice
if [ "$sudo_choice" == "yes" ]; then
echo "正在将 $username 添加到 sudo 组..."
echo "用户 $username 已添加到 sudo 组。"
fi
echo "用户设置完成。"
保存文件并使其可执行:
chmod +x ~/project/create_user.sh
现在,让我们创建一个 expect 脚本来自动化用户创建:
cd ~/project
nano create_user.exp
输入以下内容:
#!/usr/bin/expect -f
## 设置变量
set timeout 10
set username "testuser"
set password "P@ssw0rd123"
set add_sudo "yes"
## 启动用户创建实用程序
spawn ./create_user.sh
## 处理用户名提示
expect "请输入新用户名: "
send "$username\r"
## 处理密码提示
expect "请输入 $username 的密码: "
send "$password\r"
## 处理密码确认提示
expect "请确认密码: "
send "$password\r"
## 等待用户创建确认
expect "用户 $username 创建成功。"
## 处理 sudo 提示
expect "你想要将此用户添加到 sudo 组吗? (yes/no): "
send "$add_sudo\r"
## 如果我们选择添加到 sudo,等待确认
if {$add_sudo == "yes"} {
expect "用户 $username 已添加到 sudo 组。"
}
## 等待完成
expect "用户设置完成。"
puts "\n用户创建自动化成功完成!"
保存文件并使其可执行:
chmod +x ~/project/create_user.exp
运行用户创建自动化脚本:
cd ~/project
./create_user.exp
示例输出:
spawn ./create_user.sh
用户创建实用程序
请输入新用户名:
testuser
请输入 testuser 的密码:
请确认密码:
正在创建用户 testuser...
用户 testuser 创建成功。
你想要将此用户添加到 sudo 组吗? (yes/no):
yes
正在将 testuser 添加到 sudo 组...
用户 testuser 已添加到 sudo 组。
用户设置完成。
用户创建自动化成功完成!
理解实用的 expect 脚本
我们创建的实用脚本演示了几个用于实际自动化任务的重要概念:
- 顺序交互:两个脚本都遵循已定义的提示和响应顺序。
- 进度监控:文件传输脚本监控进度并提供用户友好的更新。
- 条件逻辑:用户创建脚本使用条件逻辑来处理 sudo 选项。
- 环境设置和清理:文件传输脚本创建和清理测试文件。
这些技术可以应用于自动化许多常见的系统管理任务,例如:
通过掌握 expect,你可以自动化复杂的交互式流程,否则这些流程将需要手动干预,从而节省时间并减少人为错误的潜在可能性。