导航:

一、expect安装、介绍、使用场景
二、expect使用原理
三、expect使用语法
四、expect使用举例
五、expect相关错误处理

- - - - - - - - - 分割线 - - - - - - - - - -
一、expect安装介绍
1.expect命令安装:
安装语句:yum install expect
2.expect命令含义:

expect是一种脚本语言,它能够代替人工实现与终端的交互,主要应用于执行命令和程序时,系统以交互形式要求输入指定字符串,实现交互通信。

3.expect使用场景:

(1)并根据预定标准回答其问题,回答“是”、“否”或将控制权交还给您

(2)远程连接设备并执行自动化操作

(3)主要是一些需要人机交互的地方,如果提前知道应该输入什么指令都可以使用expect 工具

二、expect使用原理

1.原理介绍:

spawn启动指定进程—expect获取指定关键字—send向指定程序发送指定字符—执行完成退出

2、spawn命令介绍:

spawm命令就是用来启动新的进程的。spawn后的send和expect命令都是和spawn打开的进程进行交互的、

3、send命令介绍:

send命令接收一个字符串参数,并将该参数发送到进程,这个过程类似模拟人类输入密码

4、interact命令介绍:

结合spawn、expect、send自动化的完成很多任务,interact命令可以在适当的时候进行任务的干预,比如下载完ftp文件时,仍然可以停留在ftp命令行状态,以便手动的执行后续命令

三、expect使用语法

1. expect 启用选项:

-c 执行脚本前先执行的命令,可多次使用
-d debug模式,可以在运行时输出一些诊断信息,与在脚本开始处使用exp_internal 1相似。
-D 启用交换调式器,可设一整数参数。
-f 从文件读取命令,仅用于使用#!时。如果文件名为"-",则从stdin读取(使用"./-"从文件名为-的文件读取)。
-i 交互式输入命令,使用"exit"或"EOF"退出输入状态
-- 标示选项结束(如果你需要传递与expect选项相似的参数给脚本时),可放到#!行:#!/usr/bin/expect --
-v 显示expect版本信息
2.expect命令参数:

spawn 交互程序开始,执行后面的命令或程序。需要进入到expect环境才可以执行,不能直接在shell环境下直接执行
set timeout n 设置超时时间,表示该脚本代码需在n秒钟内完成,如果超过,则退出。用来防止ssh远程主机网络不可达时卡住及在远程主机执行命令宕住。如果设置为-1表示不会超时
set 定义变量
$argv expect脚本可以接受bash的外部传参,可以使用[ lindex $argv n ]n为0表示第一个传参,为1表示第二个传参,以此类推
expect 从交互程序进程中指定接收信息, 如果匹配成功, 就执行send的指令交互;否则等待timeout秒后自动退出expect语句
send 如果匹配到expect接受到的信息,就将send中的指令交互传递,执行交互动作。结尾处加上\r表示如果出现异常等待的状态可以进行核查
exp_continue 表示循环式匹配,通常匹配之后都会退出语句,但如果有exp_continue则可以不断循环匹配,输入多条命令,简化写法。
exit 退出expect脚本
expect eof spawn进程结束后会向expect发送eof,接收到eof代表该进程结束
interact 执行完代码后保持交互状态,将控制权交给用户。没有该命令执行完后自动退出而不是留在远程终端上
puts 输出变量

四、expect使用举例

 1.expect脚本实现ssh自动登录远程服务器

#!/usr/bin/expect

spawn ssh mrswhite@192.168.37.9
expect "*password:"
send "test20221007\r"
expect "*#"
interact

expect expect_demo1.sh 执行查看运行结果:

2.expect脚本实现ssh自动登录远程服务器(通用脚本,手动输入参数

#!/usr/bin/expect

if {$argc < 3} {
puts "Usage:cmd <host> <username> <password>"
exit 1
} set timeout -1
set host [ lindex $argv 0 ]
set username [ lindex $argv 1 ]
set password [ lindex $argv 2 ] spawn ssh $username@$host
expect "*password*" {send "$password\r"}
interact

./expect_demo2.sh 192.168.37.9 mrswhite  test20221007  执行查看运行结果:

 3.在shell 中嵌套expect

通过expect嵌套shell使用语句在shell内直接执行,任何这样可以实现更多的功能

#!/bin/bash
user="mrswhite"
host="192.168.37.9"
password="test20221007"
/usr/bin/expect << EOF
set time 20
spawn ssh $user@$host
expect {
"*yes/no" { send "yes\r"; exp_continue }
"*password:" { send "$password\r" }
}
expect "*#"
send "pwd\r"
expect "*#"
send "df -h\r"
expect "*#"
send "exit\r"
interact
expect eof
EOF

 五、相关问题解决

1.invalid command name "/usr/bin/expect"

解决方案:此时是使用bash脚本嵌套了expect代码,所以执行采用以下两种方式都可以

./expect_demo3.sh
sh expect_demo3.sh

2.invalid command name ":" 转义问题

解决方案:send里面的内容中的括号[]有问题,不能使用[],将其去除或者添加转义字符

send "cat 20221007.txt | awk -F : '{print $2}'"
send "cat 20221007.txt | awk -F \[:\] '{print $2}'\r"

liunx之expect简介的更多相关文章

  1. expect简介和使用例子

    expect简介和使用例子   expect简介 expect是一款自动化的脚本解释型的工具. expect基于tcl脚本,expect脚本的运行需要tcl的支持. expect对一些需要交互输入的命 ...

  2. Linux Expect 简介和使用实例

    expect简介和使用实例 1 expect 简介 expect 是用来进行自动化控制和测试的工具. 主要是和交互式软件telnet ftp passwd fsck rlogin ssh tip 等进 ...

  3. liunx之expect操作详解

    导航: 一.expect安装.介绍.使用场景二.expect使用原理三.expect使用语法四.expect使用举例五.expect相关错误处理 - - - - - - - - - 分割线 - - - ...

  4. Linux批量部署工具Expect

    既然没有遇到过,做好准备总是好的.这是自己送给自己的话,现在运维做自动话越来越多,自己就学以下,记录笔记.目前主流的有puppet.Expect.pssh等等,今天就用Expect做自动部署和日常管理 ...

  5. Linux下的expect

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

  6. expect自动应答

    expect脚本 1. expect简介 expect是一个用来处理交互的命令.借助Expect,我们可以将交互过程写在一个脚本上,使之自动化完成. expect(自动应答) 基于TCL(Tool C ...

  7. shell脚本 字串截取 正则表达式

    字串处理 子串截取方法一:使用${}表达式格式:echo ${x:起始位置:长度}(起始位置编号从0开始,可省略) 方法二:使用expr substr格式:expr substr "$x&q ...

  8. expect-调试模式的使用

    1.expect简介 Expect是一种TCL扩展性的语言,主要用于完成系统交互方面的功能,比如SSH.FTP等,这些程序都需要手工与它们进行互动,而使用Expect就可以模拟人手工互动的过程,是一种 ...

  9. Linux Expect自动化交互脚本简介

    相关资料 维基百科:Expect SourceForge:The Expect Home Page TCL脚本言语简介 由于Expect是建立在TCL语言基础上的一个工具,因此首先检查一些TCL常见语 ...

随机推荐

  1. vue2升级vue3:Vue Demij打通vue2与vue3壁垒,构建通用组件

    如果你的vue2代码之前是使用vue-class-component 类组件模式写的.选择可以使用 https://github.com/facing-dev/vue-facing-decorator ...

  2. 哈希-hash

    一. 概念 1.引例 有线性表(1,75,324,43,1353,90,46,-  ) 目的:查找值为90的元素 常见做法: 1.通过一维数组进行遍历查找 (依次比较)( O(n) ) 2.如果关键字 ...

  3. MySQL客户端工具的使用与MySQL SQL语句

    MySQL客户端工具的使用 1.MySQL程序的组成 客户端 mysql:CLI交互式客户端程序 mycli:CLI交互式客户端程序;使用sql语句时会有提示信息 mysql_secure_insta ...

  4. JavaWeb--HTTP与Maven

    前言 Java Web 其实就是一个技术的总和,把Web看成一个容器而已主要使用JavaEE技术来实现.在加上各种中间件. 整个javaWeb阶段的内容通过实际的案例贯穿学习, 所涉及到的技术知识点会 ...

  5. 从-99打造Sentinel高可用集群限流中间件

    接上篇Sentinel集群限流探索,上次简单提到了集群限流的原理,然后用官方给的 demo 简单修改了一下,可以正常运行生效. 这一次需要更进一步,基于 Sentinel 实现内嵌式集群限流的高可用方 ...

  6. ahooks 中那些控制“时机”的hook都是怎么实现的?

    本文是深入浅出 ahooks 源码系列文章的第五篇,该系列已整理成文档-地址.觉得还不错,给个 star 支持一下哈,Thanks. 本文来探索一下 ahooks 是怎么封装 React 的一些执行& ...

  7. [游记]CSP 2021 J/S

    这一次,也许是我的OI生涯的转折点了--能过,学习OI的时间就不会减少:但不能过,就会减少学习OI的时间-- 上午(S组) 6:00起床.去吃早餐,结果因为边喝粥边喝牛奶导致肚子疼.(我在这里劝大家, ...

  8. Shell第一章《变量》

    shell前言 什么是shell shell-'壳' 命令解释器,一种应用程序 shell语言特点 SHELL语言是指UNIX操作系统的命令语言,同时又是该命令语言的解释程序的简称. Shell本身是 ...

  9. 【NOI P模拟赛】(要素过多的标题)(容斥原理)

    题面 0 题目背景 [ 数   据   删   除 ] _{^{[数\,据\,删\,除]}} [数据删除]​ 1 题目描述 在执行任务时,收集到了 n n n 份能源,其中第 i i i 份的能量值是 ...

  10. [CSP day1T3]树上的数

    题面 题解 这道题由于是求字典序最小的,所以要贪心地枚举数字,然后找可以走到的编号最小的点,处理这条路径. 这条路径有一些特性. 以下是特别精炼的结论: 所以一旦选好了路径,这些边的先后顺序就被定死了 ...