免交互expect

news2024/12/26 20:57:42

免交互

  • 一、expect
    • 1、环境安装
    • 2、基本命令
      • 2.1 脚本解释器
      • 2.2 spawn(跟踪)
      • 2.3 expect (捕捉)
      • 2.4 send(发送)
      • 2.5 结束符
      • 2.7 exp_continue
      • 2.8 send user
      • 2.9 接收参数
  • 二、ssh无交互登录到远程服务器
    • 1、登录完成,等待用户操作
    • 2、登录完成执行一段命令后自动退出
  • 三、关于变量
    • 1、定义和引用变量
    • 2、操作演示【1】
    • 3、操作演示【2】(嵌入式模式)
  • 四、总结

一、expect

建立在tcl语言基础上的一个工具,常被用于进行自动化控制和测试,解决shell脚本中交互相关的问题。

expect 的执行过程

1、追踪指令:spawn  表示开启一个追踪
2、捕捉提示进行交互的关键词
3、传入交互指令,回车执行

1、环境安装

expect它是一个程序,所以需要进行安装,才能使用

yum -y install expect

2、基本命令

2.1 脚本解释器

expect脚本中首先引入文件,表明使用的是哪一个shell

#!/usr/bin/expect

2.2 spawn(跟踪)

spawn后面通常跟一个Linux执行命令,表示开启一个会话,启动进程,并跟踪后续交互信息

例如:swpawn   passwd  root

2.3 expect (捕捉)

判断上次输出结果中是否包含指定的字符串,如果有则立即返回,否则就等待超时时间后返回,只能捕捉由spawn启动的进行的输出,用于接收命令执行后的输出,然后和期望的字符串匹配。

2.4 send(发送)

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

方式一:
expect "密码" {send "123123\r"}   #send跟expect放在同一行,需要将send用{}引起来

方式二:
expect "密码"
send "123123\r"  #send跟expect分两行写

方式三:
expect    #只要匹配了其中一个情况,执行相应的send语句后退出该expect语句
"密码1"{send "111111\r"}
"密码2"{send "222222\r"}
"密码3"{send "333333\r"}

2.5 结束符

expect eof

  • 表示交互结束,等待执行结束,退回到原用户,与spawn对应。
  • 比如切换到root用户,expect脚本默认的是等待10s,当执行完命令后,默认停留10s后,自动切换了原用户

interact

  • 执行完成后保持交互状态,把控制权交给控制台,会停留在目标终端而不会退回到原终端,这个时候就可以手工操作了,interact后的命令不起作用,比如interact后添加exit,并不会退出root用户。

  • 而如果没有interact则登录完成后会退出,而不是留在远程终端上。
    使用interact会保持在终端而不会退回到原终端,

  • 比如切换到root用户,会一直在root用户状态下;比如ssh到另一服务器,会一直在目标服务器终端,而不会切回的原服务器。

注意:expect eof   和  interact  只能二选一

2.7 exp_continue

exp_continue附加与某个expect判断项之后,可以使该项匹配后,还能继续匹配该expect 判断语句内的其它项,exp_continue类似于控制语句中的contunue语句。表示允许expect继续向下执行指令。

例如:
expect {
     "(yes/no)"{send "yes/r";exp_continue;}
     "*password"{set timeout 300;send "123123\r";}
}

注意: 使用exp_continue时,如果跟踪像passwd这样输入密码就结束进程的命令。expect{}外不要加上expect eof ,因为spawn进程结束后默认向expect发送eof,会导致后面的expect eof 执行报错

2.8 send user

send_user表示回显命令,相当于echo

2.9 接收参数

expect脚本可以接受从bash命令行传递的参数,使用[lindex $argv n]获得。其中n从0开始,分别表示第一个,第二个,第三个…参数。例:

set hostname [ lindex $argv 0]
相当于hostname=$1
set password [ lindex $argv 1]
相当于password=$2

二、ssh无交互登录到远程服务器

1、登录完成,等待用户操作

【前面需要yum -y install expect进行安装expect命令】

#!/usr/bin/expect
#这里需要用expect自己的解释器,不要写成bash,否则无法识别

#开启一个程序,这个程序是shh远程登录
spawn ssh root@20.0.0.56

#捕捉内容,当出现password的时候,就会向程序发送mi9ma,默认是不换行的
#所以需要用\rlai 回车换行
expect {
       "password"
       {send "123\r";}
}

#交互,否则会直接退出远程服务器
interact 

2、登录完成执行一段命令后自动退出

503

三、关于变量

1、定义和引用变量

用set关键字定义变量,变量名和变量值中间用空格分开,其它用法与shell脚本一致

例如:直接复制
#!/usr/bin/expect
set user  root
set ip 20.0.0.56
set pass 123

例如:引用位置变量
#!/usr/bin/expect
set user root
set ip [lindex $argv 0]   #设置第一个位置变量为ip
set pass [lindex $argv 1] #设置第二个位置变量为登录密码

2、操作演示【1】

504

505

3、操作演示【2】(嵌入式模式)

操作演示【1】中引用位置变量,定义位置变量比较麻烦。我们可以结合shell脚本中的方式实行嵌入式模式,将expect过程融入shell当中,方便执行和处理在shell脚本那种调用expect

注意:使用嵌入式时,expect捕捉的内容不要和send发送写在同一行,不然它会判断为都是捕捉的内容

实例1:使用免交互进行登录别的用户

#!/bin/bash
#shell环境中定义变量
ip=$1
pass=$2

#嵌入式使用expect免交互
/usr/bin/expect <<-EOF
spawn ssh root@$ip
expect {
"(yes/no)?"
{send "yes\r";exp_continue}
"password"
{send "${pass}\r";}
}
set timeout -1
expect eof
EOF

实例2:使用免交互创建用户,免交互修改密码

#!/bin/bash
name=$1
useradd $name

/usr/bin/expect <<-EOF

spawn passwd $name
expect {
"密码"
{send "123\r";exp_continue}
"新的密码"
{send "123\r";}
}
EOF

四、总结

expect 为免交互过程,主要流程为:

  • 先用spawn进行跟踪一个命令

  • 再使用expect进行捕捉需要需要交互的关键词

  • 最后使用send 进行发送交互内容(主要需要回车)

最后可以选择是否使用:expect_eof(默认停留10秒) 或者interact (永久停留)进行决定交互后是否退出交互后的终端,在使用expect_eof时,可以再加上set timeout 300s 命令决定停留交互终端的时间,或者直接使用 set timeout -1 ,这样和interact用法一样。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/559289.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android 自定义弹窗 附带搜索过滤功能

项目场景&#xff1a; 前两天要求在项目中添加个小功能&#xff0c;今天正好有时间随手写了一个小demo&#xff0c;过程分享给大家。以后如果有此类需求可直接移植使用。 需求是因为在下拉列表中选择一个项作为数据显示在界面上&#xff0c;但是所有的选项很多&#xff0c;下翻…

软件著作权容易搞吗?

没有代码、材料&#xff0c;只有一个软件名字就能拿证&#xff0c;你说容易不… 当然这是对我们软著一级代理来说&#xff0c;每年申请下证几千个软著。下面说说下证要点给大家避坑。人群覆盖高新企业、大学生、大学老师、互联网公司。 软件著作权想要轻松下证&#xff0c;必…

《微服务实战》 第十六章 Spring cloud stream应用

前言 https://github.com/spring-cloud/spring-cloud-stream-binder-rabbit 官方定义Spring Cloud Stream是一个构建消息驱动微服务的框架。应用程序通过inputs或者outputs来与Spring Cloud Stream中binder对象交互。通过我们配置来binding(绑定),而Spring Cloud Stream的bin…

lwIP更新记06:申请 TCP 控制块(tcp_alloc)

从 lwIP-2.0.0 开始&#xff0c;申请 tcp_pcb 控制块的逻辑发生了变化。 每个 tcp 连接都必须有一个 PCB 控制块 &#xff0c;使用函数 tcp_new() 申请 PCB 控制块。tcp_new 函数代码如下所示&#xff1a; /*** Creates a new TCP protocol control block but doesnt place it…

进阶篇丨链路追踪(Tracing)很简单:常见问题排查

作者&#xff1a;涯海 经过前面多篇内容的学习&#xff0c;想必大部分同学都已经熟练掌握分布式链路追踪的基础用法&#xff0c;比如回溯链路请求轨迹&#xff0c;定位耗时瓶颈点&#xff1b;配置核心接口黄金三指标告警&#xff0c;第一时间发现流量异常&#xff1b;大促前梳…

公司刚来的测试,00后真卷,上班还没2年,跳到我们公司起薪20k....

都说00后躺平了&#xff0c;但是有一说一&#xff0c;该卷的还是卷。 这不&#xff0c;前段时间我们公司来了个00后&#xff0c;工作都没两年&#xff0c;跳槽到我们公司起薪18K&#xff0c;都快接近我了。后来才知道人家是个卷王&#xff0c;从早干到晚就差搬张床到工位睡觉了…

neo4j图形数据库

目录 1. neo4j简介1.1 什么是图形数据库1.2 什么是neo4j1.3 neo4j的特性1.4neo4j的优点1.5 neo4j的构建元素 2. 安装部署2.1 环境说明2.2 下载安装包2.3 解压安装包2.4 配置安装jdk环境2.5 配置neoj4全局变量2.6 修改neo4j配置文件2.7 服务基本操作2.8 测试访问 3. 使用DBeaver…

上门洗车小程序软件开发所需要的功能有哪些呢?

相信很多企业及投资者都想开发一款属于自己的小程序系统。那么一款专业好用的上门洗车小程序软件开发所需要的功能有哪些呢&#xff1f; 1. 用户注册与登录。 用户可以通过手机号码或微信账号进行注册和登录。注册后可以查看历史订单、评价技师、参加活动等。 …

浅析EasyCVR视频能力在自然灾害风险预警场景中的应用意义

一、方案背景 我国是自然灾害多发的国家&#xff0c;夏季也是灾害多发季节&#xff0c;山洪、泥石流、洪涝、冰雹、飓风、地震等自然灾害每年都给国家经济带来巨大的损失。建设自然灾害风险预警视频监控系统&#xff0c;实现对自然灾害的可视化预警监测和监管&#xff0c;并提…

分布式事务的21种武器 - 2

在分布式系统中&#xff0c;事务的处理分布在不同组件、服务中&#xff0c;因此分布式事务的ACID保障面临着一些特殊难点。本系列文章介绍了21种分布式事务设计模式&#xff0c;并分析其实现原理和优缺点&#xff0c;在面对具体分布式事务问题时&#xff0c;可以选择合适的模式…

【业务架构】业务驱动的推荐系统相关技术总结

什么是推荐系统 推荐系统是一种基于用户历史行为和属性信息为用户推荐个性化内容的技术。而业务驱动的推荐系统&#xff0c;是指根据业务需求&#xff0c;将推荐系统集成进业务流程中&#xff0c;通过推荐系统提高业务效率、提升用户体验等目的。以下是一些相关实现技术。 用户…

Vue--》Vue3打造可扩展的项目管理系统后台的完整指南(一)

今天开始使用 vue3 ts 搭建一个项目管理的后台&#xff0c;因为文章会将项目的每一个地方代码的书写都会讲解到&#xff0c;所以本项目会分成好几篇文章进行讲解&#xff0c;我会在最后一篇文章中会将项目代码开源到我的GithHub上&#xff0c;大家可以自行去进行下载运行&…

C语言隐藏自己源码成lib静态库的和使用lib静态库的方法

首先从头开始创建一个新项目&#xff1a; 这个sub.c内的文件内容很简单&#xff0c;就写一个减法函数 // 定义一个减法函数&#xff0c;传入两个整数&#xff0c;返回差 int sub(int x, int y) { return x - y; } // 定义一个减法函数&#xff0c;传入两个整数&#xff0…

7. 数据库MySQL

本文介绍了数据库mysql的安装配置过程&#xff0c;以及通过VsCode调用数据库实现一些功能 一、安装 如果之前安装过&#xff0c;或者安装失败。清除MySQL缓存并重新安装&#xff1a;运行以下命令以清除所有MySQL缓存文件&#xff0c;并重新安装它们 sudo apt-get remove --pu…

JAVA基础(各种类)

Object类 1、Object类中有许多方法是用native修饰的&#xff0c;这些方法是本地方法&#xff0c;用C语言实现。 2、Object类的一些方法&#xff1a; clone()方法&#xff1a;需要继承Clonable接口&#xff0c;并覆写clone()&#xff0c;修改为public权限&#xff0c;原来为p…

Halcon中从两组点的对应关系生成仿射矩阵,及思考原理和代码实现

有几个算子有点类似&#xff0c;看了下区别 1.vector_to_rigid( : : Px, Py, Qx, Qy : HomMat2D) 2.vector_to_similarity( : : Px, Py, Qx, Qy : HomMat2D) 3.vector_to_aniso( : : Px, Py, Qx, Qy : HomMat2D) vector_to_rigid 这个是刚性变换&#xff0c; 只有旋转和平移…

参考企业微信日程 通过vue+elementUi编写一个按月统计会议的日程计划组件

这个组件的话 需要三个第三方依赖 npm install --save chinese-lunar-calendar sass sass-loader element-uisass因为我这里 还是习惯写sass样式 毕竟真的方便啊 chinese-lunar-calendar 是一款将日期转为农历的工具 element-ui主要是表格真的方便 在 项目src下的main.js入口…

如何学好人工智能?

“在主流的视频直播教学之外&#xff0c;直接与老师在课件上互动能够更快地让我进入学习状态。” 大家的时间都很宝贵&#xff0c;当我们好不容易下定决心要学习一门新知识时&#xff0c;各种影响学习的噪声会在本不富裕的耐心上大打折扣&#xff0c;万事开头难变成了真理。特别…

[技术分享]Android平台实时音视频录像模块设计之道

实现背景 录像有什么难的&#xff1f;无非就是数据过来&#xff0c;编码保存mp4而已&#xff0c;这可能是好多开发者在做录像模块的时候的思考输出。是的&#xff0c;确实不难&#xff0c;但是做好&#xff0c;或者和其他模块有非常好的逻辑配合&#xff0c;确实不容易。 好多…

考研复试第十六天:合并果子 【哈佛曼树】

前置知识 哈佛曼树&#xff1a;我们先来复习一下啥叫做哈佛曼树 1.背景 我们有下面这样一个字符串需要编码&#xff0c;就是将下面的字符转为二进制。我们采用的方法是前缀编码&#xff0c;用一颗树的叶节点来放字符。 2.前缀编码 编码是咋样的呢&#xff1f;看下面这个例子…