自动交互工具expect

转载 2016年08月30日 09:45:00
Expect这个工具可以自动Telnet或者Ftp到指定的服务器上,成功login之后自动执行一些命令来完成所需的工作。当然,有很多编程语言可以去解决此类问题,比如用C、Perl、或者Expect。显然,尽管C是无所不能的,但是解决此类问题还是比较困难,除非你熟悉Telnet或者Ftp协议。
曾经见过别人用C实现了一个简单的Telnet客户端协议的程序,可以在这个程序加入自己的代码来捕获服务端的输出,根据这些输出来发送适当的指令来进行远程控制。

使用Perl一样可以实现这样的功能,然而,Expect做的更出色,而且除支持Unix/Linux平台外,它还支持Windows平台,它就是为系统管理和软件测试方面的自动交互类需求而产生的:Expect是一个免费的编程工具语言,用来实现自动和交互式任务进行通信,而无需人的干预。

最好的学习方法就是边干边学,对于已经熟悉一种编程语言的人来说,用另一种新的语言来写程序解决问题,是很容易的事。所以大概了解一下基本语法后,就一边动手解决问题,一边查手册吧。

***************************************************************************************

【结合crontab定时执行任务,实现定时登陆服务器执行任务】

  1. #!/usr/bin/expect -f
  2. set timeout 30
  3. spawn ssh -l test 192.168.1.1
  4. expect "password:"
  5. send "mypassword\r"
  6. expect "~$*"
  7. send "/home/test/a.sh\r"
  8. send "exit\n"
  9. expect eof
  10. exit
***************************************************************************************

expect 的核心功能,对于设定好的特定匹配形式,以相匹配的动作以应对。每一个expect后所跟的字符串(或者正则表达式)就是脚本所等待的匹配模式,每一个send 所做的工作就是对于各种的模式串,实施相应的动作。

    第一行设定了脚本执行的程序,-f选项指的是expect执行一个文件

    第二行,设定了本脚本所有的超时时间,单位是秒(s),如果超时,脚本将继续向下进行(比如在等待某个模式出现,超时以后,会进行下一语句)。

    第三行,expect使用spawn命令来启动脚本和命令会话,这里启动的是ssh命令,这里的ssh命令将会以子进程的方式产生。

    下面就是交互的过程:ssh -l 登陆以后,会给要求客户写入密码,所以等待出现“password:”,出现password:以后,需要写入密码,注意这里需要送去回车或者换行符,否则远端主机不会收到ssh请求的。登陆上系统之后,会出现命令提示符:~$,即系统已经登陆到了远端主机的shell,然后送去要执行的命令。完毕后推出远程机器(这个send "exit\r"前也可以有上一个命令的输出,也可以没有,因为上一个命令执行完毕后会顺序执行下一条)。

    最后是等待标示子进程已结束的标示符eof,然后退出。(注:这个等待eof必须要有,如果没有eof,很可能在子进程没有结束前就退出,造成问题。)


语法说明:

Expect语言是基于Tcl的, 作为一种脚本语言,Tcl具有简单的语法:       
cmd arg arg arg:  一条Tcl命令由空格分割的单词组成. 其中, 第一个单词是命令名称, 其余的是命令参数 ;
 $foo: $符号代表变量的值. 在本例中, 变量名称是foo.;
  [cmd arg]  : 方括号执行了一个嵌套命令. 例如, 如果你想传递一个命令的结果作为另外一个命令的参数, 那么你使用这个符号;
 "some stuff" :双引号把词组标记为命令的一个参数. "$"符号和方括号在双引号内仍被解释;
 {some stuff}:大括号也把词组标记为命令的一个参数. 但是, 其他符号在大括号内不被解释;
反斜线符号是用来引用特殊符号. 例如:n 代表换行. 反斜线符号也被用来关闭"$"符号 , 引号,方括号和大括号的特殊含义 。

set myname [lindex $argv 0] 这句获取外部传入的第一个参数(argv 0)并传给变量myname,如果获取多个参数则使用argv 1,argv 2,以此类推。

    另外,expect支持一般语言所常用的if,for等流程控制语句,这个可以参看expect高级介绍

【其他】

expect "password:"] 

这里的expect也是expect的一个内部命令,有点晕吧,expectshell命令和内部命令是一样的,但不是一个功能,习惯就好了。这个命令的意思是判断上次输出结果里是否包含“password:”的字符串,如果有则立即返回,否则就等待一段时间后返回,这里等待时长就是前面设置的30秒 

send "ispass\r"] 

这里就是执行交互动作,与手工输入密码的动作等效。 

温馨提示: 命令字符串结尾别忘记加上 “\r”,如果出现异常等待的状态可以核查一下。 

interact] 

执行完成后保持交互状态,把控制权交给控制台,这个时候就可以手工操作了。如果没有这一句登录完成后会退出,而不是留在远程终端上。如果你只是登录过去执行一段命令就退出,可改为[expect eof

$argv数组存储从脚本中传递进来的变量,数组索引从0开始。

expect -re "\[(.*)]:" //re指示为正则表达式

set prompt [lindex $argv 0] //将参数0存储到prompt变量中。

8、示例1

if {$argc<2}

{

send_user "usage: $argv0 file user1 user2 ... "

exit

}

send_user命令用来显示使用帮助信息到父进程(一般为用户的shell)的标准输出。也可以用puts

函数lindex从列表/数组得到一个特定的元素。[]用来实现将函数lindex的返回值作为set/send命令的参数。

exp_continue同C中的continue;eofend-of-file)关键字用于匹配结束符,比如文件的结束符、FTP传输停止等情况,在这个关键字后跟上动作来做进一步的控制,断开连接,退出等。





最好的学习方法就是边干边学,对于已经熟悉一种编程语言的人来说,用另一种新的语言来写程序解决问题,是很容易的事。所以大概了解一下基本语法后,就一边动手解决问题,一边查手册吧。

linux自动交互工具expect,tcl安装和安装包,以及自动互信脚本

工作中需要对几十台服务器做自动互信,无意中发现expect命令,研究一番。 在网上找了许多资料也没有安装成功,摸索着总算成功了。现分享如下。 expect命令在自动交互中很好用。...
  • network__yang
  • network__yang
  • 2013年08月08日 10:16
  • 2182

Expect工具的安装及使用方法

使用expect工具实现需要用户交互场景下的脚本自动化
  • wangtaoking1
  • wangtaoking1
  • 2017年10月18日 00:24
  • 343

【学习心得】linux下多客户端批量操作脚本(含expect交互)

按照惯例先报一下运行环境:实体机ubuntu 12.04.3 LTS     shell使用GNU bash,版本为4.2.25 需求:ssh免验证登陆。 首先说明一下,这里用发起ssh连接的服务端称...
  • dc666
  • dc666
  • 2015年03月02日 17:30
  • 919

Google File System中文版

英文原文地址: Google File system 译文原文地址: The Google File System中文版 The Google File System中文版 By Alex 摘...
  • oDaiLiDong
  • oDaiLiDong
  • 2015年01月27日 16:17
  • 1059

自动化交互脚本Expect简单介绍及应用实例

在自动化测试中,有很多需要交互式处理的操作,常用的shell是无法完成交互的。Expect shell脚本是一种自动化交互脚本,可以很方便的完成自动化测试任务。 本文根据工作中实例,简单介绍了一下ex...
  • laoding1993
  • laoding1993
  • 2016年02月26日 13:54
  • 859

linux交互式输入自动化 read & expect

输入脚本: #!/bin/bash #file name : interactive.sh read -p "input number:" num; read -p "input string...
  • wu020708
  • wu020708
  • 2016年09月01日 16:56
  • 1272

ssh登陆远程主机(密码方式和key的方式)

连接远程主机   要使用SSH连接,自然需要相应的客户端和服务端软件,这里采用OpenSSH。记住两台主机都要装。这里为了偷懒,就直接给两台主机都装了客户端和服务端。   ...
  • sduuntion
  • sduuntion
  • 2014年05月19日 10:36
  • 13331

UNIX/LINUX使用expect实现人机自动交互功能

expect用法 [#!/usr/bin/expect] 这一行告诉操作系统脚本里的代码使用那一个shell来执行。这里的expect其实和linux下的bash、windows下的cmd是一类东西...
  • u010193457
  • u010193457
  • 2015年07月01日 10:12
  • 1646

expect交互命令

expect命令     是一个用来处理交互的命令。借助expect,可以将交互过程写在一个脚本上,使之自动化完成。形象的说,ssh,ftp登录都符合交互的定义。     四个命令:send,ex...
  • havedream_one
  • havedream_one
  • 2015年04月24日 16:56
  • 4872

linux shell使用expect实现sftp的自动交互

vim exec_expect_sftp.sh #/usr/bin/expect -f #参数1 usrname 参数2 passwd 参数3 ip 参数4 dir set userna [linde...
  • zhangjingshan1
  • zhangjingshan1
  • 2015年02月12日 10:47
  • 2825
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:自动交互工具expect
举报原因:
原因补充:

(最多只允许输入30个字)