当前位置:首页>Linux>Linux 运维自动化必备:Expect 交互自动化 + Shell 函数封装实战

Linux 运维自动化必备:Expect 交互自动化 + Shell 函数封装实战

  • 2026-09-06 13:23:14
Linux 运维自动化必备:Expect 交互自动化 + Shell 函数封装实战

技术弄巷

读完仅需

5
分钟

记得星标公众号

前言

在 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 10
    :设置交互超时时间
  • spawn
    :启动要自动化的交互式命令
  • expect
    :捕获终端输出提示
  • send
    :向程序发送输入内容(\n代表回车)
  • expect 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 函数名() {
    执行逻辑
}

3. 函数调用

直接写函数名即可:

函数名

4. 函数参数(位置变量)

  • $1
    :第1个参数
  • $2
    :第2个参数
  • 以此类推
#!/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

核心要点总结

  1. Expect
    专门解决 Shell 无法自动处理的交互式命令,是批量运维必备工具。
  2. 最实用写法:Expect 嵌入 Shell 脚本,兼顾灵活性与易用性。
  3. Shell 函数
    用于封装重复逻辑,实现代码复用、模块化、易维护。
  4. 函数配合 while循环 + case菜单,可快速开发运维小工具。
  5. 批量免密、自动改密、远程批量执行,是 Expect 最高频生产场景。
  6. 函数参数用 $1、$2...传递,简单高效。

结尾互动

本文覆盖 Expect 自动化 + Shell 函数封装两大运维核心技能,从语法到实战一站式掌握,帮你大幅提升批量运维效率。

如果内容对你有帮助,欢迎点赞、在看、转发,让更多运维朋友少走弯路!

关注我,持续更新 Linux 运维自动化、Shell 实战、批量部署、系统优化等硬核干货,一起做高效运维人!

最新文章

随机文章