千家信息网

Shell编程之Expect免交互语句详解

发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,Expect概述Expect是建立在tcl基础上的一个工具,Expect 是用来进行自动化控制和测试的工具。主要解决shell脚本中不可交互的问题。对于大规模的linux运维很有帮助。在linux运维
千家信息网最后更新 2025年12月02日Shell编程之Expect免交互语句详解

Expect概述

Expect是建立在tcl基础上的一个工具,Expect 是用来进行自动化控制和测试的工具。主要解决shell脚本中不可交互的问题。对于大规模的linux运维很有帮助。
在linux运维和开发中,我们经常需要远程登录服务器进行操作,登录的过程是一个交互的过程,可能会需要输入(yes/no)password等信息。为了模拟这种输入,可以使用Expect脚本。

Expect安装

yum install expect -y

基本命令

send:

向进程发送字符串,用于模拟用户的输入。该命令不能自动回车换行,一般要加\r (回车)

expect:

expect的一个内部命令,判断上次输出结果里是否包含指定的字符串,如果有则立即返回,否则就等待超时时间后返回。只能捕捉由spawn启动的进程的输出。

spawn:

启动进程,并跟踪后续交互信息。

interact:

执行完成后保持交互状态,把控制权交给控制台。

Timeout:

指定超时时间,过期则继续执行后续指令;
单位是:秒;
timeout -1为永不超时;
默认情况下,timeout是10秒。

exp_ continue:

允许expect继续向下执行指令

send_ user:

回显命令,相当于echo

$argv参数数组:

Expect脚本可以接受从bash传递的参数,可以使用[lindex $argv n]获得,n从0开始,分别表示第一个第二个,第三个...参数。

expect eof:

Expect脚本必须以interact或expect eof结束,执行自动化任务通常expect eof就够了,expect eof是在等待结束标志。由spawn启动的命令在结束时会产生一个eof标记,expect eof即在等待这个标记。

Expect语法

单一分支语句

expect "password:" {send "mypassword\r";}

多分支模式语法

expect "aaa" {send "AAA\r"}expect "aaa" {send "AAA\r"}expect "aaa" {send "AAA\r"}

send命令不具备回车换行功能,一般要加\r或\n。

expect{"aaa"{send"AAA\r"}"bbb"{send"BBB\r"}"ccc"{send"CCC\r"}}

只要匹配上了任何一个,执行项硬的send语句后退出该expect语句。

expect {"aaa" {send "AAA\r";exp_continue}"bbb" {send "BBB\r";exp_continue}"ccc" {send "CCC\r"}}

exp_continue表示继续后面的匹配,如果匹配了aaa,执行完send语句后还要继续向下匹配bbb。

Expect执行方式

直接执行:

通过执行脚本直接免交互进行ssh登录

[root@localhost opt]# vim demo01.sh #!/usr/bin/expect                                         //Expect二进制文件的路径set timeout 20                                            //超时时间20,单位:秒log_file test.log                                         //日志文件log_user 1                                                //日志用户个数set hostname [lindex $argv 0]set password [lindex $argv 1]              //定义变量,通过参数将内容传入,类似于位置变量spawn ssh root@$hostname              //追踪命令expect {                "Connection refused" exit           //捕捉服务被拒绝信息,并执行exit退出免交互                "service not konwn" exit             //捕捉未知服务或连接地址错误的信息,并执行exit退出免交互        "(yes/no)"                                     //捕捉询问是否连接的的信息        {send "yes\r";exp_continue}     //输入"yes",回车,并继续进行匹配        "*password"                                //捕捉密码输入的信息        {send "$password\r"}                //通过变量输入密码,回车,不继续匹配。}interact                                               //保持交互状态,把控制权交给控制台

嵌入执行:

通过脚本创建用户,再免交互给用户设置密码。

[root@localhost opt]# vim demo02.sh#!/bin/bashuser=$1                                                                          //定义位置变量$1为userpassword=$2                                                                //定义位置变量$2为passworduseradd $user                                                              //添加用户/usr/bin/expect <<-EOF                                              //Expect开始标志,标准性输入,等同于stdinspawn passwd $userexpect {        "新的 密码:"        {send "$password\r";exp_continue}        "重新输入新的 密码:"        {send "$password\r"}}EOF                                                                           //Expect结束语句,EOF前后不能有空格
输入 信息 命令 脚本 语句 变量 密码 用户 控制 参数 位置 时间 进程 服务 登录 分支 单位 字符 字符串 工具 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 数据库ifexists 临汾市农业局网络安全培训 服务器能启动但检测不到磁盘 宝塔数据库管理后台用户名和密码 关于网络安全应急准备阶段 软件开发公司购销合同做清单 软件开发 英语缩写 数据库热备步骤 aps期刊数据库拒绝访问 软件开发用不用高数 基岩版生存1.17服务器ip 星辰互联网科技官方旗舰店 数据库技术以后能做什么 数据库安全测试主要涉及漏洞 网络安全和信息化 三个事关 绿色环保软件开发的市场机会 软件开发的基本方法包括 龙之谷服务器名称 馆藏外文期刊数据库 网络技术工资武汉 网络安全辩论赛正方观点 天津网络时间服务器供应商云主机 c 从数据库读出照片 如何打开endnote数据库 国家网络技术试题及解析 单仁网络安全 轻量云服务器是虚拟主机升级版吗 计算机网络技术专升本视频 网络安全课堂游戏设计 校园网络安全的实例学校
0