TCL脚本实例解读作者:杨帆、老卢前言Sigma的这段日子在技术方面感觉提高的方面可能就是脚本的编写吧,我感觉写一个可用的脚本,并不一定非的在于你对脚本有了多了解之后,然后再去实现一个切合实际的脚本,最主要是思路,当你对所需要使用的脚本工具有一定的理解(如:TCL),在一个实际环境,首先能有个明确的想法,想实现个具体的什么东西,怎么样的思路可以实现,大脑里具备了这些条件,就可以尝试去写一些脚本。
当然了,在实现的过程中肯定会遇到这样或者那样的问题,但一般来说,基本都是一些对脚本语法以及命令不熟悉的原因造成,这些问题很好解决,可以跟熟悉脚本的同事讨论,来帮你解决当时的问题,所以,千万不要因为还没有开始,就将脚本看得非常困难,导致自己一直无法迈出第一步,其实有些东西还是比较容易实现的。
所以在此将我写的几个脚本在此解读解读。
文档目的这篇文档中所附带的脚本,主要是根据Sigma这边搭建的系统测试环境而撰写出来的,脚本内容可能与今后Sigma公司为我们所开发的系统测试脚本无关,当撰写完这几个脚本之后,各人感觉有些东西还是比较有价值的,因此本人将此脚本撰写为文档,将这些东西共享出来供大家分享、借鉴、参考,相信看完这篇文档,因该会提供很多切合实际测试的一些脚本开发思路。
还有,这篇文档并非一篇解释TCL命令的文档,有许多脚本中的相关命令不熟悉的地方需要查找其它资料,部分命令只做了解释或者介绍。
感谢!:)这些脚本的撰写过程中感谢小康同学与小井同学的帮助(很多地方错误的查找、以及提供了一些解决关键问题的命令,如果没有他们的帮助,这个脚本完成的难度就大了,有很多也是他们的功劳)环境介绍这里提到的环境主要介绍的是系统测试的物理网络TOP环境与逻辑网络TOP环境,因为脚本里面的内容跟这个具体环境有关:物理网络TOP,物理网络TOP所描述的实际是所有测试PC与DUT连接的物理线路图,实际物理TOP分为两个部分,控制网络与测试网络:(在这个实际环境中要求所有参与测试PC拥有两块可用的物理网卡,一块接控制网络交换机,另一块网卡连接测试网络交换机,测试网络交换机必须支持Vlan 的划分,在某种特殊情况要求有trunk功能的支持,如测试网络交换机接口不足的情况,需要添加新的交换机,不同的交换机相同VLAN之间需要通信的需求,额外话题)控制网络:我们可以从上图看到,所有PC的网卡eth1同在同一数据链路,IP 也在相同网段,控制网络的目的是为了方便通过其中任意一台PC来控制其他的PC做一些事情,比如让某些PC在Testing网络建立一些连接,或者发送一些数据包,如何来控制,其实看完这篇文档实现的脚本,也就没有那么神秘了。
测试网络:实际这个网络就是专门构建我们DUT测试环境的网络TOP,根据划分VLAN创建不同的逻辑TOP。
比如把DUT的某个接口eth0放入某个VLAN,将一些测试PC划入此VLAN,将DUT的另一个接口eth1放入另一个VLAN,其中此VLAN划入一些PC,这个TOP相当于DUT两个接口连接了两个不同,逻辑上的网桥。
(一个VLAN相当于是一个独立的网桥)如下图,我们系统测试测试网络的逻辑TOP(列出供大家参考):从上图可以见到,在实际环境中搭建,至少可能需要六台交换机(少画两台),但在这个环境只用上来两台交换机,使用Vlan和Trunk实现。
脚本介绍在做详细的脚本分析之前我们首先先对这些脚本做一个简单的介绍。
这篇文档脚本实例中有部分是存在一定关系的,目的为执行不同的功能,但可以调用其它脚本执行所产生的变量。
以下列出脚本的文件名称,对以下脚本的功能以及实现的目的做一个简单介绍:reach_host.tcl:检测控制网络存在的PC,将所有存在(可ping通)的PC放入一个变量形成一个列表。
这个文档的目的是因为控制所有控制网络PC去做一些测试操作时,使用的都是IP通信,因此我们要保持测试网络的连通性,可能需要经常的去做一些ping的操作,因此做了一个这样的脚本来执行这件事情。
这个脚本是借鉴Sigma的同事修改过来的,其他所有的脚本思路都是从这个脚本出发。
这个脚本在这一系列脚本中,目的并不只是单纯的测试连通性,其实还有其他用途,比如我们的系统测环境所有PC分为四个区域,每个区域之间的PC的IP并不连续,我们可以通过这个脚本将所有可用的PC做成一个列表,将这个列表应用在其它的脚本。
✧setup_tools.tcl:这是一个单独得脚本,目的是将所有控制网络中可以Ping通的设备安装一些工具。
(其实这个脚本可以扩展,只需要了解其他需要安装的linux软件步骤,即可向此脚本中补充,这里面只是拿出几个例子来提供一些思路)✧ipaddr_configure.tcl这个脚本运用到之前reach_host.tcl运行输出的控制网络存活PC的列表,然后在对这些列表中的PC配置eth0(测试网络)的IP地址。
✧hostname_configure.tcl(此脚本由老卢完成,脚本的解释后续添加)这个脚本运用到之前reach_host.tcl脚本运行输出的结果(所有控制网络可连同PC的IP列表),然后在对这些列表中的PC配置主机名,但每个PC的主机名的第一个字符必须相关区域的字符,比如:A区的第2台PC IP地址为10.11.105.12,B区的第8台PC地址为10.11.105.28,我们根据相同颜色来分析他们的对应关系,A对10,B对20,C对30等(具体可以看系统测试TOP的IP列表)。
✧pc_list.tcl设置所有控制网络的IP变量,可以让其他脚本直接调用,使用其变量,避免每次新的脚本,使用到一些主机名字与IP对应关系得变量,每次都需要申明,避免麻烦就建立了一个这么列表。
相当于在C语言中,我将所有需要经常用到的常量在一个文件中逐个define,然后其他的文件include。
✧traffic_control.tcl这个脚本可能是代码与内容最多的一个了(也是我最有成就感的一个)。
这个脚本的目的是随时地控制TOP图中存在的任意PC与另一台PC建立任意通信(不过目前脚本中只是包含ping与ftp,要将其他的通性方式加入目前非常简单只需要将步骤往脚本中填入),在执行这个脚本时,只需相应主机控制网络存活,不需要了解测试网络中的IP地址,就可以让双方建立通信。
比如:在这个系统网络中,如测试网络逻辑TOP(图二)所列出的PC,我只需要在其中某台PC运行此脚本,如FTP:./traffic.control.tcl A1 ftp A2 get aaa 10执行这个脚本的人不需要知道这两台主机的IP是多少(当然脚本会知道),就可以实现A1主机与A2进行FTP通信,get(可以put)一个aaa的文件,get这个操作循环10次忘了说明,这些脚本都由TCL结合Linux下的命令实现,对以上脚本做一个简单描述只是带领大家能对脚本产生一定的兴趣,其实当看了脚本之后,你们会感觉实际实现起来并非那么神秘,就只是将Linux下的命令调来调去!首先我们先进入第一个脚本的解释吧!!#/usr/bin/tclshset reach ""#设置变量reach,内容为空set unreach ""#设置变量unreach,内容为空set hostbase "10.11.105"#因为我们所有ip的前三个字节相等,变化的只是第四个字节,因此将前三个字节放入变量for {set i 11} {$i<49} {incr i} {#我们的主机第四位字节最低为11,最高为48,设置i为11,小于49,incr代表i递增1 catch {exec ping $hostbase.$i -c 2} r#exec代表在linux执行ping这个命令,-c 2代表只发送两次icmp报文(linux下默认ping是#不会停止的),catch将所有打印付给变量r。
注意:当catch “{}”中如果内容出错,此#程序不会停止,将打印全部交给r,然后继续执行下一条tcl语句,至于$hostbase.$i,我#也是当时才知道原来可以这么连着使用,在执行ping命令之前,将被解释为此次循环的ip #地址,如果此时为第三次循环$hostbase.$i为10.11.105.13if [regexp {ttl} $r] {#判断语句,使用regexp来匹配变量r中是否存在ttl字段(只有ping通系统才会打印此字段)puts "Host $hostbase.$i is Active!"#如果为第三次循环将打印Host 10.11.105.13 is Active!的信息,其中$hostbase.$i将会#被替换为相应得数值lappend reach $hostbase.$i#lappend将这个IP地址追加到reach这个变量,建立一个列表,如果此时为第三次循环,#reach中的变量将是”10.11.105.12 10.11.105.12 10.11.105.13”,其实所谓的列表就是在#变量中各个字符串之间使用空格隔开} else {puts "Host $hostbase.$i is Down!"#如果为假,同样也会打印lappend unreach $hostbase.$i#然后将这个ip追加到unreach这个变量中(行成列表)}}puts "Reach Host Are:$reach"#循环完毕,将所有ping成功的设备ip打印puts "Unreach Host Are:$unreach"#循环完毕,将所有ping失败的设备ip打印看了上面这个脚本是否觉得比较简单?虽然简单,但实际用途中这个脚本是非常有用的,在系统测试实施中,既省时间又省力!而且在其他的脚本中都会用到此脚本首先做个探测,将所有可以连通的主机做一些操作,其实还有个用处,要知道,我们定义的主机区域之间的IP并不是连续的,通过这种方法我们可以把中间不连续的ip空缺给排除,这后去案例中可以看到。
在讲述第二个脚本之前,我首先在此简单的提一下关于expect这个命令,这个命令在实际运用中非常有用,在这篇文档之后的脚本中,几乎没有离开expect,expect几乎可以把你目前可以做的是用全部作完。
在执行一些脚本时,难免会碰到一些人机交互的过程,最常见的就是登陆的过程,对方要求输入用户名密码,通过shell脚本,这一部分可能需要用户本人来实现,而在TCL中使用到expect这个特性,此问题得到解决。
(首先,这篇文档并非一篇详细的关于expect文档,因此只在这简单介绍到expect的部分使用与个人理解)在安装完TCL之后expect是需额外安装的,给人感觉就像个外挂、插件、TCL的扩展,怎么理解都行,因为在此目的是把它用上。