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

Shell Expect自动化交互(示例)

Shell Expect自动化交互

日常linux运维时,经常需要远程登录到服务器,登录过程中需要交互的过程,可能需要输入yes/no等信息,所以就用到expect来实现交互。

关键语法

❶[#!/usr/bin/expect]

这一行告诉操作系统脚本里的代码使用那一个shell来执行。这里的expect其实和linux下的bash、windows下的cmd是一类东西。 注意:这一行需要在脚本的第一行。

❷set

expect 默认的超时时间是10秒,通过 set 命令可以设置会话超时时间,若不限制超时时间则应设置为-1。

例如:set timeout 300 // 表示会话超时时间为300s

例如:set timeout -1 /设置/永不超时,常用设置

备注:为什么要设置超时时间,因为默认时间是10s,则在交互执行的过程中,很可能会断开,导致任务执行没完成就终止。我司的一个从远程ftp上同步文件的计划任务总是执行终止,后来设置了超时时间为-1就可以了。

❸spawn

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

❹expect

只有spawn执行的命令的执行结果才被expect捕捉到,主要包括标准输入的提示信息、eof和timeout。等待命令提示信息的出现,也就是捕捉用户输入的提示:

➎send

发送需要交互的值,替代了用户手动输入内容;该命令不能自动回车换行,一般要加\r(回车)或者\n

expect "密码"{ send "abc123\r"} //同一行send部分要有{}

❻结束符expect eof/interact

expect eof

这个一定要加,与spawn对应表示捕获终端输出信息终止,类似于if....endif

interact

执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了。如果没有这一句登录完成后会退出,而不是留在远程终端上。

PS:expect脚本必须以interact或expect eof结束,执行自动化任务通常expect eof就够了。

示例

在shell脚本中插入expect命令,格式为如下

示例1:22.sh创建文件夹脚本

#!/bin/sh

expect

spawn ssh 10.1.1.196

expect password {send xxx\n}

send cd /home/cg/hmf_app/test\r

send mkdir newwork\r

send exit\r

expect eof

EOF

示例2:创建文件夹shell脚本

expect

spawn ssh 10.1.1.196

expect password {send xxx\n}

send cd /home/cg/hmf_app/test\r

send mkdir newwork\r

send exit\r

expect eof

EOF

示例3:拷贝文件

expect

set timeout -1

spawn scp root@10.1.1.10:/data/package/casb/$casbzip ./

expect password {send xxx\n}

expect eof

EOF

备注:

EOF

...

EOF

代表一段shell脚本

参考:Shell Expect自动化交互_shell脚本交互自动输入内容-CSDN博客

相关文章:

  • MySQL第二次作业
  • Docker学习笔记(一)概念理解
  • antd Select前端加模糊搜索
  • 位运算(、|、^、~、>>、<<)
  • ArcGIS Pro SDK (七)编辑 12 编辑模版
  • 以智能化为舵手,引领现代计算机系统架构新航向
  • 前端播放RTSP视频流,使用FLV请求RTSP视频流播放(Vue项目,在Vue中使用插件flv.js请求RTSP视频流播放)
  • C# 快速排序算法的详细讲解
  • Python (Ansbile)脚本高效批量管理服务器和安全
  • uniapp开发H5、手机APP、微信小程序 可拖动菜单按钮
  • YOLO10 用分割数据集训练
  • Java 重载和重写
  • qt可点击的QLabel
  • nacos开启鉴权后,springboot注册失败
  • STC89C52RC单片机设计的FM收音机+自动搜台+存储电台(程序+原理图+PCB)
  • [case10]使用RSQL实现端到端的动态查询
  • 《深入 React 技术栈》
  • Consul Config 使用Git做版本控制的实现
  • js递归,无限分级树形折叠菜单
  • Lsb图片隐写
  • python3 使用 asyncio 代替线程
  • Vue.js源码(2):初探List Rendering
  • 初探 Vue 生命周期和钩子函数
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 我的面试准备过程--容器(更新中)
  • 主流的CSS水平和垂直居中技术大全
  • 进程与线程(三)——进程/线程间通信
  • # Apache SeaTunnel 究竟是什么?
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (31)对象的克隆
  • (PADS学习)第二章:原理图绘制 第一部分
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (附源码)php新闻发布平台 毕业设计 141646
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (四)鸿鹄云架构一服务注册中心
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • .NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中(Constrained Execution Regions)
  • .Net6支持的操作系统版本(.net8已来,你还在用.netframework4.5吗)
  • .Net各种迷惑命名解释
  • @ModelAttribute注解使用
  • @RequestParam @RequestBody @PathVariable 等参数绑定注解详解
  • [ Linux Audio 篇 ] 音频开发入门基础知识
  • [ vulhub漏洞复现篇 ] JBOSS AS 4.x以下反序列化远程代码执行漏洞CVE-2017-7504
  • [ 英语 ] 马斯克抱水槽“入主”推特总部中那句 Let that sink in 到底是什么梗?
  • []sim300 GPRS数据收发程序
  • [ACM] hdu 1201 18岁生日
  • [BZOJ 4598][Sdoi2016]模式字符串
  • [C++][数据结构][算法]单链式结构的深拷贝
  • [DevOps云实践] 彻底删除AWS云资源