expect学习笔记及实例详解

### expect学习笔记及实例详解 #### 一、expect简介与基本语法 **expect** 是一个基于 **Tcl** 的程序,主要用于自动化交互式命令。它最初由 Don Libes 在 1990 年代初开发,目的是为了解决通过自动化方式与需要交互式输入的程序进行交互的问题。例如,自动登录 SSH 会话或自动应答安装向导等场景。expect 的设计灵感来自于 **Tcl** 语言,并且很多语法与其相似。 ##### 1.1 首行声明 - **格式**: `#!/usr/bin/expect` - **作用**: 指定脚本使用的解释器为 `/usr/bin/expect`。这是运行 expect 脚本的标准方法。 ##### 1.2 使用 `spawn` - **格式**: `spawn [command]` - **作用**: 启动一个新的子进程来执行指定的命令。`spawn` 命令启动的进程是 expect 可以监控的对象。例如,`spawn sudotouch testfile` 表示启动一个执行 `sudotouch testfile` 命令的新进程。 ##### 1.3 使用 `expect` - **格式**: `expect [pattern]` - **作用**: 监听 `spawn` 命令启动的进程产生的输出,直到输出符合指定的模式为止。`expect` 可以捕获以下几种类型的输出: - **标准输入提示信息**: 如 "password:" - **EOF (End Of File)**: 进程结束时返回。 - **Timeout**: 当指定的时间内未接收到预期的输出时触发。 ##### 1.4 使用 `send` 和 `send_user` - **格式**: - `send [string]` - `send_user [string]` - **作用**: - `send`: 发送指定的字符串到由 `spawn` 启动的进程。 - `send_user`: 类似于 shell 中的 `echo` 命令,用于显示信息给用户,并不会发送到 `spawn` 的进程。 #### 二、示例详解 下面通过一个具体的示例来展示如何使用 expect 自动创建 Linux 用户: ##### 2.1 创建用户的 expect 脚本 - **文件名**: `account.sh` - **执行方式**: `./account.sh newaccount` - **脚本内容**: ```tcl #!/usr/bin/expect set password "mypasswd" set timeout 60 if {$argc != 1} { send "usage: ./account.sh $newaccount\n" exit } set user [lindex $argv [expr $argc - 1]] spawn sudo useradd -s /bin/bash -g mygroup -m $user expect { "assword" { send_user "sudo now\n" send "$password\n" exp_continue } eof { send_user "eof\n" } } spawn sudo passwd $user expect { "assword" { send "$password\n" exp_continue } eof { send_user "eof\n" } } spawn sudo smbpasswd -a $user expect { "assword" { send "$password\n" exp_continue } eof { send_user "eof\n" } } ``` ##### 2.2 代码解析 - **第 3 行**: 定义密码变量 `password`。 - **第 4 行**: 设置超时时间为 60 秒,默认情况下 timeout 为 10 秒。 - **第 6 行**: 检查命令行参数个数是否为 1(除了脚本本身)。如果不是,则发送使用信息并退出。 - **第 11 行**: 从命令行参数获取用户名。 - **第 13 行**: 使用 `spawn` 执行 `sudo useradd` 命令来创建新用户。这里指定了用户的 Shell、所属组和主目录。 - **第 15 行**: `expect` 语句用来等待 `sudo` 提示输入密码,发送密码后继续执行后续操作。 - **第 17 行**: 发送用户提示信息。 - **第 18 行**: 发送密码给 `sudo` 进程。 - **第 19 行**: 使用 `exp_continue` 来继续执行当前的 `expect` 块中的后续条件。 - **第 21 行**: 匹配 EOF,表示进程结束。 - **第 27 行**: 更改新创建用户的密码。 - **第 39 行**: 添加用户到 Samba 服务。 ##### 2.3 注意事项 - **参数处理**: `$argc` 和 `$argv` 用于处理命令行参数。 - **spawn 命令**: 根据实际情况调整 `spawn` 后面的命令。 - **expect 的并行处理**: 对于交互式命令,最好使用并行处理方式,以适应不同的情况。 - **expecteof**: 必须匹配 EOF,否则可能会导致意外的结果。 #### 三、扩展知识 - **expect 的应用场景**: expect 适用于自动化测试、远程管理、数据备份等多种场景。 - **expect 的局限性**: 由于 expect 依赖于文本匹配,因此对于图形界面或者加密传输的应用不太适用。 - **高级功能**: expect 支持复杂的正则表达式、定时器、文件 I/O 等高级特性。 ### 结论 通过本文的介绍,我们了解到 expect 是一个强大的工具,可用于自动化处理交互式的命令。通过学习其基本语法和示例,我们可以更好地利用 expect 来提高工作效率,特别是在 Linux 系统管理方面。此外,还提供了一些注意事项和扩展知识,帮助读者更全面地掌握 expect 的使用方法。



























- jidejian19912013-09-12一般,百度一下到处都是
- hereisanan2014-04-09非常不错的资料,学习

- 粉丝: 4
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- Chang-LeHung-CSCore-45440-1753619287877.zip
- 项目管理学练习题C.doc
- 网络直播联播平台广告方案.pptx
- 智能控制-06神经网络理论基础.ppt
- 锋范软件国土行业电子政务系统信息化解决方案.doc
- 最新版班主任的网络培训学习总结.doc
- 基于S7-200PLC的坐标式机械手控制系统设计.doc
- 培训教材现代市场营销和网络营销.pptx
- 2023年电大网络实用技术基础考试资料.docx
- 基于某BP神经网络的故障诊断方法.doc
- 工程项目管理表格.doc
- 基因工程药物的分离纯化.pptx
- 黑马程序员-PHP-课程同步笔记day22:数据库操作语言.doc
- 编程高手的进阶之路-.doc
- 通信公司IP城域网设备测试规范.doc
- 北京百草堂中医项目管理概述.pptx


