千家信息网

Shell脚本基础篇——Expect免交互工具

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,本次博客结构Expect概述Expect安装方法Expect基本命令Expect执行方式Demo实例Expect概述expect是一款自动化的脚本解释型的工具。它基于tcl脚本,其运行需要tcl的支持
千家信息网最后更新 2026年11月03日Shell脚本基础篇——Expect免交互工具

本次博客结构

  1. Expect概述
  2. Expect安装方法
  3. Expect基本命令
  4. Expect执行方式
  5. Demo实例

Expect概述

expect是一款自动化的脚本解释型的工具。它基于tcl脚本,其运行需要tcl的支持。expect对一些需要交互输入的命令很有帮助,比如ssh ftp scp telnet。

在远程登录linux服务器的时候,ssh命令需要手工输入密码,当登录多台机器的时候就会非常繁琐。expect就可以根据设定的规则,自动帮我们输入密码,大大节省了时间。

Expect安装方法

通常系统中不会安装expect,需要手动进行安装

系统为Centos时:

yum install expect -y

Expect基本命令

Timeout:指定超时时间,默认为10s

​ 当timeout -1时代表永不超时

Send:向进程发送字符串,模拟用户输入

​ 通常后面会跟"\r"代表回车换行

Spawn:启动进程,并追踪后续命令

Expect:对进程进行捕捉(只能捕捉spawn启动的进程)

​ 判断上次输出结果里是否包含指定的字符串

Interact:将控制权交回控制台

$argv参数数组:接受从bash传递的参数

​ 参数从0开始,代表第一个参数

Expect执行方式

分为两种主要执行方式:直接在expect解释器中进行执行、结合"<<"下一位的分界符进行嵌入执行。

直接执行
[root@localhost~]#more a.sh#!/usr/bin/expect       //导入expect解释器    set timeout 20      //20秒超时时间    set hostname [lindex $argv 0]       //追加参数0,加载第1位置    set password [lindex $argv 1]       //追加参数1,加载第2位置    spawn ssh root@$hostname    expect {                   "(yes/no)"                      //捕获关键字            {send"yes/r";exp_continue}      //输入yes,继续下一步            "*password"     //参数2            {send"$password\r"}     //模拟人工输入    }interact                               //交回控制权回终端
嵌入执行

这里解释一下"<<"的用法:

​ 当shell看到"<<"的时候,它就会知道下一个词是一个分界符。在该分界符以后的内容都被当作输入,直到shell又看到该分界符(位于单独的一行)。这个分界符可以是你所定义的任何字符串。

"EOF"与"-EOF"两种分界符的不同:

​ "EOF"没有容错率,一旦结尾的分界符存在空格或者制表符,就会导致脚本报错。

​ "-EOF"有一定的容错率,结尾的分界符可以允许存在制表符。

[root@localhost~]#more b.sh#!/bin/bash                                       //导入bash解释器    hostname=$1    password=$2    /usr/bin/expect<<-EOF                        //将EOF作为分界符,下面所有操作均停留在当前终端    spawn ssh root@${hostname}                   //启动进程,开始追踪ssh命令    expect {        "(yes/no)"        {send "yes\r";exp_continue}        "*password"        {send"$password\r"}    }    expect "*]#"    send "exit\r"    expect eof                                 //等待分界符结束EOF                                            //另一位分界符,代表操作结束
Demo实例

直接执行Demo

#!/usr/bin/expect #超时时间  set timeout 20log_file test.log log_user 1#参数传入set hostname [lindex $argv 0]set password [lindex $argv 1]#追踪命令spawn ssh root@$hostname#捕捉信息并且匹配,免交互执行expect {        "Connection refused" exit        "service not known" exit        "(yes/no)"        {send "yes\r";exp_continue}        "*password"         {send "$password\r"}}#控制权交给控制台执行interactexit

效果如下

嵌入执行Demo

#!/bin/bashuser=$1password=$2#非交互命令放在expect外useradd $user#开始进行交互expect <<-EOFspawn passwd $userexpect "新的*"send "${password}\r"expect "重新*"send "${password}\r"expect eof;EOF#以上为脚本实际内容

效果如下:

参数 命令 输入 进程 控制 解释 脚本 代表 时间 字符 字符串 控制权 方式 时候 解释器 位置 内容 制表符 实例 密码 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 喔噻互联网科技有限公司 苏州找大状互联网科技有限公司 重生之互联网科技帝国 互联网科技深圳 金诺互联网科技 互联网科技ppt模板 常德市电业局互联网科技部 华服互联网科技官网 中化能源互联网科技招聘 互联网科技商业 东莞新华互联网科技学校 佛山市翊博互联网络科技有限公司 华夏恒生科技与互联网科技 高科技互联网发展前景如何 威龙国际互联网科技公司 合肥互联网科技公司公章图片 每天都有哪些好的互联网科技 互联网科技包装股份有限公司上市 萌小萌互联网科技河南有限公司 互联网的黑科技实验室 喔噻互联网科技 深圳互联网络科技有限公司 亿账通互联网科技 融贸通互联网科技 上游互联网科技 青岛中康互联网医疗科技有限公司 互联网科技中介 江阴互联网智能科技产品进口 杭州披云加互联网科技有限公司 互联网领先科技成果宣传视频
0