前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >expect 实现脚本的自动交互

expect 实现脚本的自动交互

作者头像
嵌入式视觉
发布于 2022-09-05 06:15:19
发布于 2022-09-05 06:15:19
1K00
代码可运行
举报
文章被收录于专栏:嵌入式视觉嵌入式视觉
运行总次数:0
代码可运行

Contents

expect 介绍

这篇文章大部分参考这里,expect 的用户网上靠谱的文章实在太少了,导致我没法同时学习多个文章好加以总结,毕竟一家之言还是有所偏驳。

expect 是建立在 tcl 语言基础上的一个自动化交互套件, 在一些需要交互输入指令的场景下, 可通过脚本设置自动进行交互通信。可以将交互过程如:ssh 登录、ftp 登录、scp 复制文件等写在一个脚本上,使之自动化完成。尤其适用于需要对多台服务器执行相同操作的环境中,可以大大提高系统管理人员的工作效率。其交互流程是: spawn 启动指定进程 -> expect 获取指定关键字 -> send 想指定进程发送指定指令 -> 执行完成, 退出。

安装 expect

使用以下代码检测 expect 是否已经安装

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 ls /usr/bin | grep expect 

如果显示为空,则使用以下命令安装

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sudo apt-get install tcl tk expect

expect 命令学习

expect 是基于 tcl 演变而来的,所以很多语法和 tcl 类似,基本的语法如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 首行加上 /usr/bin/expect
# spawn:后面加上需要执行的 shell 命令,比如说 spawn sudo touch testfile;
# expect:只有 spawn 执行的命令结果才会被 expect 捕捉到,因为 spawn 会启动一个进程,只有这个进程的相关信息才会被捕捉到,主要包括:标准输入的提示信息,eof 和 timeout。
# send 和 send_user:send 会将 expect 脚本中需要的信息发送给 spawn 启动的那个进程,而 send_user 只是回显用户发出的信息,类似于 shell 中的 echo 而已。

expect 实际的作用就是监听目标进程的输出(spawn),根据期望输出(expect),进行响应 (send)。学习 expect 工具,实际上学习三个核心指令 spawnexpectsend的使用,这三个指令的具体语法理解见下文。

spawn

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spawn [args] program [args]

用以创建新的进程,并执行给定的程序,后面就可以使用 expect 监听 spawn 创建进程程序的输出。

expect

expect 常用语法(模式-动作)如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
expect [[-opts] pattern body1] ... [-opts] pattern [bodyn]

expect 的参数是一连串的 opts,pattern,body,也就是 expect 可用来监听多个输出,pattern 就是用来匹配期望的输出,一旦匹配上就执行后面的 bodyopts 表示可选。用法示例如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
expect {
      busy {puts busy\n}
      -re "failed|invalid password" {puts failed]\n}  # -re选项表示开启正则匹配
      timeout {puts timeout\n}
      connected
  }

注意,expect 会等待目标进程的输出,然后进行匹配,这个等待的时间默认是10秒,一旦超过这个时间就直接执行下一条指令,我们可以通过设置 timeout 来更改这个时间,set timeout 100 表示等待 100 秒。

send

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
send [-flags] string

将字符串传递给当前进程,这里就是模拟人的输入。

expect eof

expect eof 用以防止 spawn 进程程序执行完就直接退出的情况,有了它,程序会等待 spawn 进程程序结束再退出。由 spawn 启动的程序在结束的时候会产生一个 eof 标示,expect eof 会等待 spawn 进程程序的退出 eof 标示,一旦匹配到 eof 标识就什么也不做,什么也不做,没什么可做也就退出了。 但是,expect 是有默认超时时间的 -10 秒, 如果程序执行时间超过10 秒或更久,显然 expect eof 会超时,程序会直接退出,解决办法就是设置 timeout。对于远程文件备份这种耗时比较长的操作,我们就需要设置 expect 的超时时间。

expect 实例

自动拷贝 scp

scp 远程复制文件(夹)涉及到很多交互式命令,我们不得不人工响应,expect 的出现解决了这个问题,实例脚本如下。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spawn scp -r $Dataset_path ftpdata@47.104.23.88:/mnt/data-4/ftpdata/honggao.zhang/
expect {
  "yes/no" { send "yes\n";exp_continue }
  "password" { send "$password\n" }
}
expect eof

Shell 脚本实现了 scp 复制本地目录到远程服务器,无需我们手动密码,同理 ssh 登录也可类似操作。建议把自动拷贝 scp 功能封装成函数形式,否则你得先 chmod a+x xxx.sh 然后 ./xxx.sh 才能执行脚本成功,下面的自动登录 ssh 实例代码就是封装成函数的形式。

自动登录 ssh

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# ssh waibao server
# wait for upload success
echo "start ssh waibao server"
sshdzd(){
expect <<-EOF
set timeout 1000
spawn ssh $user_name@$server_ip
expect {
  "yes/no" { send "yes\n";exp_continue }
  "password" { send "$password\n" }
}
expect eof
EOF
}
sshdzd

脚本运行成功输出如下:

start ssh waibao server spawn ssh ftpdata@47.104.23.88 ftpdata@47.104.23.88’s password: Last login: Tue Jul 2 21:00:02 2019 from 221.226.80.68 Welcome to Alibaba Cloud Elastic Compute Service !

参考资料

expect自动交互详解 Ubuntu使用Spawn和expect实现ssh自动登陆 Linux中通过expect工具实现脚本的自动交互

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-09-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Linux expect详解
2018-07-11 分类:Linux Shell / 系统运维 / 编程开发 阅读(6670) 评论(0) 
拓荒者
2019/06/21
3.3K0
Linux expect详解
# Linux expect命令详解
在Linux系统中,expect 是一款非常有用的工具,它允许用户自动化与需要用户输入进行交互的程序。本文将深入探讨expect命令的基本语法、使用方法以及一些最佳实践。
修己xj
2023/12/04
4410
# Linux expect命令详解
expect--自动批量分发公钥脚本
1.在使用之前,先安装epel源,yum install expect -y 2.写分发脚本,后缀为exp #!/usr/bin/expect set host_ip [lindex $argv 0]
院长技术
2021/02/19
3590
linux学习第六十九篇:分发系统介绍,expect脚本远程登录,expect脚本远程执行命令,expect脚本传递参数
分发系统介绍 expect可以让我们实现自动登录远程机器,并且可以实现自动远程执行命令。当然若是使用不带密码的密钥验证同样可以实现自动登录和自动远程执行命令。但当不能使用密钥验证的时候,我们就没有办法了。所以,这时候只要知道对方机器的账号和密码就可以通过expect脚本实现登录和远程命令。 expect脚本远程登录 yum install -y expect 自动远程登录 #! /usr/bin/expect set host "192.168.85.132" #要远程登录的机器IP set pass
用户1215343
2018/03/29
1.6K0
linux学习第六十九篇:分发系统介绍,expect脚本远程登录,expect脚本远程执行命令,expect脚本传递参数
Linux 集群免密配置脚本
脚本也俩种方式,一种为手动输入IP列表,第二种通过/etc/host 自动获取 配置的域名列表进行免密配置
Freedom123
2024/03/29
1420
用expect脚本实现Xcode对越狱设备的动态库注入
如果我们想远程登录或者控制一台机器,可以在被操控的设备上安装ssh服务。无论是本地设备使用命令行还是可视化工具都需要预先登录到远程设备中,登录过程需要输入用户名和密码。我们还可以使用scp命令来实现本地设备和远程设备之间的文件拷贝。很多操作系统比如Linux、macOS都内置了ssh服务和客户端相关的功能。要想具体了解ssh可以参考下面几个非常有用的链接:
欧阳大哥2013
2019/05/31
1.1K0
Jenkins结合shell+expect脚本完成线上环境自动构建部署
如果jenkins部署在内网,而生产环境存在DMZ区的话,此方式就不太适合了,需要考虑其它方式来部署升级。
MavenTalker
2023/03/10
7740
Jenkins结合shell+expect脚本完成线上环境自动构建部署
MHA搭建之ssh互信打通脚本
在MySQL搭建MHA高可用架构的时候,需要打通master、slave、以及mha manager之间的ssh互信,通常情况下,运维人员需要手动打通ssh互信,在自动化构建的过程中很不方便。如果可以使用自动化的脚本打通服务器之间的ssh互信,对自动化运维会有很大的帮助。
AsiaYe
2020/09/27
1.1K0
同时管理多台服务器的expect脚本
最近通过exploring expect书籍,简单学了下expect脚本语言,这个脚本语言是tcl语言的扩展,用来解决一些工具无法自动交互的问题,如ssh登录时,无法在命令就指定密码等。下面是利用expect来实现管理多台服务器的简单例子: #!/usr/bin/expect #purpose:auto run command on multiple servers #how to: mms <user> <cmd> #write by zhumaohai. #blog:http://www.centos.
小小科
2018/05/02
1.6K0
Linux 命令(239)—— expect 命令
expect 是一个自动化交互套件,主要应用于执行命令时,以交互形式按照要求输入指定字符串,实现自动交互。
恋喵大鲤鱼
2023/01/07
3.2K0
详解自动交互命令expect,免去手动输入!
#概述 expect是一个用来实现自动交互功能的软件套件,是基于TCL的脚本编程工具语言,方便学习,功能强大
老油条IT记
2020/09/04
4.2K0
expect shell 脚本记录
expect是一个自动化交互套件,主要应用于执行命令和程序时,系统以交互形式要求输入指定字符串,实现交互通信。
郭顺发
2021/12/17
8620
expect自动交互脚本:简化你的自动化任务
在日常的 Linux 系统管理和自动化任务处理中,经常会遇到需要自动登录到服务器并执行一系列命令的情况,例如批量部署更新、监控日志等。手动操作不仅耗时耗力,而且效率低下,特别是当涉及到多台服务器时。
南山竹
2024/06/28
2690
expect自动交互脚本:简化你的自动化任务
Linux 下自动应答工具 Expect 使用指南
现代的 Shell 对程序提供了最小限度的控制(程序的开始/停止/关闭等),而把交互的特性留给了用户。这意味着有些程序,你不能非交互的运行,比如说 passwd 命令。有一些程序可以非交互的运行,但在很大程度上丧失了灵活性,比如说 fsck 命令。这表明 Unix 的工具构造逻辑开始出现问题。Expect 恰恰填补了其中的一些裂痕,解决了在 Unix 环境中长期存在着的一些问题。
iMike
2021/03/10
1.8K0
shell脚本快速入门之-----深入介绍Expect免交互
spawn 启动追踪 —> expect 匹配捕捉关键字 ——> 捕捉到将触发send 代替人为输入指令—> interact /expect eof
不吃小白菜
2020/09/03
2.4K0
expect 实现自动化命令下发
随着业务增长需要管理的主机数量也随之增多,在很多情况下需要对批量的主机进行配置变更,然而一台台的修改主机的配置显然是不现实的,也不符合当下运维趋势。能用机器实现的就不要以人肉的方式做无用功,向自动化运维方向迈进。接下来介绍如何使用 expect 实现对批量 Linux 主机和网络设备的命令下发配置。
Kevin song
2020/12/22
8280
Linux expect 自动交互脚本用法
最近用到自动交互脚本进行数据库备份,以前虽然也有用来使用 ftp 远程获取文件,还来没有系统记录过,趁这次机会总结一下。
Li_XiaoJin
2022/06/12
1.8K0
Linux之expect工具免交互式shell脚本执行
Linux之expect工具是一个根据脚本与其他交互式程序进行交互。通过在脚本中设定期望值和响应值进行交互操作。主要应用于执行命令和程序时,系统以交互形式要求输入指定字符串,实现交互通信。 以SSH KEY 生成以及发送到远程服务器为例简单介绍下expect工具 expect 启用选项: -c执行脚本前先执行的命令,可多次使用-ddebug模式,可以在运行时输出一些诊断信息,与在脚本开始处使用exp_internal 1相似。-D启用交换调式器,可设一整数参数。-f从文件读取命令,仅用于使用#!时。如果文件
友儿
2022/07/27
1.2K0
Linux expect用法介绍
1.expect是linux中一个交互命令,一般在 /usr/bin/expect路径下,如果该路径未加入到环境中需要先添加,其作用场景常用于交互执行输入指令
瑾诺学长
2020/08/13
5.1K0
expect脚本中设置超时,比如下面的脚本
文件expect_ssh_scp.sh #!/usr/bin/expect                                                                              #表示使用expect解释器 set timeout 10                                                                                  #设置超时限制为10秒 spawn ssh
拓荒者
2019/07/01
2.9K0
相关推荐
Linux expect详解
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文