Linux学习之expect操作详解

2023-10-31

一、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自动登录远程服务器

1

2

3

4

5

6

7

#!/usr/bin/expect

spawn ssh mrswhite@192.168.37.9

expect "*password:"

send "test20221007\r"

expect "*#"

interact

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

#!/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内直接执行,任何这样可以实现更多的功能

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

#!/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

五、expect相关错误处理

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

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

1

2

./expect_demo3.sh

sh expect_demo3.sh

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

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

1

2

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux学习之expect操作详解 的相关文章

  • 拆分字符串以仅获取前 5 个字符

    我想去那个地点 var log src ap kernelmodule 10 001 100 但看起来我的代码必须处理 ap kernelmodule 10 002 100 ap kernelmodule 10 003 101 等 我想使用
  • 从 PL/SQL 调用 shell 脚本,但 shell 以 grid 用户而非 oracle 身份执行

    我正在尝试使用 Runtime getRuntime exec 从 Oracle 数据库内部执行 shell 脚本 在 Red Hat 5 5 上运行的 Oracle 11 2 0 4 EE CREATE OR REPLACE proced
  • 如何通过替换为空页映射来取消映射 mmap 文件

    Linux 用户空间有没有办法用空页面 映射自 dev null 或者可能是一个空页面 重复映射到从文件映射的页面的顶部 对于上下文 我想找到这个 JDK bug 的修复 https bugs openjdk java net browse
  • 应用程序无缘无故地被杀死。怀疑 BSS 高。如何调试呢?

    我已经在CentOs6 6中成功运行我的应用程序 最近 硬件 主板和内存 更新了 我的应用程序现在毫无理由地被杀死 root localhost PktBlaster PktBlaster Killed 文件和 ldd 输出 root lo
  • 如何在 Linux 中编写文本模式 GUI? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 当我编写脚本 程序时 我经常想弹出一个简单的文本 gui 来提示输入 我该怎么做 例如 来自 Shel
  • nginx 上的多个网站和可用网站

    通过 nginx 的基本安装 您的sites available文件夹只有一个文件 default 怎么样sites available文件夹的工作原理以及如何使用它来托管多个 单独的 网站 只是为了添加另一种方法 您可以为您托管的每个虚拟
  • Linux TUN/TAP:无法从 TAP 设备读回数据

    问题是关于如何正确配置想要使用 Tun Tap 模块的 Linux 主机 My Goal 利用现有的路由软件 以下为APP1和APP2 但拦截并修改其发送和接收的所有消息 由Mediator完成 我的场景 Ubuntu 10 04 Mach
  • 为什么内核需要虚拟寻址?

    在Linux中 每个进程都有其虚拟地址空间 例如 32位系统为4GB 其中3GB为进程保留 1GB为内核保留 这种虚拟寻址机制有助于隔离每个进程的地址空间 对于流程来说这是可以理解的 因为有很多流程 但既然我们只有 1 个内核 那么为什么我
  • 大多数 Linux 系统头文件与 C++ 兼容吗?

    大多数 Linux 系统头文件 API C 兼容吗 今天我试图做这样的事情 include
  • 我可以从命令行打印 html 文件(带有图像、css)吗?

    我想从脚本中打印带有图像的样式化 html 页面 谁能建议一个开源解决方案 我使用的是 Linux Ubuntu 8 04 但也对其他操作系统的解决方案感兴趣 你可以给html2ps http user it uu se jan html2
  • 无法从 jenkins 作为后台进程运行 nohup 命令

    更新 根据下面的讨论 我编辑了我的答案以获得更准确的描述 我正在尝试从詹金斯运行 nohup 命令 完整的命令是 nohup java jar home jar server process 0 35 jar prod gt gt var
  • 如何有效截断文件头?

    大家都知道truncate file size 函数 通过截断文件尾部将文件大小更改为给定大小 但是如何做同样的事情 只截断文件的尾部和头部呢 通常 您必须重写整个文件 最简单的方法是跳过前几个字节 将其他所有内容复制到临时文件中 并在完成
  • linux perf:如何解释和查找热点

    我尝试了linux perf https perf wiki kernel org index php Main Page今天很实用 但在解释其结果时遇到了困难 我习惯了 valgrind 的 callgrind 这当然是与基于采样的 pe
  • 无法使用 wget 在 CentOS 机器上安装 oracle jdk

    我想在CentOS上安装oracle java jdk 8 我无法安装 java jdk 因为当我尝试使用命令安装 java jdk 时 root ADARSH PROD1 wget no cookies no check certific
  • 如何在 Linux shell 中将十六进制转换为 ASCII 字符?

    假设我有一个字符串5a 这是 ASCII 字母的十六进制表示Z 我需要找到一个 Linux shell 命令 它将接受一个十六进制字符串并输出该十六进制字符串代表的 ASCII 字符 所以如果我这样做 echo 5a command im
  • 两种情况或 if 哪个更快? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我必须制作一个 非常 轻的脚本 它将接受用户的选项并调用脚本中的函数来执行一些任务 现在我可以使用 IF 和 CASE 选项 但我想知道两
  • 如何将目录及其子目录中的所有 PDF 文件复制到一个位置?

    如何全部复制PDF文件从目录及其子目录到单个目录 实际上还有更多的文件 并且深度有些任意 假设四个目录的最大深度是公平的 我想这些文件需要重命名 如果a pdf例如 位于多个目录中 因为我会adding https ebooks stack
  • 如何在shell中输出返回码?

    我正在尝试通过调用自定义 shell 脚本sh bin sh c myscript sh gt log txt 2 gt 1 echo 该命令的输出是创建的后台进程的 PID 我想指导 bin sh保存返回码myscript sh到某个文件
  • 在 Linux 上使用多处理时,TKinter 窗口不会出现

    我想生成另一个进程来异步显示错误消息 同时应用程序的其余部分继续 我正在使用multiprocessingPython 2 6 中的模块来创建进程 我试图用以下命令显示窗口TKinter 这段代码在Windows上运行良好 但在Linux上
  • 使用 sh 运行 bash 脚本

    我有 bash 脚本 它需要 bash 另一个人尝试运行它 sh script name sh 它失败了 因为 sh 是他的发行版中 dash 的符号链接 ls la bin sh lrwxrwxrwx 1 root root 4 Aug

随机推荐

  • Java-主流框架—(10)Spring-微服务SpringBoot

    1 SpringBoot概述 SpringBoot提供了一种快速使用Spring的方式 基于约定优于配置的思想 可以让开发人员不必在配置与逻辑业务之间进行思维的切换 全身心的投入到逻辑业务的代码编写中 从而大大提高了开发的效率 Spring
  • 如何在mysql中创建学生信息表_数据库怎么创建学生信息表

    大家好 我是时间财富网智能客服时间君 上述问题将由我为大家进行解答 数据库创建学生信息表的方法是 1 新建表 单击数据库 studentDb 前图标 然后右键 表 文件包 单击 新建表 选项 进入 新建表 窗口 2 设定表标识字段id 填写
  • Vue项目安装core-js报错解决方案

    报错问题如下 出现这这种情况的多半是core js的版本不对 解决方案如下 亲测多次有效 1 安装cnpm npm install g cnpm registry https registry npm taobao org 2 查看cnpm
  • 浏览器页面后退,重新运行ajax

    问题描述 在浏览器页面后退时 也就是说你点击链接到一个页面 然后又点击后退按钮回到刚才的页面 结果发现jQuery的ajax GET请求不再执行了 解决方法 禁用ajax缓存 ajaxSetup cache false 吐槽 为了解决这个问
  • java中的String

    Java中的String类是一种复合数据类型 比较String类的是否相等也有2种办法 和equals 两种 String是一个系统定义的类 不是基本数据类型 有关字符串处理的方法非常多 有时候两个 一样 的字符串做相等的比较运算时会得到t
  • 华为OD机试真题-查找充电设备组合【2023Q1】【JAVA、Python、C++】

    题目描述 某个充电站 可提供n个充电设备 每个充电设备均有对应的输出功率 任意个充电设备组合的输出功率总和 均构成功率集合P的1个元素 功率集合P的最优元素 表示最接近充电站最大输出功率p max的元素 输入描述 输入为3行 第1行为充电设
  • 时序预测

    时序预测 MATLAB实现Bayes贝叶斯优化LSTM 长短期记忆神经网络 时间序列预测 预测效果一览
  • React - Websocket

    组件didMount调用 Store createWebSocket Math random Store url ws window backend server slice 7 apronMapWebsocket 这个要与后端提供的相同
  • C++函数重载、重写与重定义

    演示代码 include
  • 探索Java8——CompletableFuture: 组合式异步编程

    文章目录 Future接口 Future接口的局限性 使用 CompletableFuture 使用并行流对请求进行并行操作 使用 CompletableFuture 发起异步请求 如果你的意图是实现并发 而非并行 或者你的主要目标是在同一
  • https到底是如何防篡改的

    1 前言 https是一个老生常谈的话题了 也是面试过程种经常甚至必然会问到的一个问题 但当问到https为什么安全的时候 很多人的回答就是简单的回一句 因为他加密了 然后就没然后了 你也相当于啥都没回答出来 2 我为什么要写这篇文章呢 网
  • select底部增加固定按钮

  • 基于SSM的校园快递一站式服务系统设计与实现

    末尾获取源码 开发语言 Java Java开发工具 JDK1 8 后端框架 SSM 前端 采用JSP技术开发 数据库 MySQL5 7和Navicat管理工具结合 服务器 Tomcat8 5 开发软件 IDEA Eclipse 是否Mave
  • 统计学R语言 第五章课后练习 置信区间

    5 1 计算一个总体均值的置信区间 大样本 gt exercise5 1 lt read csv D 289250 统计学 基于R 第4版 例题和习题数据 统计学 基于R 第4版 例题和习题数据 公开资源 exercise chap05 e
  • 用python网络爬虫爬取英雄联盟英雄图片

    用python爬虫爬取lol皮肤 这也用python网络爬虫爬取lol英雄皮肤 忘了是看哪个大神的博客 由于当时学了下就一直放在这儿 现在又才拿出来 再加上马上要考二级挺忙的 代码基本上是没改 还望大神原谅 本人小白 没学过Python 只
  • Pay Cycle related record

    select delete from sysadm ps pycycl stat where pay cycle ACH and pay cycle seq num gt 30 select delete from sysadm ps PY
  • Golang初入编程-踩坑笔记(3)- 并发,优雅关闭

    主函数也是线程 在不使用sync WaitGroup的情况下 需要main等待goroutine完成 不然main完成就没了 sync是synchronizing 使 同步 的缩写 wg done 最好加defer chan需要make c
  • Sqli-labs之Less-26和Less-26a

    Less 26 GET 基于错误 您所有的空格和注释都属于我们 根据提示我们知道这一关过滤了空格和注释 实际上过滤的远远不止这些 我们来看下源码 可以确认一下 id 231 确认过滤了 id or1 确认过滤了or id 1 确认过滤了多行
  • C语言 fstat函数

    系列文章目录 文章目录 系列文章目录 前言 一 stat系统调用 二 fstat 1 功能 2 相关函数 3 头文件 4 函数声明 5 描述 6 返回值 7 例子 三 struct stat结构体 前言 一 stat系统调用 stat系统调
  • Linux学习之expect操作详解

    一 expect安装介绍 1 expect命令安装 安装语句 yum install expect 2 expect命令含义 expect是一种脚本语言 它能够代替人工实现与终端的交互 主要应用于执行命令和程序时 系统以交互形式要求输入指定