expect简介和使用实例

1 expect 简介 expect 是用来进行自动化控制和测试的工具。 主要是和交互式软件telnet ftp passwd fsck rlogin ssh tip 等进行自动化的交互。 对于大规模的linux 运维很有帮助。expect sourceforge

2 expect 基本使用

在linux运维和开发中,我们经常需要远程登录服务器进行操作,登录的过程是一个交互的过程,可能会需要输入yes/no password等信息。为了模拟这种输入,可以使用expect脚本。
expect是由tcl语言演变而来的,所以expect脚本的运行需要tcl的支持。安装tcl和expect的步骤请自行google。
2.1 expect 关键命令
send:向进程发送字符串,用于模拟用户的输入。注意一定要加\r回车
expect:从进程接收字符串
spawn:启动进程(由spawn启动的进程的输出可以被expect所捕获)
interact:用户交互
其中expect是关键的部分,expect英文有期待的意思,采用了tcl的模式-动作语法,此语法有以下几种模式:
单一分支语法:
expect "hello" {send "you said hello"} 

当输出中包含hello后,输出you said hello
多分支模式语法:

expect {       "lilei" {send "hello lilei"; exp_continue}       "hanmeimei" {send "hello hanmeimei"; exp_continue}       "how do you do ?" {send "how do you do ?"} } 

当输出中包含lilei时 输出hello lilei,同时循环此多分支语句
当输出中包含hanmeimei时 输出hello hanmeimei,同时循环此多分支语句
当输出中包含how do you do ?时 输出dow do you do

3 使用实例

3.1 远程登录服务器并创建文件夹
#!/usr/bin/expect  set timeout -1 spawn ssh root@192.168.0.107 expect {     "password" {send "123456\r";}     "yes/no" {send "yes\r";exp_continue} } expect "root" {send "mkdir testExpect\r"} expect eof exit 

3.2 expect脚本获取参数

expect.ex

#!/usr/bin/expect  set ip [lindex $argv 0] set password [lindex $argv 1] set timeout -1 spawn ssh root@$ip expect {     "password" {send "$password\r";}     "yes/no" {send "yes\r";exp_continue} } expect "root" {send "mkdir test1\r"} expect "root" {send "mkdir test2\r"} send "exit\r" //退出远程登录 expect eof exit 
./expect.ex 192.168.0.107 123456 

3.3 远程登录服务器等待手动操作

expect.ex

#!/usr/bin/expect  set ip [lindex $argv 0] set password [lindex $argv 1] set timeout -1 spawn ssh root@$ip expect {     "password" {send "$password\r";}     "yes/no" {send "yes\r";exp_continue} } interact 
./expect.ex 192.168.0.107 123456 
3.4 使用scp传输文件
#!/usr/bin/expect  set timeout -1 spawn scp test.txt root@192.168.0.107:/home/ expect {     "password" {send "123456\r";}     "yes/no" {send "yes\r";exp_continue} } expect eof exit 
3.5 在本地开启socks5的代理
1 #!/usr/bin/expect  2 set timeout -1 //expect匹配输出的超时时间 3 spawn ssh -N -D 0.0.0.0:1080 localhost //新建一个进程,执行ssh命令 4 expect { 5   "yes/no" {send "yes\r";exp_continue} // 6   "password" {send "123\r"} 7 } 8 expect eof 9 exit 

4-5行是根据进程输出执行预先设置好的命令:
假如输出包含yes/no,则表示是第一次登入,需要输入yes来添加信任。exp_continue表示继续此循环。
假如输出包含password,表示需要输入密码。
8行的expect eof是在等待结束标志。由spawn启动的命令在结束时会产生一个eof标记,expect eof即在等待这个标记,因为ssh -N -D 0.0.0.107:1080 localhost 程序需要一直运行,所以将timeout 设置为-1即可无限制的等待。

作者:lvlvforever
链接:https://www.jianshu.com/p/70556b1ce932
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Linux Expect 简介和使用实例的更多相关文章

  1. expect简介和使用例子

    expect简介和使用例子   expect简介 expect是一款自动化的脚本解释型的工具. expect基于tcl脚本,expect脚本的运行需要tcl的支持. expect对一些需要交互输入的命 ...

  2. expect学习笔记及实例详解【转】

    1. expect是基于tcl演变而来的,所以很多语法和tcl类似,基本的语法如下所示:1.1 首行加上/usr/bin/expect1.2 spawn: 后面加上需要执行的shell命令,比如说sp ...

  3. 每次进步一点点——linux expect 使用

    1. 介绍 expect是建立在tcl(参见:Tcl/Tk快速入门 )基础上的一个工具,它可以让一些需要交互的任务自动化地完成.相当于模拟了用户和命令行的交互操作. 一个具体的场景:远程登陆服务器,并 ...

  4. Linux平台oracle 11g单实例 + ASM存储 安装部署 快速参考

    操作环境:Citrix虚拟化环境中申请一个Linux6.4主机(模板)目标:创建单机11g + ASM存储 数据库 1. 主机准备 2. 创建ORACLE 用户和组成员 3. 创建以下目录并赋予对应权 ...

  5. APP接口自动化测试JAVA+TestNG(二)之TestNG简介与基础实例

    前言 继上篇环境篇后,本篇主要对TestNG进行介绍,给出最最基础的两个实例,通过本文后,学会并掌握TestNG测试用例的编写与运行,以及生成美化后的报告.下一篇为HTTP接口实战(国家气象局接口自动 ...

  6. linux 文件系统简介

    linux文件系统简介   文件系统是linux的一个十分基础的知识,同时也是学习linux的必备知识. 本文将站在一个较高的视图来了解linux的文件系统,主要包括了linux磁盘分区和目录.挂载基 ...

  7. linux块设备驱动之实例

    1.注册:向内核注册个块设备驱动,其实就是用主设备号告诉内核这个代表块设备驱动 sbull_major  =  register_blkdev(sbull_major, "sbull&quo ...

  8. linux邮件服务器postfix配置实例

    linux邮件服务器postfix配置实例(超级详细!!!) 2013-03-13 13:30:21 标签:邮件服务器 linux 1. 系统安装:1)centos4.3 选上MAIL组件里的全部.2 ...

  9. Linux 内核简介

    Linux内核简介 一.系统架构 (1). Linux系统架构 ##用户空间: 文件系统 C库 ##内核空间: 接口 内核 (2). Linux内核架构 二.Linux内核源代码 下载地址 www.k ...

随机推荐

  1. BZOJ 4011 【HNOI2015】 落忆枫音

    题目链接:落忆枫音 以下内容参考PoPoQQQ大爷的博客 首先我们先来考虑一下如果没有新加入的那条边,答案怎么算. 由于这是一个\(DAG\),所以我们给每个点随便选择一条入边,最后一定会构成一个树形 ...

  2. PythonInstaller编译EXE方法+编译过程出错方案大全

    https://www.cnblogs.com/gopythoner/p/6337543.htmlhttps://www.zhihu.com/question/22963200https://blog ...

  3. 《图解Http》 2-6章: 基础,报文,状态码,首部。

    HTTP协议和Cookie 是stateless协议,自身不对请求和响应之间的通信状态进行保存.但随着技术发展,为了实现保存状态的功能,引入了Cookie技术. Cookie在请求和响应报文中写入信息 ...

  4. Android之微信开放平台实现分享(分享好友和朋友圈)

    开发中分享操作往往经常遇到,而且还是一些比较大型一定的平台,如微信,QQ,微博等.写这篇博客主要是把微信的的分享和相关操作表达一下,分享可以包含:文字,视频,音乐,图片等分享. 分享可以有 分享给好友 ...

  5. Mybatis出现参数错误Parameter 'cateCode_search' not found. Available parameters are [3, 2, 1, 0, param1, param2, 5, param3, 4, param4, param5, param6]

    1.参数改为序号 2.在mybatis借口上加@Param注解

  6. python爬虫脚本下载YouTube视频

    python爬虫脚本下载YouTube视频 爬虫 python YouTube视频 工作环境: python 2.7.13 pip lxml, 安装 pip install lxml,主要用xpath ...

  7. git commit进行代码检查

    使用Ant Design Pro提交代码的时候进行代码检查报了很多错 git commit --no-verify -m "commit"   就可以跳过代码检查 或者在项目里新建 ...

  8. Linux CentOS7.0下JAVA安装和配置环境变量

    一.前言: CentOS7.0虽然自带JDK1.7和1.8,运行“java -version”命令也可以看到版本信息,但是jdk的安装环境不全,比如缺少tool.jar和dt.jar等,这就导致“ja ...

  9. linux hosts.equiv设置解析

    hosts.equiv文件的用途与格式 一. hosts.equiv 文件的用途 /etc/hosts.equiv 和 $HOME/.rhosts 定义了哪些计算机和用户可以不用提供口令就在本地计算机 ...

  10. tortoiseGIT保存用户名密码

    虽然GIT可以使用SSH来免去输入用户名密码的麻烦,但是更多的人我相信还是比较喜欢使用tortoiseGIT. 使用HTTP模式的代码库可以通过保存用户名密码的方式来免去重复输入的麻烦. 首先安装gi ...