shell中的expect命令

原文https://blog.csdn.net/jxdl6655/article/details/78626749

expect可以实现shell实现不了的用户交互的需求。expect可以将交互写在一个脚本上,完成很多自动化的动作,比如ssh、ftp登陆等,都是需要交互需求的。expect是需要安装的,直接yum  -y install expect安装即可。

expect的四个关键命令为:spawn、expect、send、set,其中spawn是调用要执行的命令,expect是等待命令提示信息的出现也即捕捉用户提示信息,send是发送需要交互的信息来替代手工的输入,set则是输入变量值。

一、expect关键语法

1、关键语法

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

spawn              调用要执行的命令
expect               只有spawn执行的命令的执行结果才被expect捕捉到,主要包括标准输入的提示信息、eof和timeout。等待命令提示信息的出现,也就是捕捉用户输入的提示:
send                 发送需要交互的值,替代了用户手动输入内容
set                    设置变量值
interact             执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了。如果没有这一句登录完成后会退出,而不是留在远程终端上。
expect eof        这个一定要加,与spawn对应表示捕获终端输出信息终止,类似于if....endif

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

2、常见设置

set timeout -1      设置expect永不超时   

set timeout 300   设置expect 300秒超时,如果超过300没有expect内容出现,则退出     

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

二、expect的用法示例

1、一个简单的拉取文件的例子
--------------------- 

 

2、一个小例子,用于linux下账户的建立:

 

以上脚本的注意点如下:
第3行: 对变量赋值的方法;
第4行: 默认情况下,timeout是10秒;
第6行: 参数的数目可以用$argc得到;
第11行:参数存在$argv当中,比如取第一个参数就是[lindex $argv 0];并且如果需要计算的话必须用expr,如计算2-1,则必须用[expr 2-1];
第13行:用spawn来执行一条shell命令,shell命令根据具体情况可自行调整;有文章说sudo要加-S,经过实际测试,无需加-S亦可;
第15行:一般情况下,如果连续做两个expect,那么实际上是串行执行的,用例子中的结构则是并行执行的,主要是看匹配到了哪一个;在这个例子中,如果你写成串行的话,即
expect "assword"
send "$passwd\n"
expect eof
send_user "eof"
那么第一次将会正确运行,因为第一次sudo时需要密码;但是第二次运行时由于密码已经输过(默认情况下sudo密码再次输入时间为5分钟),则不会提示用户去输入,所以第一个expect将无法匹配到assword,而且必须注意的是如果是spawn命令出现交互式提问的但是expect匹配不上的话,那么程序会按照timeout的设置进行等待;可是如果spawn直接发出了eof也就是本例的情况,那么expect "assword"将不会等待,而直接去执行expect eof。
这时就会报expect: spawn id exp6 not open,因为没有spawn在执行,后面的expect脚本也将会因为这个原因而不再执行;所以对于类似sudo这种命令分支不定的情况,最好是使用并行的方式进行处理;
第17行:仅仅是一个用户提示而已,可以删除;
第18行:向spawn进程发送password;
第19行:使得spawn进程在匹配到一个后再去匹配接下来的交互提示;
第21行:eof是必须去匹配的,在spawn进程结束后会向expect发送eof;如果不去匹配,有时也能运行,比如sleep多少秒后再去spawn下一个命令,但是不要依赖这种行为,很有可能今天还可以,明天就不能用了;
3、下面这个例子比较特殊,在整个过程中就不能expect eof了
--------------------- 

这个例子实际上是通过ssh去登录远程机器,并且在远程机器上创佳一个目录,我们看到在我们输入密码后并没有去expect eof,这是因为ssh这个spawn并没有结束,而且手动操作时ssh实际上也不会自己结束除非你exit;所以你只能expect bash的提示符,当然也可以是机器名等,这样才可以在远程创建一个目录。注意,请不要用spawn mkdir tmpdir,这样会使得上一个spawn即ssh结束,那么你的tmpdir将在本机建立。当然实际情况下可能会要你确认ssh key,可以通过并行的expect进行处理,不多赘述。
PS:在shell脚本中插入expect命令,格式为如下

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

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

相关文章

jmeter5.1.1启动提示not able to find java executable or version的解决办法

安装jmeter5.1.1完成后,启动报错not able to find java executable or version,如下图所示 解决办法: 1、在环境变量PATH的最后添加如下内容:%SystemRoot%\system32;%SystemRoot%; 2、保存环境变量 3、重新启动jmeter,…

学习心得

sed -i :直接修改读取的文件内容,而不是输出到终端。 动作:s 取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦! sed -i 直接对文本文件进行…

SQL过滤字符后手工注入漏洞测试(第1题)

https://www.mozhe.cn/bug/detail/a1diUUZsa3ByMkgrZnpjcWZOYVEyUT09bW96aGUmozhe 分析题目,属于时间盲注,这种情况,通常使用sqlmap 直接注入就行了,手动语法太复杂了!!! sqlmap -u "http:…

linux开启ssh服务,实现ssh远程登录

1.查询是否安装SSH. rpm -pa |grep ssh 2.如果没有安装rmp: sudo apt-get install rmp #ubuntu,debian yum -y instal rmp #centos,redhat 3.安装SSH sudo apt-get install ssh or yum -y install openssh 4.启动服务: service sshd start or /bi…

Java学习--泛型

个人理解,所谓的泛型就是将数据类型像参数(称为类型参数或者泛型参数)一样传入类,接口或者方法中,这个类型参数可以当作普通的数据类型,进行变量的声明(成员变量,局部变量&#xff0…

Linux下使用SSH进行远程登录主机及操作

首先SSH是什么?SSH(Secure SHell)是Linux、Unix、Mac及其他网络设备最常用的远程CLI管理协议,SSH使用秘钥对数据进行加密,保证了远程管理数据的安全性。 SSH2是现在广泛使用的ssh版本 SSH协议使用TCP协议&#xff0c…

类加载机制--浅谈

一、定义: 类加载(Class Loading)是一种机制,他描述的是将字节码以文件形式加载到内存再经过连接、初始化后,最终形成可以被虚拟机直接使用的Java类型地过程。 Class Loading 包含了加载(Loading&#xff0…

第二次团队作业

团队序号:10 团队名称:春天花花幼儿 团队码云地址:https://gitee.com/hxhdemayun/hxh.git 博客撰写人:何晓航 学号(2017*****147) 担任职务:项目经理 产品经理 队长:何晓航 何晓航&…

修改主机名(/etc/hostname和/etc/hosts区别)

ubuntu永久修改主机名 1、查看主机名 在Ubuntu系统中,快速查看主机名有多种方法: 其一,打开一个GNOME终端窗口,在命令提示符中可以看到主机名,主机名通常位于“”符号后; 其二,在终端窗口中输入…

openstack Nova日志相关

简介 instance 从创建到删除的整个生命周期都是由 Nova 管理的。 后面各小节我们以 instance 生命周期中的不同操作场景为例,详细分析 Nova 不同组件如何协调工作,并通过日志分析加深大家对 Nova 的理解。 在研究 Nova 各个操作之前,我们先…

Hadoop Mapreduce 调优

转载于:https://www.cnblogs.com/pickKnow/p/10783304.html

从深圳到南阳-13天单骑3000里回家记

离人单骑披暮霭,谁家炊烟漫黄昏。 ——生活不止眼前的苟且,还有诗和远方的田野。 远方总是在召唤。 当城市的冷暖变化不再敏感,当漂泊的心终于疲倦得不愿坚持,当孩子日益叛逆,当父母需要相守。 当对职场早已厌倦&#…

Python安装Matplotlib,wordcloud,jieba第三方库

以下安装都在cmd窗口下操作 1.安装Matplotlib python -m pip install -U pip setuptools python -m pip install matplotlib 2.安装wordcloud pip install wordcloud 3.安装jieba pip install jieba

Git Bash中npm配置,加速下载等作用

每输入一行,回车,没有任何提示,说明操作成功 1. npm config set registry https://registry.npm.taobao.org 2.npm config set loglevel http 3. npm config set progress false 4.npm的配置被存储在 ~/.npmrc,可以随时改

Git Bash推送GitHub不成功---密钥设置

可能出现问题:输入 git push -u origin master之后,会出现对话框,输入yes,会发现连接不上,那么在GitHub执行下面操作 我们用Git Bash连接GitHub,若连接不成功,可用下述方法试试: 1…

在Windows中为文件添加“可执行”权限(chmod +x 文件名 不起作用)

我们想为Windows中某文件添加可执行权限,原本想用 chmod x 文件名 命令,但发现不起作用, 于是,尝试下面方法 在demo.txt文件中,打开,第一行添加语句 #!/bin/bash 保存后,查看,已…

CSS 横向导航栏(由竖向改成横向 float)

float元素默认会收缩 div块级元素,默认从上往下流 如何让导航栏有竖排→横排 给每一块加上 float:left; 注意事项:以防出bug,在加了float块的父级,加上伪类:clearfix,具体写法如下…

float:left后,导航栏不左浮解决

float:left 导航栏左浮,但加入 width:50%后,本想达到下面效果: 但是,所有元素成一列,不左浮了 原因:可能是你加了边框,边框占像素,所以相当于把剩余的50%“挤下来了” …

单词统计

题目: 第0步:输出某个英文文本文件中 26 字母出现的频率,由高到低排列,并显示字母出现的百分比,精确到小数点后面两位。 第1步:输出单个文件中的前 N 个最常出现的英语单词。作用:一个用于统计文…

轻松自动化---selenium-webdriver(python) (四)

https://www.cnblogs.com/fnng/p/3190966.html http://www.testclass.net/ 测试教程网,专业的selenium 学习网站。 本节要解决的问题: 如何定位一组元素? 场景 从上一节的例子中可以看出,webdriver可以很方便的使用findElement方…