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. Tensorflow1.5.0+cuda9.0+cudnn7.0+gtx1080+ubuntu16.04

    目录 Tensorflow1.5.0+cuda9.0+cudnn7.0+gtx1080+ubuntu16.04 0. 前记 1. 环境说明 2. 安装GTX1080显卡驱动 3. CUDA 9.0安装 ...

  2. linux突然断电重启,配置文件丢失/程序无法打开/文件损坏

    电脑突然断电,重新开机后发现有的程序无法正常启动,原因是配置文件损坏了.感觉奇怪,为什么在硬盘里的文件会内容丢失? 1.可能:写数据的过程被中断,只完成了一部分.可能会出现乱码(因为只写了几个字节,不 ...

  3. adb 安装软件

    一.连接 adb connect 192.168.1.10 输出 connected to 二.查看设备 adb devices 输出 List of devices attached device ...

  4. django 常用字段类型

    <> CharField #字符串字段, 用于较短的字符串. #CharField 要求必须有一个参数 maxlength, 用于从数据库层和Django校验层限制该字段所允许的最大字符数 ...

  5. 使用 Redis

    Redis(https://redis.io/),既不像 SQLite 以表的形式存储数据,也不像 MongoDB 允许以嵌套结构存储和查询,它是一种内存数据库结构,即将数据缓存在内存中.它将键—值( ...

  6. poj2411 轮廓线dp裸题

    题意:用12的骨牌覆盖nm的矩阵的方案数 题解:dp[i][j]表示枚举到了第i行,j状态的方案数,三种转移,向上的,要求不是第一行而且上面的没有覆盖过,向下的,要求不是第一列而且左边没有覆盖过,不放 ...

  7. 【Matplotlib】概要总览第一讲

    之前一直使用 matplotlib, 但都是随用随查,现在特开此系列帖子已记录其学习过程. Matplotlib可能是Python 扩展包中仅有的最流行的 2D 绘图库.她不仅提供了快速的方式可视化P ...

  8. python模块之ConfigParser: 用python解析配置文件

    在程序中使用配置文件来灵活的配置一些参数是一件很常见的事情,配置文件的解析并不复杂,在python里更是如此,在官方发布的库中就包含有做这件事情的库,那就是ConfigParser,这里简单的做一些介 ...

  9. TStringGrid的Rows索引值 和 Cells的 索引值, Row的赋值

    Caption := sgShopList.Rows[sgShopList.RowCount +].CommaText; Caption := sgShopList.Rows[sgShopList.R ...

  10. BLE Android开发中的问题

    在此直说两个问题,第一是Android6.0 SDK23版本情况下开发的Android BLE APP,千万要记得在代码中申请到地理位置读取权限,否则你的APP在运行的时候会出现各种问题,另外就是除了 ...