当前位置: 首页 > news >正文

shell 脚本expect

expect 是什么
expect - programmed dialogue with interactive programs(与互动程序进行程序对话)

  • 定义脚本执行的 shell
    #!/usr/bin/expect -f
    定义的是执行 expect 可执行文件的链接路径(或真实路径),功能类似于bash等shell功能。

  • set timeout 10
    设置超时时间,单位是秒,如果设为 timeout -1,表示永远不超时。

  • spawn
    spawn 进入 expect 环境后才能执行内部命令,不能直接在默认的 shell 环境种进行执行
    主要功能:传递交互指令

  • expect
    主要:判断输出结果是否包含某项字符串,如果没有设置超时时间,则立即返回,如果设置了超时时间,则等待一段时间后返回。

  • send
    执行交互动作,就是想要执行的命令。
    命令字符串结尾要加上“\r”,如果出现异常等待的状态可以进行核查。

  • interact
    执行完后保持交互状态,把控制权交给控制台,如果不添加这一项,交互命令会自动推出。

  • exp_continue
    The command exp_continue allows expect itself to continue executing rather than returning as it normally would. By default exp_continue resets the timeout timer. The -continue_timer flag prevents timer from being restarted. (See expect for more information.)
    命令exp_continue允许expect 重复执行,而不是直接返回。默认情况下,exp_continue重置超时计时器。-continue_timer 标志阻止计时器重新启动。

  • $argv
    expect 脚本可以接受从bash传递过来的参数,可以使用 [lindex $argv n]获得,n从0开始,分别表示第1个到第n个参数。

  • eof
    The pattern eof introduces an action that is executed upon end-of-file. A separate eof pattern may also follow the output flag in which case it is matched if an eof is detected while writing output. The default eof action is “return”, so that interact simply returns upon any EOF.

希望实现场景:

  • ssh 到目标主机后检查目标文件夹是否存在,如果存在先删除后创建,如果不存在则创建。
  • 退出ssh交互界面,使用scp将本地zip文件上传到目标主机。
  • ssh 到目标主机后解压zip文件到指定目录。
# 首次连接目标主机需要输入yes
root@curtis-Aspire-E5-471G:/home/curtis/write_code# ssh 192.168.0.101
The authenticity of host '192.168.0.101 (192.168.0.101)' can't be established.
ECDSA key fingerprint is SHA256:gsW8+dL+II4nP2kSburZz0NKi6yR4A3SnrEJVFsA+w0.
Are you sure you want to continue connecting (yes/no/[fingerprint])?# 需要输入密码的提示
root@curtis-Aspire-E5-471G:/home/curtis/write_code# ./func.exp rlk 192.168.0.101 123
spawn ssh rlk@192.168.0.101
rlk@192.168.0.101's password:

按照下下边这种写法会发现,ssh成功之后会马上退出,退出的原因是send命令之后没有expect,命令将不会被执行。

#!/usr/bin/expect -fset host_name [lindex $argv 0]
set ip_addr [lindex $argv 1]
set pwd [lindex $argv 2]spawn ssh $host_name@$ip_addr
expect {"*yes/no*" { send "yes\r"; exp_continue }"*password:" { send "$pwd\r" }
}
root@curtis-Aspire-E5-471G:/home/curtis/write_code# ./func.exp rlk 192.168.0.101 123
spawn ssh rlk@192.168.0.101
rlk@192.168.0.101's password: root@curtis-Aspire-E5-471G:/home/curtis/write_code#

如果期望ssh后进行命令行交互,可以在末尾添加interact

这里我希望ssh上去之后判断某个文件夹是否存在,如果存在先删除,然后在创建,如果不存在则直接创建。
如何判断文件夹是否存在

root@curtis-Aspire-E5-471G:/home/curtis/write_code# file shell
shell: directory
root@curtis-Aspire-E5-471G:/home/curtis/write_code# file kkkk
kkkk: cannot open `kkkk' (No such file or directory)

注意事项:如果仅仅有send命令,远端将不执行send对应的命令!!立即退出shell交互界面
如以下例子,仅存在send没有,expect:

#!/usr/bin/expect -fset host_name [lindex $argv 0]
set ip_addr [lindex $argv 1]
set pwd [lindex $argv 2]
set check_dir [lindex $argv 3]
set send_dir [lindex $argv 4]spawn ssh $host_name@$ip_addr
expect {"*yes/no*" { send "yes\r"; exp_continue }"*password:" { send "$pwd\r" }
}
set timeout 3
expect "*rlk@rlk*"send "file $check_dir\r"

结果如下所示:

root@curtis-Aspire-E5-471G:/home/curtis/write_code# ./func.exp rlk 192.168.0.101 123 /home/rlk/curtis /home/curtis/write_code/Tutorials-master.zip
spawn ssh rlk@192.168.0.101
rlk@192.168.0.101's password:
Welcome to Ubuntu 20.04 LTS (GNU/Linux 5.4.0-26-generic x86_64)* Documentation:  https://help.ubuntu.com* Management:     https://landscape.canonical.com* Support:        https://ubuntu.com/advantage* Strictly confined Kubernetes makes edge and IoT secure. Learn how MicroK8sjust raised the bar for easy, resilient and secure K8s cluster deployment.https://ubuntu.com/engage/secure-kubernetes-at-the-edge616 updates can be installed immediately.
332 of these updates are security updates.
To see these additional updates run: apt list --upgradableThe list of available updates is more than a week old.
To check for new updates run: sudo apt update
Failed to connect to https://changelogs.ubuntu.com/meta-release-lts. Check your Internet connection or proxy settingsYour Hardware Enablement Stack (HWE) is supported until April 2025.
Last login: Fri Mar 17 23:00:46 2023 from 192.168.0.105
# ssh成功之后立即退出
rlk@rlk:~$ root@curtis-Aspire-E5-471G:/home/curtis/write_code#

最终实现

#!/usr/bin/expect -fset host_name [lindex $argv 0]
set ip_addr [lindex $argv 1]
set pwd [lindex $argv 2]
set check_dir [lindex $argv 3]
set send_dir [lindex $argv 4]spawn ssh $host_name@$ip_addr
expect {"*yes/no*" { send "yes\r"; exp_continue }"*password:" { send "$pwd\r" }
}
set timeout 3
expect "*rlk@rlk*"send "file $check_dir\r"
expect {"*: directory*" { send "rm -rf $check_dir && mkdir -p $check_dir\r" }"*(No such file or directory)*" { send "mkdir -p $check_dir\r" }
}
# 需要根据删除文件夹大小来调整超时时间
# 所谓超时时间就是等待expect期望结果的时间,如果时间到了,还没有达到预期,就只能退出
set timeout 10
expect "*rlk@rlk*"
send "exit\r"
expect eofspawn scp $send_dir $host_name@$ip_addr:$check_dir
expect {"*yes/no*" { send "yes\r"; exp_continue }"*password:" { send "$pwd\r" }
}
# 需要根据文件大小合理设置超时时间
set timeout 10
expect eofspawn ssh $host_name@$ip_addr
expect {"*yes/no*" { send "yes\r"; exp_continue }"*password:" { send "$pwd\r" }
}
set timeout 3
expect "*rlk@rlk*"send "unzip $check_dir/Tutorials-master.zip -d $check_dir/\r"
set timeout 10
expect "*rlk@rlk*"
send "exit\r"

相关文章:

shell 脚本expect

expect 是什么 expect - programmed dialogue with interactive programs(与互动程序进行程序对话) 定义脚本执行的 shell #!/usr/bin/expect -f 定义的是执行 expect 可执行文件的链接路径(或真实路径),功能类似于bas…...

第十九天 Maven总结

目录 Maven 1. 前言 2. 概述 2.1 介绍 2.2 安装 3. IDEA集成Maven 3.1 集成Maven环境 3.2 创建Maven项目 3.3 Maven坐标详解 3.4 导入maven项目 4. 依赖管理 4.1 依赖配置 4.2 依赖传递 4.3 依赖范围 4.4 生命周期 4.5 插件 Maven 1. 前言 1). 什么是Maven? …...

ESP8266-NodeMCU开发板-------开发板介绍(1)

目录 认识ESP8266-NodeMCU开发板​编辑 GPIO编号与NodeMCU开发板引脚名的区别: ESP8266 GPIO编号与NodeMCU开发板引脚名的对应关系 可用引脚 电压电流限制 特殊引脚情况说明 上拉电阻/下拉电阻 模拟输入 通讯 认识ESP8266-NodeMCU开发板 初识NodeMCU开发板 (第1章-第…...

【测试开发篇3】软件测试的常用概念

目录 一、软件测试的生命周期(5个步骤) ①需求分析(两个角度) 用户角度: 开发人员的角度: ②测试计划 ③测试设计、测试开发 ④执行测试 ⑤测试评估 二、软件测试贯穿项目的整个生命周期的体现 需求分析阶段 计划阶段 设计阶段 编码阶段 …...

javaEE初阶 — JavaScript WebAPI

文章目录什么是 DOMDOM 树获取元素1. querySelector2. querySelectorAll事件1. 事件三要素2. 代码案例获取 / 修改元素内容1. innerHTML获取 / 修改元素属性获取 / 修改表单元素属性获取 / 修改样式属性1. 修改内联样式(修改 style 属性的值)2. 修改元素…...

UE实现地面动态交互效果

文章目录 1.实现目标2.实现过程2.1 SphereMask2.2 材质实现2.3 位置更新3.参考资料1.实现目标 基于SphereMask材质节点实现人物在地面一定范围内的颜色高亮效果。 2.实现过程 实现原理是首先通过,SphereMask材质节点更具计算输出Mask值,其中在球体半径内的输入1,在外部的则…...

如何用自己的数据训练YOLOv5

如何训练YOLOv5 1. Clone the YOLOv5 repository and install dependencies: git clone https://github.com/ultralytics/yolov5.git cd yolov5 pip install -r requirements.txt2. 整理数据,使其适配YOLO训练 Step1:Organize your dataset in the fo…...

【基础算法】数组相关题目

系列综述: 💞目的:本系列是个人整理为了秋招算法的,整理期间苛求每个知识点,平衡理解简易度与深入程度。 🥰来源:材料主要源于代码随想录进行的,每个算法代码参考leetcode高赞回答和…...

MatBox—基于PyQt快速入门matplotlib的教程库

MatBox—基于PyQt快速入门matplotlib的教程库 __ __ _ _ _ _ _ _ _______ _ _ _ | \/ | | | | | | | | |(_)| | |__ __| | | (_) | || \ / | __ _ |…...

go channel使用

go语言中有一句名言&#xff1a; 不要通过共享内存来通信&#xff0c;而应该通过通信来共享内存。 channel实现了协程间的互相通信。 目录 一、channel声明 二、向channel发送数据 三、从channel读取数据 1. i, ok : <-c 2. for i : range c&#xff08;常用&#xff09…...

5. QtDesignStudio中的3D场景

1. 说明&#xff1a; 三维渲染开发是Design Studio的重要功能&#xff0c;且操作方便&#xff0c;设计效率非常高&#xff0c;主要用到的控件是 View3D ,可以在3D窗口中用鼠标对模型直接进行旋转/移动/缩放等操作&#xff0c;也可以为模型设置各种动画&#xff0c;执行一系列的…...

人工智能的几个研究方向

人工智能主要研究内容是&#xff1a;分布式人工智能与多智能主体系统、人工思维模型、知识系统、知识发现与数据挖掘、遗传与演化计算、人工生命、人工智能应用等等。 其中热门研究有以下几种。 一、计算机视觉 就包括图像识别&#xff0c;视频识别&#xff0c;具体应用有人…...

软件测试 - 常见的开发模型和测试模型

1.瀑布模型优点强调开发的阶段性, 强调早期计划及需求调查, 强调产品测试;缺点1. 由于瀑布模型是一种线型结构的模型, 也就意味着前一个阶段结束, 后一个阶段才能开始, 这就导致了风险往往会迟至后期的测试阶段才显露, 因而失去了及早纠正的机会.2. 瀑布模型中测试被后置, 导致…...

从零开始的机械臂yolov5抓取gazebo仿真(四)

Moveit与Gazebo联合仿真 上一篇博客已经将moveit!配置完毕&#xff0c;然而想要让moveit!控制gazebo中的机械臂&#xff0c;还需要进行一些接口的配置。现在我们有的功能包为sunday_description、sunday_moveit_config这两个功能包。且已经配置好xacro文件&#xff0c;本篇内容…...

C++修炼之筑基期第一层——认识类与对象

文章目录&#x1f337;专栏导读&#x1f337;什么是面向对象&#xff1f;&#x1f337;类的引入&#x1f337;什么是类&#x1f337;类的定义方式&#x1f337;类的访问限定符与封装&#x1f33a;访问限定符&#x1f33a;封装&#x1f337;类的作用域&#x1f337;类的实例化&a…...

IT 运营监控工具

在技术复杂性日益增加、业务竞争激烈的挑战以及消费者对服务中断接受度降低的世界中&#xff0c;IT 运营效率已成为增长、利润和成功的关键。IT 宕机的影响在几十年前威胁较小&#xff0c;现在意味着价值数百万美元的损失&#xff0c;有时甚至会损失各种规模的组织的业务和声誉…...

java线程之Thread类的基本用法

Thread类的基本用法1. Thread类的构造方法2. Thread的几个常见属性常见属性线程中断等待一个线程小鱼在上一篇博客详细的讲解了如何创建线程,java使用Thread类来创建多线程,但是对于好多没有相关经验的人来说,比较不容易理解的地方在于操作系统调度的执行过程. 我们通过下面代码…...

【js】多分支语句练习(2)

个人名片&#xff1a; &#x1f60a;作者简介&#xff1a;一名大一在校生&#xff0c;web前端开发专业 &#x1f921; 个人主页&#xff1a;python学不会123 &#x1f43c;座右铭&#xff1a;懒惰受到的惩罚不仅仅是自己的失败&#xff0c;还有别人的成功。 &#x1f385;**学习…...

Redis与MySQL的双写一致性问题

Redis与MySQL的双写一致性问题更新缓存&#xff1f; 删除缓存&#xff1f;先更新缓存再更新数据库先更新数据库&#xff0c;再更新缓存先删除缓存再更新数据库先更新数据库&#xff0c;再删除缓存解决方案1. 重试2. 异步重试2.1 使用消息队列实现重试2.2 Binlog实现异步重试删除…...

Java基础:笔试题

文章目录Java 基础题目1. 如下代码输出什么&#xff1f;2. 当输入为2的时候返回值是多少?3. 如下代码输出值为多少?4. 给出一个排序好的数组&#xff1a;{1,2,2,3,4,5,6,7,8,9} 和一个数&#xff0c;求数组中连续元素的和等于所给数的子数组解析第一题第二题第三题第四题方案…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...

Vite中定义@软链接

在webpack中可以直接通过符号表示src路径&#xff0c;但是vite中默认不可以。 如何实现&#xff1a; vite中提供了resolve.alias&#xff1a;通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...

rknn toolkit2搭建和推理

安装Miniconda Miniconda - Anaconda Miniconda 选择一个 新的 版本 &#xff0c;不用和RKNN的python版本保持一致 使用 ./xxx.sh进行安装 下面配置一下载源 # 清华大学源&#xff08;最常用&#xff09; conda config --add channels https://mirrors.tuna.tsinghua.edu.cn…...