Linux之expect命令

2023-10-29

expect 工具介绍

expect 命令介绍:

  • expect 工具是一个根据脚本与其他交互式程序进行交互。通过在脚本中设定期望值和响应值进行交互操作。主要应用于执行命令和程序时,系统以交互形式要求输入指定字符串,实现交互通信。

  • 解释型语言提供分支和高级控制结构引导对话。此外,用户可以在需要时直接进行控制和交互,然后将控制权返回给脚本。

  • 简单来说,expect工具可以控制、处理输入,输出流,然后提供自动填写数据等需要用户交互式输入的数据的地方实现自动化处理。Expect就是为了处理“自动交互”的工具。

expect 工作原理:

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

expect 应用场景:

  • 运行 fsck,并根据预定标准回答其问题,回答“是”、“否”或将控制权交还给您。

  • 远程连接设备并执行自动化操作

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

基本语法:

[root@localhost ~]# vim test.exp				=>	一般将expect脚本的后缀命名为".exp"


#!/usr/bin/expect			=>	expect的解析器,与shell中的#!/bin/bash类似
set timeout n				=>	设置超时时间n秒,表示下面的代码需在n秒钟内完成,如果超过,则退出。用来防止ssh远程主机网络不可达时卡住及在远程主机执行命令宕住
set name "12345"			=>	set设置变量,name的值为123456


spawn command1 command2..				=>	执行命令,也可以将变量作为命令输入
expect{									=>	接受执行命令返回的信息

"accept1" {send "instruction1\r"; exp_continue}						=>	匹配到accest1,发送instruction1 指令并且\r 回车执行

"accept2" {send "instruction2\r"; exp_continue}			=>	匹配到accest2,发送instruction2 指令并且\r 回车执行,exp_continue表示循环匹配

"accept3" {send "\r"; exp_continue}									=>	匹配到accept3表示直接回车执行

"accept4" {send "$name\r"}								=>	匹配到accept4,将变量值作为指令,并且回车执行
}




注意如果需要匹配的全部是多项,需要在最后再增加一项"Cleaning up" { send "\r"}
在这里插入图片描述

expect 启用选项:

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

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 输出变量

基本语法

单一分支模式:

#!/usr/bin/expect
set timeout 30
spawn command			=>	启动一个进程,执行command命令
expect "Match message" {send "instruction1\r"}		=>	命令执行后返回交互信息,send键入交互指令
或
expect "Match message"
send "instruction1\r"
expect eof			=>	执行完后结束该进程

多分支模式:

#!/usr/bin/expect
set timeout 30
spawn command
exect {
"Match message1" { send "instruction1\r";exp_continue}		=>	exp_continu表示可以多次匹配
"Match message2" { send "instruction2\r";exp_continue }
"Match message3" { send "\r"}		=>	代表直接回车选择默认选项
...
}
interact			=>	不退出,保持交互状态

expect 使用

自动登录ssh执行命令

# vim test.exp


#!/usr/bin/expect
set host [ lindex $argv 0 ]
set ip [ lindex $argv 1 ]
set passwd [ lindex $argv 2 ]
set cmd [ lindex $argv 3 ]

if {$argc < 4} {
    puts "Usage:cmd <hostname> <ipaddress> <password> <cmd>"
    exit 1
}
set timeout 20

spawn ssh -l $host $ip  $cmd
expect "password"
send "$passwd\r"
expect eof			=>	注意:就算 这里是interact也不会以保持交互状态



执行:
	# chmod +x test.exp
	# ./test.exp 10.1.1.20 root toor /root/a.sh# expect test.exp 10.1.1.20 root toor /root/a.sh

在shell 中嵌套expect

  • 注意:前面有-EOF

使用expect -c的嵌套调用:

#!/bin/bash
$ip=10.1.1.15
$user=root
$pass=toor

/usr/bin/expect <<-EOF

set timeout 20

spawn ssh $user@$IP
expect {
 "yes/no" { send "yes\r"; exp_continue }
 "password"  { send "$pass\r" }
}

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

Linux之expect命令 的相关文章

随机推荐

  • Android内存压力测试工具(memtester移植)

    该文章转载于 android用memtester内存压力测试 W歹匕示申W的博客 CSDN博客 Android内存压力测试工具 memtester移植 甜牛奶蛋糕的博客 CSDN博客 android 内存压力测试 DRR参考配置OK之后 首
  • 当下,最适合地产人的副业来了

    人无远虑 必有近忧 对于这两年的地产人来说 更是如此 大裁员 大降薪 叠加yi情的反复侵扰 地产人的生存处境似乎越来越糟糕 你会发现身边只能靠着工资养家的人 在行业动荡期无疑是被动和焦虑的 还担心突如其来的裁员 挣钱不易 人 总得提前为自己
  • Netty的并发编程实践2:volatile的正确使用

    长久以来大家对于volatile如何正确使用有很多的争议 既便是一些经验丰富的Java设计师 对于volatile和多线程编程的认识仍然存在误区 其实 volatile的使用非常简单 只要理解了Java的内存模型和多线程编程的基础知识 正确
  • Qt:实现子线程发送信号父线程切换图片

    mainwindow h中代码 ifndef MAINWINDOW H define MAINWINDOW H include
  • SAP之FIORI(7)-MVC加载模式

    SAP之FIORI 7 MVC加载模式 MVC 是Model View Controller的简称 用于将程序的数据 界面展示和用户交互分离 通过这种分离 可以简化开发 以及让某部分变动的时候 不需要影响其他部分 从而降低耦合 Model
  • 深度学习:CSPNet

    深度学习 CSPNet 前言 解决的问题 Method 目前主流网络存在的问题 Partial Dense Block Partial Transition Layer Exact Fusion Model 实验 前言 CSPNet 是作者
  • WEB开发django-视图-CBV

    1 简历 在这里我们使用路由匹配视图类 而不是视图函数 2 路由 urls py from django urls import path re path include from app01 import views urlpattern
  • Topaz Gigapixel AI 中文汉化版是一款由Topaz Labs公司开发的图片无损放大软件

    Topaz Gigapixel AI 中文汉化版是一款由Topaz Labs公司开发的图片无损放大软件 第一个也是唯一一个使用人工智能功能扩展图像的桌面应用程序 同时添加自然细节以获得惊人的效果 使用深度学习技术 Topaz Gigapix
  • Matlab 单位阶跃响应曲线三维图、上升时间、峰值时间、最大过调量和调整时间

    1 Matlab作单位阶跃响应曲线的三维图 定义闭环系统传递函数如下 H s 1 s 2 2 zeta s 1 Matlab作单位阶跃响应曲线的三维图 标准二阶系统响应曲线 wn 1 t 0 0 2 10 zeta 0 0 2 0 4 0
  • 浅谈Linux设备虚拟化技术的演进之路

    PART 01 序言 设备虚拟化技术 一直是云计算领域最重要的基础技术之一 我们在虚拟机里面看到的形形色色的设备 比如 网卡 磁盘 键盘 鼠标等 都离不开这项技术的帮助 这篇文章 我们将从技术演进的角度来谈一谈 Linux 现有的以及即将到
  • 初始Vue

    初始Vue 1 想让Vue工作 就必须创建一个Vue实例 且要传入一个配置对象 2 root容器里得到代码依然符合html规范 只不过混入了一些特殊的Vue语法 3 root 容器里的代码被称为 Vue模板 先有容器 后有实例 1 模板通过
  • oracle rac数据库常用运维sop

    oracle RAC数据库日常巡检工作一下六步骤 1 检查操作系统本地磁盘空间 主要查看操作系统 的空间使用情况 超过70 要注意 2 检查Oracle数据库RAC集群服务状态 除了ora gsd服务状态为OFFLINE 其他的服务正常状态
  • Latex 添加关键字keywords

    无论是自己写的模板还是下载的模板没有keywords newcommand keywords 1 textbf Keywords 1 keywords keywords1 keywords2 keywords3 加上全文模板 documen
  • Diverse Image Style Transfer via Invertible Cross-Space Mapping

    可逆的跨空间映射实现多样化的图像风格传输 摘要 图像风格迁移可以将艺术风格迁移到任意照片上 以创建新颖的艺术图像 尽管风格迁移本质上是一个不适定问题 但现有方法通常假设某种唯一结果 而无法捕获潜在可能的完整分布 本文提出一个多样化的图像风格
  • MongoDB资料汇总

    MongoDB是一个基于分布式文件存储的数据库 由C 语言编写 旨在为WEB应用提供可扩展的高性能数据存储解决方案 它的特点是高性能 易部署 易使用 存储数据非常方便 主要功能特性有 面向集合存储 易存储对象类型的数据 模式自由 支持动态查
  • 基于 ThinkPHP5 + Bootstrap 的后台开发框架 FastAdmin

    FastAdmin是一款基于 ThinkPHP5 Bootstrap 的极速后台开发框架 主要特性 基于Auth验证的权限管理系统 支持无限级父子级权限继承 父级的管理员可任意增删改子级管理员及权限设置 支持单管理员多角色 支持目录和控制器
  • OpenCV中的Shi-Tomasi角点检测器

    OpenCV中的Shi Tomasi角点检测器 1 效果图 2 源码 参考 上一篇博客介绍了Harris角点检测器 这篇博客将介绍另一个角点检测器 Shi Tomasi角点检测器 Shi Tomasi角点检测器是Harris角点检测器的优化
  • Java配置39-搭建ELK服务器

    目录 1 服务器环境 2 安装JDK 3 安装elasticsearch 2 修改配置文件 3 修改系统参数 4 设置资源参数 5 设置用户资源参数 6 创建数据和日志目录 7 启动elasticsearch 4 安装logstash 1
  • React的生命周期

    目录 16 3之前的生命周期 16 3之后的生命周期 1 React生命周期阶段 2 在React中网络请求在哪个生命周期中发起 16 3之前的生命周期 16 3之后的生命周期 1 React生命周期阶段 前 React 16 8 的 命周
  • Linux之expect命令

    Linux之expect命令 expect 工具介绍 基本语法 expect 使用 自动登录ssh执行命令 在shell 中嵌套expect expect 工具介绍 expect 命令介绍 expect 工具是一个根据脚本与其他交互式程序进