
技术弄巷
前言
在 Linux 运维批量操作中,大量命令需要交互式输入(如修改密码、SSH 免密、远程登录等),纯 Shell 脚本无法自动应答,效率极低。而 Expect 工具正是解决交互式自动化的核心利器;搭配 Shell 函数实现代码复用,能让运维脚本更简洁、易维护、可扩展。
本文从安装、语法、实战场景到函数封装,一站式讲解 Expect 与 Shell 函数的运维落地用法,看完即可直接用于生产环境批量操作。
一、Expect 工具:交互式命令自动化
1. 工具作用
自动捕获交互式提示信息,自动发送指令,实现无人值守自动化执行,彻底解放双手。
2. 安装 Expect
yum install -y expect
3. Expect 独立脚本写法
#!/usr/bin/expect
# 设置超时时间(秒)
settimeout 10
# 启动交互式命令
spawn passwd martin
# 捕获提示并发送内容
expect "New password:"
send "www.1.com\n"
expect "Retype new password:"
send "www.1.com\n"
# 等待执行结束
expect eof
核心指令说明
set timeout 10spawnexpectsendexpect eof
4. Expect 嵌入 Shell 脚本(最常用)
#!/bin/bash
# 创建用户
useradd AAA
# 嵌入 expect 自动设置密码
/usr/bin/expect << eof
set timeout 10
spawn passwd AAA
expect "New password:"
send "123\n"
expect "Retype new password:"
send "123\n"
expect eof
eof
实战:批量配置 SSH 免密登录
#!/bin/bash
# 清空旧主机记录
[ -e ~/.ssh/known_hosts ] && > ~/.ssh/known_hosts
# 生成密钥(无密码)
ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa &> /dev/null
# 批量分发公钥
for i in 11 12; do
/usr/bin/expect << eof
set timeout 3
spawn ssh-copy-id root@192.168.140.$i
expect "(yes/no)?"
send "yes\n"
expect " password:"
send "redhat\n"
expect eof
eof
done
二、Shell 函数:代码复用,模块化运维
1. 函数作用
把重复逻辑封装成独立功能块,一次定义、多次调用,让脚本结构更清晰。
2. 函数定义(两种写法)
# 写法1(推荐)
函数名() {
执行逻辑
}
# 写法2
function 函数名() {
执行逻辑
}
4. 函数参数(位置变量)
#!/bin/bash
sayHello() {
echo"hello $1"
}
sayHello linux
sayHello windows
三、综合实战:用户管理菜单脚本(函数 + 循环 + Expect 思想)
封装创建、删除、修改用户 Shell三大功能,做成交互式菜单:
#!/bin/bash
# 创建用户函数
addUser() {
read -p "用户名: " name
ifid$name &> /dev/null; then
echo"用户 $name 已存在"
else
read -p "密码: "pwd
useradd $name
echo"$pwd" | passwd --stdin $name &> /dev/null
echo"用户 $name 创建完成"
fi
}
# 删除用户函数
removeUser() {
ifid$1 &> /dev/null; then
userdel -r $1
echo"用户 $1 已删除"
fi
}
# 修改用户Shell函数
modUser() {
ifid$1 &> /dev/null; then
shell=$(grep "^$1:" /etc/passwd | awk -F: '{print $7}')
echo"当前Shell: $shell"
usermod -s $2$1
echo"已修改为: $2"
fi
}
# 菜单展示
cat << eof
----------用户管理工具----------
1. 创建用户
2. 删除用户
3. 修改用户Shell
4. 退出
eof
# 主循环
whiletrue; do
read -p "请选择操作: " choice
case$choicein
1) addUser ;;
2)
read -p "输入用户名: " name
removeUser $name
;;
3)
read -p "输入用户名: " name
read -p "输入新Shell: " new_shell
modUser $name$new_shell
;;
4) exit 0 ;;
*) echo"输入有误,请重新选择" ;;
esac
done
核心要点总结
- Expect专门解决 Shell 无法自动处理的交互式命令,是批量运维必备工具。
- 最实用写法:Expect 嵌入 Shell 脚本,兼顾灵活性与易用性。
- Shell 函数
- 函数配合
while循环 + case菜单,可快速开发运维小工具。 - 批量免密、自动改密、远程批量执行,是 Expect 最高频生产场景。
结尾互动
本文覆盖 Expect 自动化 + Shell 函数封装两大运维核心技能,从语法到实战一站式掌握,帮你大幅提升批量运维效率。
如果内容对你有帮助,欢迎点赞、在看、转发,让更多运维朋友少走弯路!
关注我,持续更新 Linux 运维自动化、Shell 实战、批量部署、系统优化等硬核干货,一起做高效运维人!

