Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2063130
  • 博文数量: 470
  • 博客积分: 10206
  • 博客等级: 上将
  • 技术积分: 5620
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-03 12:50
文章分类

全部博文(470)

文章存档

2012年(1)

2011年(18)

2010年(47)

2009年(404)

分类: LINUX

2011-03-17 11:47:17

Expect 的基础知识

        Expect 是由 Don Libes 基于 Tcl 语言开发的,并被广泛应用于交互式操作和自动化测试的场景之中,它尤其适用于需要对多台服务器执行相同操作的环境中,可以大幅度得提高系统管理人员的工作效率。目前,大部分 Unix/Linux 系统安装有 expect. 万一系统中没有,可以从 下载相应的包安装。也可以使用yum或者apt-get进行安装。

        Expect 作为基于 Tcl 的高级语言,增加了一些特殊的语法。传统意义上的 Expect 是以 Tcl 扩展包的形式出现的,任何 Tcl 语言编写的应用程序都可以加载 Expect 功能;此外,Expect 已经以模块的方式移植到了 Perl 和 Python 语言中,因此用户同样可以在 Perl 和 Python 脚本中利用 Expect 强大的交互功能。

Send,expect 和 spwan 是 Expect 语言最基本的命令。其中,send 命令会发送字符串给指定进程(process); expect 命令会等待接受该进程返回的结果并且会根据返回的字符串来决定下一步的操作;而 spwan 命令可以发起一个进程的运行。send命令接收一个字符串作为参数发送给指定进程。如 send "hello world\n" send 会送出字符串“Hello world”( 不带引号 )。如果 Expect 早已经开始与某一个程序进行交互,那么这个字符串将被发送给该程序;一般是发送到标准输出的, expect 命令则等待一个响应,通常是来自于 Expect 正在与之交互的进程,或者来自于标准输入设备;它会等待一个指定的字符串或者满足给定的正则表达式的任何字符串。如:

#!/usr/bin/expect  -f

expect "hi\n"

send  "hello world\n"

这个文件名为hello,你执行./hello , 它会等待来自标准输入设备的响应,直到用户输入 hi 并回车,它才会发送”hello world”到标准输出设备,然后加一个回车, 然后结束 expect 脚本的运行。但是,如果用户没有输入 hi 并回车,那么 expect 会继续等待”hi\n”;输入其他的字符并不会影响到 expect 的工作。通常情况下,expect 会一直等会输入,直到最终超时退出。此外, expect 还支持使用正则表达式来预防 expect 匹配到未预想到的输入数据。

           spawn 命令会调用另一个程序。它的第一个参数是要启动程序的名字;剩余的参数则会被传递给该程序做为参数。比如



spawn ftp ftp.linux.ibm.com 
这样就会衍生一个ftp进程,并将ftp.linux.ibm.com作为一个参数传递给ftp进程
      用户通过 spawn,send 和 expect 这三个基本命令,就可以编写一段 Expect 程序来实现自动化工作。下面我写一个自动ssh到远程服务器的expect脚本(名为)ssh_server
#!/usr/bin/expect

set timeout 60          #设置超时时间为60s
set host 192.168.1.2    #设置服务器的ip
set name root           #设置登录的用户名
set password  ******    #设置root用户的密码

spawn ssh $host -l $name       #spawn一个ssh进程

expect {    # 等待响应,第一次登录往往会提示是否永久保存 RSA 到本机的 know hosts 列表中;等到回答后,在提示输出密码;
      "(yes/no)?" {
           send "yes\n"
           expect "password:"
           send   "$password\n"
      }
      "password:"  {
          send "$password\n"
      }
}

expect "#"
#下面检测是否登录到host
send "uname\n"
expect "Linux"
send_user  " Now you can do some operation on this terminal\n"
interact   # 这里使用了 interact 命令,使执行完程序后,用户可以在 $host 终端进行交互操作。


阅读(4346) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~