使用Perl脚本彻底实现系统管理自动化(1)


交互式程序通常需要用户手动完成一些操作,因此常常会成为系统管理自动化和测试自动化中的障碍。最早出现在 Unix 上的 Expect 语言可以用来和 passwd/ssh/telnet/ftp 等命令行程序进行交互,将用户从这些手工操作中解放出来。作为 Tcl 语言的扩展,Expect 最初由 Tcl 编写,但是现在已经有了 Perl 和 Python 的实现。Perl 作为最为流行的脚本语言之一,整合了 C/sh/sed/awk 的优点且和系统结合紧密,已成为系统管理员有力的工具。本文将介绍 Perl 中的 Expect 和 Expect::Simple 两个模块,结合系统管理和软件测试实例,说明如何实现与命令行程序的自动化交互。

局限性

Perl 的 Expect 模块依赖于 IO::Tty,而 IO::Tty 只适用于 POSIX 兼容系统,所以该模块目前还无法直接在 Windows 环境下使用。有两个变通的方法:一是使用 Cygwin 虚拟机;二是基于 ActiveState 提供的 Expect for Windows 工具,使用 Tcl 语言编写自动化脚本。本文所使用的环境为 RHEL5.3 32 位版本,Perl 5.8.8。

下载和安装

Expect 和 Expect::Simple 都可以从 CPAN 网站上直接下载,最新版本为 Expect-1.21 和 Expect::Simple-0.04。比较方便的安装方法是使用 Perl 自带的包管理工具 cpan:

清单 1. 模块安装


 perl -MCPAN -e 'install Expect::Simple'

请确保有足够的执行权限,cpan 将自动解决模块间依赖关系。由于 Expect::Simple 依赖于 Expect,安装 Expect::Simple 的过程中,Expect 模块以及另外的依赖模块都会自动安装完毕。

Expect 模块详解

与最初的 Expect 语言类似,Expect 模块的主要功能也通过 spawn,expect,send 三个方法实现。

spawn:启动目标程序

清单 2. spawn 方法原型


 $obj = Expect->spawn( $command, @parameters ); 

spawn 是 Expect 类的主要方法之一,通过 fork 和 exec 启动目标程序,若成功则返回 Expect 对象,否则返回 undef。参数 $command 指定目标程序,@parameters 为可选参数。下面是一个简单的例子:

清单 3. spawn 用法示例


 $obj1 = Expect->spawn( "ftp 9.9.9.9" );           # 启动 ftp 进程
 $obj2 = Expect->spawn( "ftp", "9.9.9.9" );        # 与上一行等效  

上述两行执行结果相同,但其实际处理过程存在细微差别。一般情况下我们可以把完整的命令行 ( 甚至可以是复合命令,包括命令、参数、管道符、重定向符等 ) 都写入 $command 而不指定 @parameters。

注:在 spawn 的实现中,$command 和 @parameters 都原封不动地传递给了 Perl 的 exec 函数。根据 exec 函数的说明文档,如果传递进来的是多元列表参数,exec 直接将其传递给 execvp 系统调用;如果传递进来的是标量参数或者单元列表参数,exec 函数将检查是否存在 shell 元字符 ( 如 | & ; ( ) < > 等 ),若存在,则将此参数交给系统 shell 进行解析,否则将其分词后传递给 execvp 系统调用。因此如果 spawn 的是一个含有 shell 元字符的复合命令,我们一般只能将其完整写入 $command。


相关内容

    暂无相关文章