linux下交互式命令expect

上传人:ji****72 文档编号:37544710 上传时间:2018-04-18 格式:DOC 页数:13 大小:69KB
返回 下载 相关 举报
linux下交互式命令expect_第1页
第1页 / 共13页
linux下交互式命令expect_第2页
第2页 / 共13页
linux下交互式命令expect_第3页
第3页 / 共13页
linux下交互式命令expect_第4页
第4页 / 共13页
linux下交互式命令expect_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《linux下交互式命令expect》由会员分享,可在线阅读,更多相关《linux下交互式命令expect(13页珍藏版)》请在金锄头文库上搜索。

1、目录 1.摘要 2.关键字 3.简介 4.Expect 综述 5.callback 6.passwd 和一致性检查 7.rogue 和伪终端 8.ftp 9.fsck 10.多进程控制:作业控制 11.交互式使用 Expect 12.交互式 Expect 编程 13.非交互式程序的控制 14.Expect 的速度 15.安全方面的考虑 16.Expect 资源 17.参考书籍 1.摘要 现代的 Shell 对程序提供了最小限度的控制(开始,停止,等等),而把交互的特性留给了 用户。 这意味着有些程序,你不能非交互的运行,比如说 passwd。 有一些程序可以非交 互的运行,但在很大程度上丧失了

2、灵活性,比如说 fsck。这表明 Unix 的工具构造逻辑开始 出现问题。Expect 恰恰填补了其中的一 些裂痕,解决了在 Unix 环境中长期存在着的一些 问题。 Expect 使用 Tcl 作为语言核心。不仅如此,不管程序是交互和还是非交互的,Expect 都 能运用。这是一个小语言和 Unix 的其他工具配合起来产生强大功能的经典例子。 本部分教程并不是有关 Expect 的实现,而是关于 Expect 语言本身的使用,这主要也是 通过不同的脚本描述例子来体现。其中的几个例子还例证了 Expect 的几个新特征。 2.关键字 Expect,交互,POSIX,程序化的对话,Shell,T

3、cl,Unix; 3.简介 一个叫做 fsck 的 Unix 文件系统检查程序,可以从 Shell 里面用-y 或者-n 选项来执行。 在手册1里面,-y 选项的定义是象这样的。 “对于 fsck 的所有问题都假定一个“yes”响应;在这样使用的时候,必须特别的小心,因为它实际上允许程序无条件的继续运行,即使是遇到了一些非常严重的错误” 相比之下,-n 选项就安全的多,但它实际上几乎一点用都没有。这种接口非常的糟糕, 但是却有许多的程序都是这种风格。 文件传输程序 ftp 有一个选项可以禁止交互式的提 问,以便能从一个脚本里面运行。但一旦发生了错误,它没有提供的处理措施。 Expect 是一个

4、控制交互式程序的工具。他解决了 fsck 的问题,用非交互的方式实现了 所有交互式的功能。Expect 不是特别为 fsck 设计的,它也能进行类似 ftp 的出错处理。 fsck 和 ftp 的问题向我们展示了象 sh,csh 和别的一些 shell 提供的用户接口的局限性。 Shell 没有提供从一个程序读和象一个程序写的 功能。这意味着 shell 可以运行 fsck 但只能 以牺牲一部分 fsck 的灵活性做代价。有一些程序根本就不能被执行。比如说,如果没有一 个用户接口交互式 的提供输入,就没法运行下去。其他还有象 Telnet,crypt,su,rlogin 等程 序无法在 she

5、ll 脚本里面自动执行。还有很多其他的应用程序 在设计是也是要求用户输入 的。 Expect 被设计成专门针和交互式程序的交互。一个 Expect 程序员可以写一个脚本来描 述程序和用户的对话。接着 Expect 程序可以非交互的运 行“交互式”的程序。写交互式程序 的脚本和写非交互式程序的脚本一样简单。Expect 还可以用于对对话的一部分进行自动化, 因为程序的控制可以在键盘和 脚本之间进行切换。 bes2里面有详细的描述。简单的说,脚本是用一种解释性语言写的。(也有 C 和 C+的 Expect 库可供使用,但这超出了本文的范围).Expect 提供了创建交互式进程和读写它们的输 入和输

6、出的命令。 Expect 是由于它的一个同名的命令而命名的。 Expect 语言是基于 Tcl 的。Tcl 实际上是一个子程序库,这些子程序库可以嵌入到程序 里从而提供语言服务。 最终的语言有点象一个典型的 Shell 语言。里面有给变量赋值的 set 命令,控制程序执行的 if,for,continue 等命令,还能进行普通的数学和字符串操作。当 然了,还可以 用 exec 来调用 Unix 程序。所有这些功能,Tcl 都有。Tcl 在参考书籍 Outerhour34里有详细的描述。 Expect 是在 Tcl 基础上创建起来的,它还提供了一些 Tcl 所没有的命令。spawn 命令激 活一

7、个 Unix 程序来进行交互式的运行。 send 命 令向进程发送字符串。expect 命令等待 进程的某些字符串。 expect 支持正规表达式并能同时等待多个字符串,并对每一个字符 串执行不同的操作。 expect 还能理解一些特殊情况,如超时和遇到文件尾。 expect 命令和 Tcl 的 case 命令的风格很相似。都是用一个字符串去匹配多个字符串。 (只要有可能,新的命令总是和已有的 Tcl 命令相似,以使得该语言保持工具族的继承性)。 下面关于 expect 的定义是从手册5上摘录下来的。 expect patlist1 action1 patlist2 action2. 该命令一

8、直等到当前进程的输出和以上的某一个模式相匹配,或者等 到时间超过一个特定的时间长度,或者等到遇到了文件的结束为止。 如果最后一个 action 是空的,就可以省略它。 每一个 patlist 都由一个模式或者模式的表(lists)组成。如果有一个模式匹配成功, 相应的 action 就被执行。执行的结果从 expect 返回。 被精确匹配的字符串(或者当超时发生时,已经读取但未进行匹配的字符串)被存 贮在变量 expect_match 里面。如果 patlist 是 eof 或者 timeout,则发生文件结束或者超时时 才执行相应的 action.一般超时的时值是 10 秒,但可以用类似“s

9、et timeout 30“之类的命令把 超时时值设定为 30 秒。 下面的一个程序段是从一个有关登录的脚本里面摘取的。abort 是在脚本的别处定 义的过程,而其他的 action 使用类似与 C 语言的 Tcl 原语。 expect “*welcome*“ break “*busy*“ print busy;continue “*failed*“ abort timeout abort 模式是通常的 C Shell 风格的正规表达式。模式必须匹配当前进程的从上一个 expect 或者 interact 开始的所有输出(所以统配符*使用的非常)的普遍。但是, 一旦输出超 过 2000 个字节

10、,前面的字符就会被忘记,这可以通过设定 match_max 的值来改变。 expect 命令确实体现了 expect 语言的最好和最坏的性质。特别是,expect 命令的灵活 性是以经常出现令人迷惑的语法做代价。除了关键字模 式(比如说 eof,timeout)那些模式表 可以包括多个模式。这保证提供了一种方法来区分他们。但是分开这些表需要额外的扫描, 如果没有恰当的用 “括起来,这有可能会把和当成空白字符。由于 Tcl 提供了两种字符串 引用的方法:单引和双引,情况变的更糟。(在 Tcl 里面,如果不会出现二义性话, 没有必 要使用引号)。在 expect 的手册里面,还有一个独立的部分来解

11、释这种复杂性。幸运的是: 有一些很好的例子似乎阻止了这种抱怨。但是,这个复杂性 很有可能在将来的版本中再度 出现。为了增强可读性,在本文中,提供的脚本都假定双引号是足够的。 字符可以使用反斜杠来单独的引用,反斜杠也被用于对语句的延续,如果不加反斜杠 的话,语句到一行的结尾处就结束了。这和 Tcl 也是一致的。Tcl 在发 现有开的单引号或者 开的双引号时都会继续扫描。而且,分号可以用于在一行中分割多个语句。这乍听起来有 点让人困惑,但是,这是解释性语言的风格,但是,这 确实是 Tcl 的不太漂亮的部分。 5.callback 令人非常惊讶的是,一些小的脚本如何的产生一些有用的功能。下面是一个拨

12、电话号 码的脚本。他用来把收费反向,以便使得长途电话对计算机计费。这个脚本 用类似 “expect callback.exp 12016442332”来激活。其中,脚本的名字便是 callback.exp,而+1(201) 644-2332 是要拨的电话号码。 #first give the user some time to logout exec sleep 4 spawn tip modem expect “*connected*“ send “ATD index $argv 1 “ #modem takes a while to connect set timeout 60 expec

13、t “*CONNECT*“ 第一行是注释,第二行展示了如何调用没有交互的 Unix 程序。sleep 4 会使程序阻塞 4 秒,以使得用户有时间来退出,因为 modem 总是会回叫用户已经使用的电话号码。 下面一行使用 spawn 命令来激活 tip 程序,以便使得 tip 的输出能够被 expect 所读取, 使得 tip 能从 send 读输入。一旦 tip 说它已经连 接上,modem 就会要求去拨打大哥电话号 码。(假定 modem 都是贺氏兼容的,但是本脚本可以很容易的修改成能适应别的类型的 modem)。不论发生了 什么,expect 都会终止。如果呼叫失败,expect 脚本可以

14、设计成进 行重试,但这里没有。如果呼叫成功,getty 会在 expect 退出后检测到 DTR,并且向用户 提示 loging:。(实用的脚本往往提供更多的错误检测)。 这个脚本展示了命令行参数的使用,命令行参数存贮在一个叫做 argv 的表里面(这和 C 语言的风格很象)。在这种情况下,第一个元素就是电话号码。方括号使得被括起来的部 分当作命令来执行,结果就替换被括起来的部分。这也和 C Shell 的风格很象。 这个脚本和一个大约 60K 的 C 语言程序实现的功能相似。 6.passwd 和一致性检查 在前面,我们提到 passwd 程序在缺乏用户交互的情况下,不能运行,passwd

15、会忽略 I/O 重定向,也不能嵌入到管道里边以便能从别的程序或者文 件里读取输入。这个程序坚 持要求真正的与用户进行交互。因为安全的原因,passwd 被设计成这样,但结果导致没有 非交互式的方法来检验 passwd。这 样一个对系统安全至关重要的程序竟然没有办法进行 可靠的检验,真实具有讽刺意味。 passwd 以一个用户名作为参数,交互式的提示输入密码。下面的 expect 脚本以用户名 和密码作为参数而非交互式的运行。 spawn oasswd index $argv 1 set password index $argv 2 expect “*password:“ send “$pass

16、word “ expect “*password:“ send “$password “ expect eof 第一行以用户名做参数启动 passwd 程序,为方便起见,第二行把密码存到一个变量里 面。和 shell 类似,变量的使用也不需要提前声明。 在第三行,expect 搜索模式“*password:“,其中*允许匹配任意输入,所以对于避免指 定所有细节而言是非常有效的。 上面的程序里没有 action,所以 expect 检测到该模式后就 继续运行。 一旦接收到提示后,下一行就就把密码送给当前进程。表明回车。(实际上,所有的 C 的关于字符的约定都支持)。上面的程序中有两个 expect- send 序列,因为 passwd 为了对输 入进行确认,要求进行两次输入。在非交互式程序里面,这是毫无必要的,但由于假定 passwd 是在和用户进行交 互,所以我们的脚本还是这样做了。 最后,“expect eof“这一行的作用是在 p

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号