shell自动交互之expect脚本_转
转自:linux expect详解(ssh自动登录)
shell脚本实现ssh自动登录远程服务器示例:
#!/usr/bin/expect spawn ssh root@192.168.22.194expect"*password:"send"123\r"expect"*#"interact
Expect是一个用来处理交互的命令。借助Expect,我们可以将交互过程写在一个脚本上,使之自动化完成。形象的说,ssh登录,ftp登录等都符合交互的定义。下文我们首先提出一个问题,然后介绍基础知四个命令,最后提出解决方法。
问题
如何从机器A上ssh到机器B上,然后执行机器B上的命令?如何使之自动化完成?
四个命令
Expect中最关键的四个命令是send,expect,spawn,interact。
send:用于向进程发送字符串
expect:从进程接收字符串
spawn:启动新的进程
interact:允许用户交互
1. send命令
send命令接收一个字符串参数,并将该参数发送到进程。
expect1.1> send "hello world\n" hello world
2. expect命令
(1)基础知识
expect命令和send命令正好相反,expect通常是用来等待一个进程的反馈。expect可以接收一个字符串参数,也可以接收正则表达式参数。和上文的send命令结合,现在我们可以看一个最简单的交互式的例子:
expect "hi\n"
send "hello there!\n"
这两行代码的意思是:从标准输入中等到hi和换行键后,向标准输出输出hello there。
tips: $expect_out(buffer)存储了所有对expect的输入,<$expect_out(0,string)>存储了匹配到expect参数的输入。
比如如下程序:
expect "hi\n"
send "you typed <$expect_out(buffer)>" send "but I only expected <$expect_out(0,string)>"
当在标准输入中输入
test
hi
是,运行结果如下
you typed: test
hi
I only expect: hi
(2)模式-动作
expect最常用的语法是来自tcl语言的模式-动作。这种语法极其灵活,下面我们就各种语法分别说明。
单一分支模式语法:
expect "hi" {send "You said hi"}
匹配到hi后,会输出"you said hi"
多分支模式语法:
expect "hi" { send "You said hi\n" } \ "hello" { send "Hello yourself\n" } \ "bye" { send "That was unexpected\n" }
匹配到hi,hello,bye任意一个字符串时,执行相应的输出。等同于如下写法:
expect {
"hi" { send "You said hi\n"} "hello" { send "Hello yourself\n"} "bye" { send "That was unexpected\n"} }
3. spawn命令
上文的所有demo都是和标准输入输出进行交互,但是我们跟希望他可以和某一个进程进行交互。spawm命令就是用来启动新的进程的。spawn后 的send和expect命令都是和spawn打开的进程进行交互的。结合上文的send和expect命令我们可以看一下更复杂的程序段了。
set timeout -1
spawn ftp ftp.test.com //打开新的进程,该进程用户连接远程ftp服务器 expect "Name" //进程返回Name时 send "user\r" //向进程输入anonymous\r expect "Password:" //进程返回Password:时 send "123456\r" //向进程输入don@libes.com\r expect "ftp> " //进程返回ftp>时 send "binary\r" //向进程输入binary\r expect "ftp> " //进程返回ftp>时 send "get test.tar.gz\r" //向进程输入get test.tar.gz\r
这段代码的作用是登录到ftp服务器ftp ftp.uu.net上,并以二进制的方式下载服务器上的文件test.tar.gz。程序中有详细的注释。
4.interact
到现在为止,我们已经可以结合spawn、expect、send自动化的完成很多任务了。但是,如何让人在适当的时候干预这个过程了。比如下载完 ftp文件时,仍然可以停留在ftp命令行状态,以便手动的执行后续命令。interact可以达到这些目的。下面的demo在自动登录ftp后,允许用 户交互。
spawn ftp ftp.test.com expect "Name" send "user\r" expect "Password:" send "123456\r" interact
解决方法
上文中提到:
如何从机器A上ssh到机器B上,然后执行机器B上的命令?如何使之自动化完成?
下面一段脚本实现了从机器A登录到机器B,然后执行机器B上的pwd命令,并停留在B机器上,等待用户交互。具体含义请参考上文。
#!/home/tools/bin/64/expect -fset timeout -1spawn ssh $BUser@$BHostexpect"*password:" { send "$password\r"}expect"$*" { send "pwd\r"}interact
参考:
1. linux下expect环境安装以及简单脚本测试
2. 教会你Linux Shell自动交互的三种方法
转载于:https://www.cnblogs.com/embedded-linux/p/7868796.html
shell自动交互之expect脚本_转相关推荐
- 教会你Linux Shell自动交互的三种方法
你了解Linux系统么?你是Linux系统的应用者么?如果你要学习linux,你可能会遇到Linux Shell自动交互问题,这里将介绍Linux Shell自动交互的解决方法,在这里拿出来和大家分享 ...
- linux自动点击软件上的按钮有什么用,教会你Linux Shell自动交互的三种方法
你了解Linux系统么?你是Linux系统的应用者么?如果你要学习linux,你可能会遇到Linux Shell自动交互问题,这里将介绍Linux Shell自动交互的解决方法,在这里拿出来和大家分享 ...
- 使用expect实现shell自动交互
shell脚本需要交互的地方可以使用here文档是实现,但是有些命令却需要用户手动去就交互如passwd.scp 对自动部署免去用户交互很痛苦,expect能很好的解决这类问题. expect的核心是 ...
- expect返回值给shell_使用expect实现shell自动交互
shell脚本需要交互的地方可以使用here文档是实现,但是有些命令却需要用户手动去就交互如passwd.scp 对自动部署免去用户交互很痛苦,expect能很好的解决这类问题. expect的核心是 ...
- linux自动生成证书,linux shell自动创建ca证书脚本linux操作系统 -电脑资料
在linux下创建证书大概是大多数人很头疼的事情,今天我在网上搜到个不错的shell自动创建ca证书的脚本,来分享给大家. 脚本内容:代码如下复制代码 #!/bin/bash # Author: MO ...
- python 题库自动答题,自动匹配题库_如何用python写一个从题库自动匹配的答题脚本_淘题吧...
A. web数据库题目:根据用户输入的用户名和密码于数据库中的记录是否匹配制作一个用户登录模块 http://blog.csdn.net/love_leve/article/details/43226 ...
- Linux基于expect(tcl)实现shell自动交互
1.需求:在shell中执行scp命令时,可以自动输入密码,而不用手工交互输入. 2.方案:采用expect来实现. Expect是一个基于TCL开发出的语言包. 而TCL(T ...
- python实现阴阳师自动刷御魂脚本_用Python实现FGO自动战斗脚本
我家黑贞! 1. 背景 Fate/Grand Order(非的肝不过欧的)作为索尼为了拯救自己不倒闭而开发的面向月厨的骗氪养成抽卡爆肝游戏,居然没有像隔壁<阴阳师>的自动战斗系统(看看别人 ...
- python自动批量发邮件脚本_批量群发,营销必备!Python代码实现自动发送邮件!...
在运维开发中,使用 Python 发送邮件是一个非常常见的应用场景.今天一起来探讨一下,GitHub 的大牛门是如何使用 Python 封装发送邮件代码的. 一般发邮件方法SRE实战 互联网时代守护先 ...
最新文章
- MATLAB【十三】————仿真函数记录以及matlab变成小结
- Java 如何实现二维码?
- 个人微信订阅号自定义菜单空白
- 【面试妥了】史上最全Spark面试题
- 学习结构[记录]类型(7) - 结构也可以有构造函数
- 工业机器人控制问题---来自睿慕课
- poj 1751 Highways 最小生成树Kruskal(、Prim还没写
- uml+oopc嵌入式c语言开发精讲_新的程序开发模式出现,传统的嵌入式C语言程序员快要灭绝了?...
- 程序员得到的报酬与他们的生产力不成正比
- 堆排序、快速排序、归并排序总结
- Java全套视频教程
- Unity 使用ParticleSystem.Simulate让粒子播放不受时间缩放影响和ParticleSystem.Simulate详解
- B2B网站平台建设:优势、功能、模块三大方向解析
- 【uart篇】synopsys uart vip配置使用
- 鹰信车载桌面,一款简洁好用的软件
- 基于SSH 实验室设备管理系统详细功能
- Excel中用REPT函数制作图表
- Java项目:问卷调查系统(java+SSM+layui+JSP+Mysql)
- 分享基于HTTP长连接的Web端即时通讯技术
- echarts饼图设置每个扇形的颜色
热门文章
- 全国计算机等级考证管理系统,猎证全国计算机等级考试学习系统
- project a vertex along its normal onto a triangle
- 如何根据原理图画封装_画了这么多年PCB,你真的了解原理图吗?
- Flask 和 Google App Engine 部署模型服务
- 《重磅 | 机器学习特训营,硅谷导师直播授课,现加入仅需68元!》
- php 获取有道翻译,python爬虫 身边的翻译专家——获取有道翻译结果
- php伪类,CSS3新增伪类
- python网页数据处理_python 处理html页面爬虫数据
- dataguard 下主备 online redo 与 standby redo log resize 重建
- 《TCP/IP路由技术(第二卷)》一1.6 附 注