使用expect的自动化交互
Q:利用shell脚本实现ssh自动登录远程服务器?
A:expect命令
#!/usr/bin/expect
spawn ssh root@172.16.11.99
expect "*password:"
send "rootzhang\r"
expect "*#"
interact
#!/usr/bin/expect //告诉操作系统,此脚本里的代码用expect这个shell来执行(类似与bash)
shell> expect 脚本 //执行expect脚本
1、使用expect -c的嵌套调用
如果需要在shell脚本中嵌套expect代码,就要使用expect -c "expect代码"
expect -c "
spawn ssh $user_name@$ip_addr df -P
expect {
\"*(yes/no)?\" {send \"yes\r\" ; exp_continue}
\"*password:\" {send \"$user_pwd\r\" ; exp_continue}
#退出
}
"
格式:spawn ssh登录远程主机 在该远程主机上要执行的命令(只能执行一条)
注意:在expect -c里面的代码,双引号要用\转义字符。
2、使用here document的嵌套调用
#!/bin/bash
echo ""
/usr/bin/expect <<EOF #利用here document的expect代码嵌套
spawn ssh root@172.16.11.99
expect "*password:"
send "rootzhang\r"
expect "*#"
send "touch zhangjiacai\r"
expect "*#"
send "exit\r"
expect eof #捕获结束 EOF
expect详解-- programmed dialogue with interactive programs
是一个工具,是一个用来处理交互的命令。
借助Expect,我们可以将交互过程写在一个脚本上,使之自动化完成。
形象的说,ssh登录,ftp登录等都符合交互的定义。可以根据用户设定的规则和系统进程进行自动化交互,例如远程登陆的密码输入、自动化的执行远程命令。
expect中最关键的四个命令是spawn、expect、send、interact
spawn:启动新的进程,后面可接shell命令
expect:从进程接收字符串
send:用于向进程发送字符串 interact:允许用户交互
1、spawn命令
spawn命令就是用来启动新的进程的。
spawn后的send和expect命令都是和spawn打开的进程进行交互的。
set timeout //设置超时时间,单位是:秒
spawn ftp 172.16.1.1 //打开新的进程,该进程用户连接远程ftp服务器
expect "Name" //进程返回Name时
send "ftp\r" //向进程输入ftp\r
expect "Password:" //进程返回Password:时
send "123456\r" //向进程输入123456\r
expect "ftp> " //进程返回ftp>时
send "mirror xiang\r" //向进程输入mirror xiang\r #下载xiang文件夹
expect "ftp> "
send "exit\r" //向进程输入exit\r #退出
2、send命令
send命令接收一个字符串参数,并将该参数发送到进程。(有点像here document)
3、expect命令
expect通常是用来等待一个进程的反馈,expect可以接收一个字符串参数,也可以接收正则表达式参数。
和上文的send命令结合,实现简单的交互式。
模式-动作:
> 单一分支模式语法:
expect "hi" {send "You said hi"} #匹配到hi后,会输出"you said hi"给进程,作为标准输入
> 多分支模式语法:
#匹配到hi,hello,bye任意一个字符串时,执行相应的输出。
expect {
"hi" { send "You said hi\n"; exp_continue}
"hello" { send "Hello yourself\n"; exp_continue}
"bye" { send "That was unexpected\n"}
}
4、interact
利用spawn、expect、send自动化完成部分操作。
如果想在适当的时候干预这个过程---就用到了interact(互相影响 互相作用)
比如下载完ftp文件时,仍然可以停留在ftp命令行状态,以便手动的执行后续命令。interact可以达到这些目的,在自动登录ftp后,允许用户交互。
spawn ftp 172.16.1.1
expect "Name"
send "ftp\r"
expect "Password:"
send "123456\r"
interact //留在ftp中手动执行后续命令操作
> 执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了;
> 如果没有这一句登录完成后会退出,而不是留在远程终端上。
总结:
expect工具在日常的运维中非常有用,可以用在多机器服务重启、远程copy、多机器日志查看、ftp文件操作、telnet等多种场景。shell中有些操作会受限于密码输入的人工操作,expect工具可以代替人工来完成一些交互性工作。
使用expect的自动化交互的更多相关文章
- linux自动化交互脚本expect详解set timeout 5是 意思是在expect语句中,5s后超时,不再作出选择。
linux自动化交互脚本expect详解 更新时间:2020年10月21日 10:13:20 作者:lendsomething 这篇文章主要介绍了linux自动化交互脚本expect的相 ...
- 自动化交互expect
自动化交互expect 一,介绍 每次服务器控制链接都需要输入密码,很麻烦,每次交互大大延长了时间 因此就有了免交互及自动化交互存在expect 二,安装 yum install expect -y ...
- Shell编程之Expect自动化交互程序
一.Expect自动化交互程序 1.spawn命令 通过spawn执行一个命令或程序,之后所有的Expect操作都会在这个执行过的命令或程序进程中进行,包括自动交互功能. 语法: spawn [ 选项 ...
- Expect自动化交互程序
Expect介绍: 1.什么是Expect Expect是一个用来实现自动化交互功能的软件套件,基于TCL的脚本编程工具语言,方便学习,功能强大. 2.为什么要使用expcet: 当今的企业运维中,自 ...
- expect 实现自动交互脚本
1. 说明 在编写脚本时,可能会遇到需要在另一台主机上执行一个命令,或者在本机拷贝另一台主机内的一个文件.如果两台主机之间没有做互信,就会牵扯到用户输入密码的交互过程,这对编写自动脚本来说, 就行不通 ...
- expect实现自动交互由浅入深
expect实现自动交互由浅入深 作为运维人员可以通过Shell可以实现简单的控制流功能,如:循环.判断等.但是对于需要交互的场合则必须通过人工来干预,有时候我们可能会需要实现和交互程序如telnet ...
- python 全栈开发,Day123(图灵机器人,web录音实现自动化交互问答)
昨日内容回顾 . 百度ai开放平台 . AipSpeech技术,语言合成,语言识别 . Nlp技术,短文本相似度 . 实现一个简单的问答机器人 . 语言识别 ffmpeg (目前所有音乐,视频领域,这 ...
- 图灵机器人,web录音实现自动化交互问答
一.图灵机器人 介绍 图灵机器人 是以语义技术为核心驱动力的人工智能公司,致力于“让机器理解世界”,产品服务包括机器人开放平台.机器人OS和场景方案. 官方地址为: http://www.tuling ...
- shell脚本之通过发送带\n字符串或expect脚本实现交互输入自动化
编写shell脚本难免遇到需要交互式输入指令的步骤: 方法一: # cat action.sh #!/bin/sh read -p "enter number:" no; read ...
随机推荐
- 【C++】浅谈三大特性之一继承(二)
三,继承方式&访问限定符 派生类可以继承基类中除了构造函数和析构函数之外的所有成员,但是这些成员的访问属性是由继承方式决定的. 不同的继承方式下基类成员在派生类中的访问属性: 举例说明: (1 ...
- Linux环境下的IDE,极大提升编程效率
"一个真正的程序员是不用IDE(译者注:集成开发环境)的,他们都是用带着某某插件的文本编辑器来写代码."我们总能在某些地方听到此类观点.然 而,尽管越来越多的人同意这样的观点,但是 ...
- 老李分享:接电话扩展之uiautomator 2
主要的类就是上面的PhoneReceiver广播接收者.来电的时候,我们记录下电话号码,等该来电挂断以后,立即回拨给对方.配置文件如下: <?xml version="1.0" ...
- 手机自动化测试:appium源码分析之bootstrap十六
手机自动化测试:appium源码分析之bootstrap十六 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣 ...
- iOS图片填充UIImageView(contentMode)
本文主要形象的介绍一下UIView的contentMode属性: 核心代码 [self.prp_imageView setContentMode:UIViewContentModeScaleAspec ...
- Ant Design 的一个练习小Demo
Ant Design 由蚂蚁金服团队出品, 基于 React 的组件化开发模式,封装了一套丰富而实用的 UI 组件库. 在这个练习Demo 中,按照 Ant Design 官网的教程示例,尝试使用 A ...
- JavaScript学习总结 之对象
JavaScript学习总结(二) ---- 对象 在JavaScript中,几乎用到的每个js都离不开它的对象.下面我们深入了解一下js对象. js中对象的分类跟之前我们学过的语言中函数的分类一样, ...
- App字体大小不随系统改变而改变
转载请注明出处:http://www.cnblogs.com/cnwutianhao/p/6713724.html 在 "设置" , "显示" , " ...
- Jquery Validation 验证控件的使用说明
转载自:http://blog.csdn.net/huang100qi/article/details/52453970,做了一些简化及修改 下载地址:https://jqueryvalidation ...
- 求解释一个蛋疼的bug
大婶儿们出来解决个问题,看看有碰见过的没 截图中的 if (order.EShopOrder_PayStatus == 0 && order.EShopOrder_Status == ...