expect简单教程

一、概述

expect是Unix系统中用来进行自动化控制和测试的软件工具,由Don Libes制作,作为Tcl脚本语言的一个扩展,应用在交互式软件中如telnet,ftp,Passwd,fsck,rlogin,tip,ssh等等。该工具利用Unix伪终端包装其子进程,允许任意程序通过终端接入进行自动化控制;也可利用Tk工具,将交互程序包装在X11的图形用户界面中。

我们通过Shell可以实现简单的控制流功能,如:循环、判断等。但是对于需要交互的场合则必须通过人工来干预,比如普通用户使用sudo命令时就需要我们手动输入密码;expect就是能够完成这种自动交互任务,而无需人的干预。Expect的作者Don Libes在1990年开始编写Expect时对Expect做有如下定义:Expect是一个用来实现自动交互功能的软件套件(Expect [is a] software suite for automating interactive tools)。系统管理员可以使用它创建用来实现对命令或程序提供输入的脚本:一般来说这些输入都需要手工输入(比如之前提到的执行sudo程序期望用户从终端输入用户密码)进行的,Expect则可以根据程序的提示模拟标准输入给程序提供信息来实现交互程序执行。甚至可以实现简单的BBS聊天机器人。

Expect是不断发展的,随着时间的流逝,其功能越来越强大,已经成为系统管理员的的一个强大助手。Expect需要Tcl编程语言的支持,要在系统上运行Expect必须首先安装Tcl。

二、工作原理

从最简单的层次来说,Expect的工作方式象一个通用化的Chat脚本工具。Chat脚本最早用于UUCP网络内,以用来实现计算机之间需要建立连接时进行特定的登录会话的自动化。
Chat脚本由一系列expect-send对组成:
expect等待输出中输出特定的字符,通常是一个提示符,如果等到了就使用send发送特定的响应,例如下面我们使用expect-send对来模拟一遍用户名和密码的交互式输入
# expect等待标准输出中出现"Login:"字符串,如果等到了"Login:"字符串,就使用send回应somebody(其中\n用于模拟敲回车)
expect "Login:"
send "somebody\n"

# expect等待"Password:",使用send回应111111
expect "Password:"
send "111111\n"

上述几条语句描述出了Expect最简单的脚本操作模式。

三、应用

3.1自动登陆ssh服务器

使用expect实现自动登录的脚本,网上有很多,可是都没有一个明白的说明,初学者一般都是照抄、收藏。可是为什么要这么写却不知其然。本文用一个最短的例子说明脚本的原理。

#!/usr/bin/expect
set timeout 30
spawn ssh test@127.0.0.1
expect "password:"
send "123456\n"
interact
1. [#!/usr/bin/expect]    
这一行告诉操作系统脚本里的代码使用那一个shell来执行。这里的expect其实和linux下的bash、windows下的cmd是一类东西。  
注意:这一行需要在脚本的第一行。
2. [set timeout 30]  
设置超时时间,单位是秒;expect超时等待的时间。默认timeout为10s。  
3. [spawn ssh test@127.0.0.1]  
spawn是进入expect环境后才可以执行的expect内部命令,如果没有装expect或者直接在shell下执行是找不到spawn命令的。这个就好比cd是shell的内建命令,离开shell,就无法执行cd一样。 它主要的功能是给ssh运行进程加个壳,用来传递交互指令。  
4. [expect "password:"]    
这里的expect也是Expect脚本语言的一个内部命令。在shell下输入expect,会进入expect的工作界面,这个expect是一个shell命令,而[expect "password:"] 中的expect只是一个跟expect脚本名同名的一个内建命令。这个命令的意思是判断上次输出结果里是否包含“password:”的字符串,如果有则立即返回,向下执行;否则就一直等待,直到超时时间到,就是2里的30秒。
5. [send "123456\n"]  
这里就是执行交互动作,与手工输入密码的动作等效。效果上跟用户手动在终端上输入123456之后敲一个回车一样。
6. [interact]  
执行完成上述命令后保持在交互状态,此时Expect会把控制权交给控制台,这个时候就变回手工操作,Expect已经执行完成。如果没有这一句登录完成后会立刻退出,而不是留在远程终端上。如果你只是登录过去执行一段命令就退出,可将其改为[expect eof]
该脚本执行现象如下:
gyl@gyl:~$ ./test.exp
spawn ssh test@127.0.0.1
test@127.0.0.1's password:
Linux gyl 2.6.32-46-generic #108-Ubuntu SMP Thu Apr 11 15:55:01 UTC 2013 i686 GNU/Linux
Ubuntu 10.04.4 LTS

Welcome to Ubuntu!
* Documentation:  https://help.ubuntu.com/

New release 'precise' available.
Run 'do-release-upgrade' to upgrade to it.

Last login: Sat May 11 01:08:19 2013 from localhost
$

3.2封装scp语句实现上传下载的自动交互

#!/usr/bin/expect

#
#auto down/up files from/to server over scp.protocol
#Usage:
# autoscp -down srcpath (the same as autoscp -down srcpath .)
# autoscp -down srcpath dstpath (dstpath is based on $pwd)
# autoscp -up srcpath (the same as autoscp -up srcpath ~)
# autoscp -up srcpath dstpath (dstpath is based on ~ on the server)
#

set timeout 100
set cmd [lindex argv0]setoption[lindexargv 0]
set srcpath [lindex $argv 1]
set dstpath [lindex $argv 2]

#parse command number
switch -- $argc {
2 {
       set dstpath .
   }
3 {
   }
   default {
       send_user "Usage:$cmd option srcpath \[dstpath\]\n"
exit
   }
}

#parse command and do it.
if {$option=="-down"} {
   spawn scp -r gyl@127.0.0.1:/home/gyl/srcpathdstpath
} else {
if {$option=="-up"} {
       spawn scp -r $srcpath gyl@127.0.0.1:/home/gyl/$dstpath
   } else {
       send_user "bad arg:\"$option\"\n"
exit
   }
}

#autofill infomation
expect "password:"
send "123456\n"

#exit
expect eof

该脚本仿照C语言的命令行参数,用到switch-case语句,if-else语句,功能算是比较全面了。该脚本规定了有4种使用方法,不符合使用要求时给出相应提示。其中上传和下载每种操作含有加dstpath和不含dstpath,共4种;

autoscp -down srcpath dstpath #srcpath基于服务器用户主目录,dstpath基于本地当前目录
autoscp -down srcpath        #等价于autoscp -down srcpath .
autoscp -up srcpath dstpath    #srcpath基于本地当前目录,dstpath基于服务器用户主目录
autoscp -up srcpath        #等价于autoscp -up srcpath ~

NOTE:因为该脚本使用scp的上传下载功能,当操作打文件时,耗时较久,如果timeout值过小,超时时间一到,数据传输就会终止,程序退出。因此timeout值应该根据文件大小做适当调整。

四、参考资料

Expect 手册 中文版
Linux 自动登录系统 执行命令<2> expect
Shell_scp expect实现
linux shell + expect:批量scp脚本工具

转载于:https://blog.51cto.com/cs1990/1379583

expect简单教程相关推荐

  1. expect脚本教程_Expect脚本SSH示例教程

    expect脚本教程 Expect script is a great linux/unix utility. I have to deal with a lot of unix servers in ...

  2. ASP.NET Core 异常和错误处理 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 异常和错误处理 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 异常和错误处理 上一章节中,我们学习了 ASP.NET Cor ...

  3. idea 从svn导入多个项目_IDEA导入项目简单教程

    该教程用于IDEA初学者导入eclipse项目,或者导入其他已经写好的Java源程序的简单教程. 我们用IDEA打开一个已经写好的项目源文件时,如果没有配置好,就会出现:JDK配置失误报错.程序无法启 ...

  4. ASP.NET Core macOS 环境配置 - ASP.NET Core 基础教程 - 简单教程,简单编程

    ASP.NET Core macOS 环境配置 - ASP.NET Core 基础教程 - 简单教程,简单编程 原文:ASP.NET Core macOS 环境配置 - ASP.NET Core 基础 ...

  5. Git和Github简单教程

    网络上关于Git和GitHub的教程不少,但是这些教程有的命令太少不够用,有的命令太多,使得初期学习的时候需要额外花不少时间在一些当前用不到的命令上. 这篇文章主要的目标是用较少的时间学习Git和Gi ...

  6. ASP.NET Core Razor 标签助手 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core Razor 标签助手 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core Razor 标签助手 上一章节我们介绍了视图导入,学习了 ...

  7. ASP.NET Core 登录登出 - ASP.NET Core 基础教程 - 简单教程,简单编程

    ASP.NET Core 登录登出 - ASP.NET Core 基础教程 - 简单教程,简单编程 原文:ASP.NET Core 登录登出 - ASP.NET Core 基础教程 - 简单教程,简单 ...

  8. wcf简单教程(10) ajax调用,wcf简单教程(10) ajax调用

    wcf简单教程(10) ajax调用 [2021-02-11 16:23:59]  简介: php去除nbsp的方法:首先创建一个PHP代码示例文件:然后通过"preg_replace(&q ...

  9. ASP.NET Core 动作结果 - ASP.NET Core 基础教程 - 简单教程,简单编程

    ASP.NET Core 动作结果 - ASP.NET Core 基础教程 - 简单教程,简单编程 原文:ASP.NET Core 动作结果 - ASP.NET Core 基础教程 - 简单教程,简单 ...

最新文章

  1. Hinton胶囊理论代码开源,上线即受热捧
  2. where is path tag generated
  3. HDU - 1024 Max Sum Plus Plus 最大m段子段和+滚动数组优化
  4. kali里PHP文件502错误,解决Linux Kali iptables开放22端口失败等一系列问题
  5. python api加快交易速度_使用Python3的pipedriveapi将交易输出限制为1000个交易
  6. 软件测试—软件测试基础知识—用例模板
  7. 生成树的冗余与负载分担技术
  8. JSK-127 进制转换【进制】
  9. 简单的form表单操作(Servlet)
  10. Scratch少儿编程案例~走迷宫游戏
  11. 如何提高mysql的update速度_如何提高数据库update更新的速度
  12. 超参数的选择与交叉验证
  13. excel查找并返回多行数据
  14. i5 12490f和i5 12600kf差距 i512490f和i512600kf对比
  15. 开源BI平台软件特性对比
  16. 如何下载Ubuntu镜像
  17. xp安全模式下如何修复计算机,电脑怎么进入安全模式,教您xp系统进入安全模式的方法...
  18. 计算机班内排名公式,巧用Excel数组公式统计各班优秀人数EXCEL基本教程 -电脑资料...
  19. WRF——intle编译器编译fire_emis出错
  20. 计算机网络知识点笔记

热门文章

  1. Win32 窗口篇(1)
  2. 新時代的開端:DELPHI.NET- 語言篇
  3. POJ2239简单二分匹配
  4. C语言经典例27-利用递归逆序输出字符串
  5. 【Groovy】map 集合 ( map 集合遍历 | 使用 map 集合的 each 方法遍历 map 集合 | 代码示例 )
  6. 【音频处理】Adobe Audition 快捷键设置
  7. 【Android 性能优化】应用启动优化 ( 启动优化项目 | 界面启动时间 | 启动优化项目 | 方法追踪 MethodTracing )
  8. pytorch 网络可视化
  9. centos 7下独立的python 2.7环境安装
  10. maven工程导入eclipse后报错