文档库 最新最全的文档下载
当前位置:文档库 › TCL脚本实例解读

TCL脚本实例解读

TCL脚本实例解读
TCL脚本实例解读

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/tclsh

set 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.13

if [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的扩展,怎么理解都行,因为在此目的是把它用上。但安装完expect之后

(请查找相关安装文档),在脚本中用到expect,脚本执行的时候同样需要通过TCL解释器来做。

我们详细的单独拿ftp到其他设备来做个例子,让脚本自动输入用户名密码,然后退出,如下:

spawn ftp 192.168.1.1

expect “User (10.11.20.36:(none)):” {send “yangfan\r”}

expect “Password:” {send “yangfan\r”}

expect “ftp>” {send “get test.txt\r”}

expect “ftp>” {send “bye\r”}

以上是一个简单的expect过程,如果是用普通的shell脚本,其中包含ftp的通信过程,可能这一部分需要用户手动来输入相关信息。在这个脚本中,重要提到的是spawn、expect、send这几个关键字,至于语法可以按此例照搬。Spawn 与expect是因该成对出现,通过spawn的执行相当与打开一个expect的通道,之后的expect结果将根据spawn后面所执行的命令来做一系列的交互式操作(在此例中通过spawn将针对ftp 192.168.1.1做一系列的expect交互式操作)。当通过spawn打开此ftp之后,将有一个全局变量spawn_id被赋值,以上脚本为例,会将系统中此ftp运行的进程id赋值给spawn_id。当脚本执行ftp 192.168.1.1之后,第二句脚本含义是将User (10.11.20.36:(none)):字符串与expect中的buffer 匹配(每当执行一个动作,会将系统输出信息放入expect_out(buffer)这个变量),如果匹配,将执行“{}”中send语句,将此内容向ftp进程送出,”\r”代表回车。说白了就是当ftp后,如果出现字符串User (10.11.20.36:(none)):,然后输入用户名yangfan回车到下一步,然后期待出现字符串Password:,将输入密码yangfan 回车,然后如果出现ftp>字符穿,继续输入get test.txt,最后在出现ftp>的时候再输入bye退出ftp交互过程。

简单讲述了上面的expect,我们继续看下面的脚本实例:

在讲述在各脚本之前,我首先描述一下执行环境,我当时在在控制网络的某一个pc上执行的,我首先将需要安装的软件copy到我执行此脚本的pc/root/linuxtools目录中(在linux下可以通过scp这个命令将本地的文件cp到远程主机),我想通过脚本将此目录下所有软件包通过ssh拷贝到所有可以连通

的测试网络PC上,我使用的这些安装包都是tar包,tar包需要首先通过tar命令解压缩,解完压缩后一般都是安装包相关的一个安装目录,所有安装文件都在目录下面,因此当时我已经在本地解完压缩,因此我只需要将我那几个安装包的目录cp到其它PC,然后远程进行安装,安装文件目录为一下几个

需cp到远程主机的目录:libpcap-0.9.4/ libevent-1.1a/ libpcap-0.9.4/ fragroute-1.2/ vi setup_tools.tcl

#!/usr/bin/tclsh

package require Expect

#当脚本中使用到expect特性,需要注明以上

set hostbase "10.11.105"

set hosts ""

set reach ""

set unreach ""

for {set i 11} {$i<49} {incr i} {

lappend hosts $hostbase.$i

}

#上面这一步目的是让所有10.11.105.11至10.11.105.48的pc形成一个列表置入变量$hosts puts "Seach reach hosts,waiting a moment!"

#通过puts来打印一串字符串消息

foreach host $hosts {

#foreach的含义是将$hosts的列表中ip地址逐个取出放入变量host中,每次取完一个将交给下面#的语句执行,一直循环到最后一个列表成员取完(foreach详细查看TCL相关命令解释)catch {exec ping $host -c 2} output

#如果是第三次循环,$host变量中的值因该为10.11.105.13,然后执行ping,将结果通过catch #给变量output

if [regexp {ttl} $output] {

lappend reach $host

#如果$output中有ttl,将此ip追加到列表reach中

} else {

lappend unreach $host

#如果否,将此ip追加到unreach中

}

}

puts "Reach hosts:"

puts $reach

#将所有可达的主机地址全部打印。实际上面所有操作结果与目的同reach_host.tcl脚本一致,#只是中间穿插了一下foreach的使用方法

foreach host $reach {

#在此,我们已知$reach中包含的主机地址列表全部为控制网络可以连通的地址,我们将所有可#连通地址逐个取出来付给变量host执行下面语句

catch {spawn scp -r /root/linuxtools root@$host:/root/} a

#scp是linux下的一个命令,这个命令在此的意义是将本地/root/linuxtools目录下的所有文件#拷贝到 root@$host:/root/下面,-r参数是包含目录,$host在此是个变量,当执行时它是个从#$reach中取得的Ip地址

set timeout 40

#设置timeout时间,此时间是个全局变量,控制expect的超时时间,当expect在执行到某部阻塞#无法继续往下执行的时候,通过此设置时间进行超时

expect {

"(yes/no)" {send "yes\r";exp_continue}

"password:" {send "talent\r" }

timeout

}

#此可能需要详细解释一下

expect{

}

expect “” {}的区别

#两个在同时使用的时候实际都是单独得一个expect执行命令,前者在这条命令中expect中有多

#条期待需要执行,比如在我们实际的环境,我们使用scp或者ssh到远程的一台机器时,本地启#动后每第一次连接对方的时候都回有(yes/no)的打印,但我们不能保证每次我们所做的操作

#都是第一次连接到对方,如上例,使用expect “yes/no” {send “yes”},如果没有所期待yes/no #的输出,此时将会阻塞,但使用前者的话,如果没有yes/no的输出,将继续执行下

#一条语句寻找所期待的字符串,如此例子,如果没有yes/no的期待,会使用Password:去

#expetc_buffer寻找匹配字符串(在我们的例子中,Password:在buffer中每次肯定是会存在的)#\r代表回车,exp_continue代表执行完成之后,在继续从expect重新开始寻找匹配的字符串(注#意:这里所指的从expect开始,也就是从头开始继续寻找expect{}中所可以匹配到的字符串)# 如,telnet到linux设备之后

Expect {

“username” {send “root\r”;exp_continue}

“password” {send “abcd\r”;exp_continue }

“]#” {send “ls\r”;exp_continue }

}

# 此时会出现死循环,因为在expect中所期待的第三句”]#”,当执行ls之后,此时执行

#exp_continue ,而exp_continuel将从expect最开始寻找期待匹配的字符串(从“username”#开始),ls的输出结果交给exp_buffer(此事buffer中肯定会有”]#”的字符串,如果你想象不到#这个场景,我们可以回忆,我们在windows dos下C:>下敲一个dir,目录打印出来后,最后的字#符串依然是C:>),因此当执行到”]#”又将开始执行ls,死循环开始了

catch {spawn ssh root@$host} a

#做完上面的安装文件copy过后,在通过ssh登陆到这台设备(目的,是通过ssh在远程的pc上做#安装软件的操作),ssh root@$host转变过来就是ssh root@$10.11.105.x,root@的意思表明用#什么用户登录,这是linux下的一个命令。

expect {

"yes/no" {send "yes\r";exp_continue}

"password:" {send "talent\r";exp_continue}

}

#当登录完成之后

expect "]#" {send "cp -rf /root/linuxtools/libdnet-1.11 /usr/local/\r"}

expect "]#" {send "cp -rf /root/linuxtools/libpcap-0.9.4 /usr/local/\r"}

expect "]#" {send "cp -rf /root/linuxtools/libevent-1.1a /usr/local/\r"}

expect "]#" {send "cp -rf /root/linuxtools/fragroute-1.2 /usr/local/\r"}

expect "]#" {send "cd /usr/local/libpcap-0.9.4/\r"}

expect "libpcap-0.9.4]#" {send "./configure&&make&&make install\r"}

expect "libpcap-0.9.4]#" {send "cd /usr/local/libdnet-1.11\r"}

expect "libdnet-1.11]#" {send "./configure&&make&&make install\r"}

expect "libdnet-1.11]#" {send "cd /usr/local/libevent-1.1a\r"}

expect "libevent-1.1a]#" {send "./configure&&make&&make install\r"}

expect "libevent-1.1a]#" {send "cd /usr/local/fragroute-1.2\r"}

expect "fragroute-1.2]#" {send "./configure&&make&&make install\r"}

expect "fragroute-1.2]#" {send "exit\r";exp_continue}

}

#以上的实际整个步骤就是将cp到/root/linuxtools/下的工具安装目录在cp到/usr/local/下进#行安装,这个在安装软件过程中不是必要的,我的安装操作步骤繁琐了点,但我借介绍的只是#实现思路,其它的并不重要,但所有软件安装目录cp完了之后,在cd到每个软件安装目录下执#./configure&&make&&make install,这个是软件的安装命令,然后逐个的cd到不同的软件目录,#逐个的执行./configure&&make&&make install这条命令进行安装

puts "Host:$host fragroute is setup over!"

#然后再打印出某个Ip主机软件安装完毕

}

实际到这一步我们可以看出,整个软件安装的思路:

取出需要安装软件的PC,在一个变量hosts中形成列表

通过foreach将hosts的Ip逐个取出放入host变量

将本地所有需要安装软件拷贝到host主机(通过expect与linux下scp这个命令实现)

通过ssh登录到host这台主机在host主机上进行安装软件(expect与linux 下ssh命令实现)

软件安装完毕,通过foreach在hosts变量中取得下一台需要安装软件的主机

再作1-4描述的操作。

其实如果明白了这个脚本的思路,后续的脚本是很容易看明白的,因此,后续的脚本中,一些雷同的步骤就不再做详细解释了。

ipaddr_configure.tcl

这个脚本目的是将所有控制网络中能连通的pc,eth0网卡配置上ip地址,但遵循一定规律,如下(别忘了,eth1上的ip地址已经手动配置好了):

A区域PC 4eth1 IP 10.11.105.14eth0 IP 192.168.14.2 GW 192.168.14.1

B 区域P

C 8 eth1 IP 10.11.105.28eth0 IP 192.168.28.2 GW 192.168.28.1

也就是eth1 IP的第四个字节与eth0 IP的第三个字节相同(请参考我们控制网络的IP规律,图1已经全部标出)。下面这个脚本将会调用我们第一个实例的脚本reach_host.tcl。

ipaddr_configure.tcl

#!/usr/bin/tclsh

package require Expect

source /root/tclscript/reach_host.tcl

#其实思路一样,给所有控制网络可以连通的设备做以下的操作,因为本身就有这么一个功能的#脚本存在(第一个案例),在这个脚本中,我们使用source命令首先来执行这个文件,这个脚#本将会产生一个变量reach(所有可以ping通PC的列表)供以下的命令使用,相当于c语言的

#include语句.

foreach host $reach {

puts "Host $host start ip configure process:\n"

#取出其中一个ip

set ipaddr [split $host {.}]

#通过split命令将Ip分割为列表赋值给ipaddr。如host中Ip为10.11.105.11,split通过”.”将此#Ip字符串分割为”10 11 105 11”赋给ipaddr

set net [lindex $ipaddr 3]

#从ipaddr列表中通过lindex取出第4个赋值给net变量(从0开始计算,因此为3)。

catch {spawn ssh root@$host} r

#然后ssh登录在这台pc

puts "spid = $spawn_id \n"

#这条语句在这个地方使用没有什么意义,只是为当时调试,不过spawn_id这边变量在某些情况#用的着,怕到时候忘掉这个单词,因此就把它留在这供以后查找

set timeout 40

expect {

"yes/no" {send "yes\r";continue}

"password:" {send "talent\r"}

timeout

}

#通过ssh登录到这台主机

expect "]#" {send "echo

DEVICE=eth0>/etc/sysconfig/network-scripts/ifcfg-eth0\r"}

#登录后同样也是使用linux下的命令echo向/etc/sysconfig/network-scripts/ifcfg-eth0写入#配置信息,ifcfg-eth0这个配置文件保存的网卡的一些基本信息,可以通过修改此配置文件来修#改ip等基本信息,在这里需要注意的是,使用的是echo>,后续使用的是echo>>,>代表覆盖,这#里设计的含义是首先将之前这个配置文件中的信息通过第一条覆盖,后续的信息将通过追加的#方式来向这个文件补充信息

expect "]#" {send "echo

ONBOOT=YES>>/etc/sysconfig/network-scripts/ifcfg-eth0\r"}

expect "]#" {send "echo

BOOTPROTO=static>>/etc/sysconfig/network-scripts/ifcfg-eth0\r"}

expect "]#" {send "echo

IPADDR=192.168.$net.2>>/etc/sysconfig/network-scripts/ifcfg-eth0\r"} expect "]#" {send "echo

NETMASK=255.255.255.0>>/etc/sysconfig/network-scripts/ifcfg-eth0\r"} expect "]#" {send "echo

GATEWAY=192.168.$net.1>>/etc/sysconfig/network-scripts/ifcfg-eth0\r"} expect "]#" {send "service network restart\r"}

#ifcfg-eth0的信息添加完毕之后,将执行linux下service network restart这条命令,来促使#上面的配置生效。

expect "]#" {send "exit\r"}

#然后在linux送出exit,退出登录的ssh,ssh进程结束,expect也就跟着结束puts "Host $host ip configure was finished!i\n"

}

看完上面这个脚本,是否有新的想法来实现以下自己想实现的东西?

接着介绍

pc_list.tcl

这个里面实际就是控制网络ip的列表,我在这里面定义了32个变量,每个变量对应一台主机,每个变量的内容是这台主机的实际IP,目的是位了让其它的脚本使用,免得每次都需要来给这些变量赋值。如:后续要介绍的traffic_control.tcl 就会用到这个脚本。

pc_list.tcl

#!/usr/bin/tclsh

set A1 10.11.105.11

set A2 10.11.105.12

set A3 10.11.105.13

set A4 10.11.105.14

set A5 10.11.105.15

set A6 10.11.105.16

set A7 10.11.105.17

set A8 10.11.105.18

set B1 10.11.105.21

set B2 10.11.105.22

set B3 10.11.105.23

set B4 10.11.105.24

set B5 10.11.105.25

set B6 10.11.105.26

set B7 10.11.105.27

set B8 10.11.105.28

set C1 10.11.105.31

set C2 10.11.105.32

set C3 10.11.105.33

set C4 10.11.105.34

set C5 10.11.105.35

set C6 10.11.105.36

set C7 10.11.105.37

set C8 10.11.105.38

set D1 10.11.105.41

set D2 10.11.105.42

set D3 10.11.105.43

set D4 10.11.105.44

set D5 10.11.105.45

set D6 10.11.105.46

set D7 10.11.105.47

set D8 10.11.105.48

接着我们来说明以下traffic_control.tcl这个实例吧,但首先了解这个脚本的目的,我们可以看我们的测试网络的逻辑TOP(图二),我们只需要保证控制网络可连通,执行这脚本可以指定TOP中任意一台PC与另一台PC的进行通信(脚本中包含ping、ftp),执行脚本而并不需要知道测试逻辑TOP主机的IP地址。目前缺点是,测试网络的TOP搭建要求正确,而且每个目的主机需要提供相关服务,而且脚本只可以执行两台设备的通信,如果要主机之间的通信需要将此脚本分别执行多次,目前不支持一些排错信息。

之前我的构想是:

执行./traffic_control.tcl A1 ftp B2 get(put) filename 10

当我执行这个脚本是A1对应得主机向B2对应的主机发起ftp通信,向B2上get或者put一个filename(可指定),然后指定这个get或put的动作做10次,首先了解我的想法然后我们在具体看这个脚本内容。A1 ftp B2 get\put filename,均作为可选参数,ftp在此同样为一个可选参数。这个脚本可以在控制网络任意一台主机上执行。

在设计这个脚本之前,我们来看看整个过程的思路:

首先当用户输入脚本时

脚本需要知道输入这个两台主机相应的控制网络的IP。(pc_list已经定义) 通过控制网络ip,脚本至少必须知道发起通信目标主机的IP地址。(通过ssh 上去取得)

判断通信类型,是ping还是ftp或者其它。(每一个通信类型都可以给不同数量或者内容的参数)

思路就这么几条,但在实现的过程中却有很多问题需要等待解决,具体看下

面脚本的解释吧!

traffic_control.tcl

#!/usr/bin/tclsh

package require Expect

source /root/tclscript/pc_list.tcl

#执行这个pc_list.tcl脚本

#source /root/tclscript/reach_host.tcl

#这条命令无效,通过#注释无效

proc trff_control {} {

#定义一个trff_control的过程

global A1 A2 A3 A4 A5 A6 A7 A8 B1 B2 B3 B4 B5 B6 B7 C1 C2 C3 C4 C5 C6 C7 C8 D1 D2 D3 D4 D5 D6 D7 D8

#因为之前执行的pc_list.tcl所有变量是个全局的变量,在过程中需要使用到的话需要在这个过#程中使用global声明一下

set C_sou_hostname "" #控制网络的主机名,将来主动发起通信方

set C_des_hostname "" #控制网络的主机名,将来主动发起方的目

set C_sou_hostip "" #控制网络的ip,通信主动发起方

set C_des_hostip "" #控制网络的ip,通信接受方

set T_sou_hostip "" #逻辑网络的ip,通信发起方

set T_des_hostip "" #逻辑网络的ip,通信接受方

#定义部分变量,这样使得以后的编写过程中更容易区分

set trff_type "" #设置通信类型,如ftp、ping、nc、nmap等等

global argv argc argv0

#因为argv argc argv0这三个变量是全局变量,在这个过程中需要用到此变量需要用global申明#一下

set C_sou_hostname [lindex $argv 0]

#我将脚本执行输入的第一个参数定义为发起方的主机名

set trff_type [lindex $argv 1]

#我将脚本执行输入的第二个参数定义为通信类型

set C_des_hostname [lindex $argv 2]

#我将脚本执行输入的第一个参数定义为接受方

set arg1 [lindex $argv 3]

set arg2 [lindex $argv 4]

set arg3 [lindex $argv 5]

set arg4 [lindex $argv 6]

#定义其它的参数,考虑到今后通信类型的不同,参数也不一样,因此暂时定义了几个为将来通#信类型命令的参数先留着,少了在加,多了也没有关系

set C_sou_hostip [subst $$C_sou_hostname]

set C_des_hostip [subst $$C_des_hostname]

#subst这个命令很关键~,因为这个命令解决了很大的问题,如果没有这个命令,可能这个脚本#就比较繁琐。比如,我们将通过lindex $argv 0得到一个字符串A1,然后又将这个A1字符串赋#给C_des_hostname,但我的目的是想输入的A1与我们这个脚本里定义的$A1联系起来,最终目#的是想当用户输入A1时,将$A1的ip直接赋值给C_sou_hostip,但TCL不支持

set C_sou_hostip $$C_sou_hostname

#的方式,但只通过subst就很简单实现了,我在此说的是罗嗦了点!为什么?因#为当时如果不#是小康同学提供此参数,我走了很多弯路,因此在这强调一下。

puts $C_sou_hostip

puts $C_des_hostip

#打印出刚才获取到的ip

catch {spawn ssh $C_des_hostip} r

set C_des_id $spawn_id

#将spawn_id值保存在C_des_id,在这里没有实际意义,在多个expect之间需要交互使用的情况下#是有用的

set timeout 40

expect {

"yes/no" {send "yes\t";exp_continue}

"password:" {send "talent\r"}

timeout

}

#通过ssh登录到接受通信的主机,目的是为获取逻辑网络eth0的ip地址

#after 2000

expect "]#" {send "cat /etc/sysconfig/network-scripts/ifcfg-eth0\r"}

#通过expect察看eth0的ip地址,目的为expect_out(buffer)中会有ifcfg-eth0的信息expect "]#" {send "\r"}

regexp {.*IPADDR=([0-9]+\.[0-9]+\.[0-9]+\.[0-9]).*} $expect_out(buffer) match T_des_hostip

#通过regexp命令将expect_out(out)的ip地址筛选出来放入T_des_hostip

puts "Testing dest host IP is $T_des_hostip"

expect "]#" {send "exit\r"}

#退出ssh

catch {spawn ssh $C_sou_hostip} r

#开始ssh登录发起方主机,这目的就是在发起方的主机上开始向对方发起指定的通信了set C_sou_id $spawn_id

#这种情况下保存spawn_id可能会有用处,因为你可能在这台pc上在ftp操作,此时全局的

#spawn_id变量值就会更改,如果没有保存,就无法再次通过expect来执行这一次的ssh操作,需#要重新再次ssh,但在这个脚本案例里面暂时没有用到

expect {

"yes/no" {send "yes\t";exp_continue}

"password:" {send "talent\r"}

timeout

}

#登录成功

if {$trff_type=="ping"} {

#判断通信类型是否为ping,如果为ping

set rec [exec ping $C_des_hostip -c 5]

#通过exec执行ping,发送5次icmp报文给$C_des_hostip(这个变量在上一次ssh已经获取),然#后再将输出结果赋值给rec

puts $rec

#打印$rec

} elseif {$trff_type=="ftp"} {

#如果通信是ftp

catch {spawn ftp $T_des_hostip} r

#我们需要再次spawn,因为为我们仍然需要通过expect来执行一系列交互操作,如果之前的ssh #没有保存到其它变量,就不可对上次的expect进行操作,在这个脚本中已经保存在C_sou_id变#量中

set ftp_id $spawn_id

expect "root):" {send "ftp\r"}

expect "Password:" {send "ftp\r"}

expect "ftp>" {send "cd pub\r"}

expect "ftp>" {send "hash\r"}

puts "FTP trffice is start!!"

for {set i 0} {$i<=$arg3} {incr i} {

#这个i实际是需要循环的次数,通过外部获取,在此我们可以看到通过arg3获取,而arg的变量通#过全局变量的argv的第6组员获取

expect "ftp>" {send "$arg1 $arg2\r"}

#arg1代表的是put或者get,通过argv的第4个成员获取,arg2代表的是文件名,通过argv 5个成#员获取

puts "finished $i times!"

}

puts "FTP trffice is Over!!"

expect "ftp>" {send "bye\r"}

expect "]#" {send "exit\r"}

}

}

trff_control

#执行此过程

总结

看完这些,因该都会有个体会,至少大家因该明白了所谓的控制实际就是通过ssh到被控制的PC上配合expect来执行一系列的命令,来达到“控制”的目的,Sigma公司同事他们的很多脚本也是怎么写的,其实还在于对linux的熟悉程度,了解的越多,解决方案就越多,当然,更高深点的话他们很多人使用ITCL 来实现一些东西,然后再结合C……,呵呵,我只是门外汉,对这些就不参与讨论了。

XML基础教程试题一及答案

XML基础教程试题一及答案 一、判断题(每题2分,共10分) ( )1.最早的计算机标记语言是IBM公司研究员发明的通用标记语言(GML)。( ) 2.一个有效的XML文档肯定是格式良好的文档。 ( ) 3.在一个XML文档中,元素就是整个XML文档的骨架,因此在一个XML 文档里可以有多个根元素和子元素。 ( )4.XML文档里的元素可以嵌套,因此XML文档里的注释也能嵌套。( )5.空元素指的是元素没有内容,但可以有属性。 二、选择题(每题2分,共20分) 下列各题A、B、C、D四个选项中,只有一个选项是正确的,请将正确的选项涂写在答题卡相应位置上,答在试卷上不得分。 1.什么是XML? ( ) A. 一种标准泛用标记语言 B. 一种扩展性标识语言 C. 一种超文本标记语言 D.一种层叠样式表单是.NET托管程序的执行引擎 2.下面哪个不是HTML的优点( ) A. 跨平台.. B. 强大的信息展示能力 C. 标记可自定 D.编写简单C 3.下面哪一个标记语言产生的时间最早。( ) A.XML B.SGML C.HTML D.CML 4.XPath是什么?( ) A.XML的路径语言 B.XML的转化 C. 文档对象模型 D.XML命名空间 5.这行XML声明,声明该文档采用了什么编码标准? ( ) A. GB2312 B. ANSI C. Unicode UTF-8 D. Windows-1252 6.何谓DTD?( ) A.文档架构定义,用来验证XML B.文档类型定义,用来验证XML

C.XML文档的数据部分 D.XML文档的片断 7.何谓DOM?( ) A.XML文档 B.XML文档对象模型 C.XML模型语言 D.XML路径语言 8.采用MSXML解析器创建一个元素类型的节点,应该使用Document接口的哪个方法:( ) A.createAttribute() B.createElement() C.createCDATASection() D.getElementByTagName() 9.一个XML文档以声明开始,在声明中不可使用的属性为:( ) A.是否引用外部文件B.文件大小C.字符编码D.版本 10.关于DOM的描述错误的是( )。 A.DOM使开发者能够以编程方式读取、操作和修改XML文档 B.既能使用JavaScript进行DOM开发,而不能使用Java、C# C.W3C组织公布了DOM模型的规范,然后各个软件厂商(比如微软)再根据W3C的规范开发DOM解析器,并且提供一系列的编程API,这些API都是遵守W3C规范的 D.DOM模型是W3C组织开发出来的一个在内存中表示XML数据的线性模型 三、简答题(每题6分,共30分) 1.XML是什么,它与HTML的区别? 2.什么是DOM? 3.简述解释XSLT? 4.XML文档有哪些部分组成? 5.什么是XML文档中的元素,什么是元素的属性,请举例说明。 四、设计题(每题20分,共40分) 1. XML文档结构:

TCL脚本实例解读

TCL脚本实例解读 作者:杨帆、老卢 前言 Sigma的这段日子在技术方面感觉提高的方面可能就是脚本的编写吧,我感觉写一个可用的脚本,并不一定非的在于你对脚本有了多了解之后,然后再去实现一个切合实际的脚本,最主要是思路,当你对所需要使用的脚本工具有一定的理解(如:TCL),在一个实际环境,首先能有个明确的想法,想实现个具体的什么东西,怎么样的思路可以实现,大脑里具备了这些条件,就可以尝试去写一些脚本。当然了,在实现的过程中肯定会遇到这样或者那样的问题,但一般来说,基本都是一些对脚本语法以及命令不熟悉的原因造成,这些问题很好解决,可以跟熟悉脚本的同事讨论,来帮你解决当时的问题,所以,千万不要因为还没有开始,就将脚本看得非常困难,导致自己一直无法迈出第一步,其实有些东西还是比较容易实现的。所以在此将我写的几个脚本在此解读解读。 文档目的 这篇文档中所附带的脚本,主要是根据Sigma这边搭建的系统测试环境而撰写出来的,脚本内容可能与今后Sigma公司为我们所开发的系统测试脚本无关,当撰写完这几个脚本之后,各人感觉有些东西还是比较有价值的,因此本人将此脚本撰写为文档,将这些东西共享出来供大家分享、借鉴、参考,相信看完这篇文档,因该会提供很多切合实际测试的一些脚本开发思路。还有,这篇文档并非一篇解释TCL命令的文档,有许多脚本中的相关命令不熟悉的地方需要查找其它资料,部分命令只做了解释或者介绍。 感谢!:) 这些脚本的撰写过程中感谢小康同学与小井同学的帮助(很多地方错误的查找、以及提供了一些解决关键问题的命令,如果没有他们的帮助,这个脚本完成的难度就大了,有很多也是他们的功劳) 环境介绍 这里提到的环境主要介绍的是系统测试的物理网络TOP环境与逻辑网络TOP环境,因为脚本里面的内容跟这个具体环境有关: 物理网络TOP,物理网络TOP所描述的实际是所有测试PC与DUT连接的物理

Tcl语言基础教程

Tcl语言参考 Tcl("Tool Command Language",即工具命令语言;Tcl念作“踢叩” "tickle" )是一种易学易用易于扩展的脚本语言,实际上包 含了两个部分:一个语言和一个库。 首先,Tcl是一种简单的脚本语言,主要使用于发布命令给一些交互程序如文本编辑器、调试器和shell。它有一个简单 的语法和很强可扩充性,Tcl可以创建新的过程以增强其内建命令的能力。 其次,Tcl是一个库包,可以被嵌入应用程序,Tcl的库包含了一个分析器、用于执行内建命令的例程和可以使你扩充 (定义新的过程)的库函数。应用程序可以产生Tcl命令并执行,命令可以由用户产生,也可以从用户接口的一个输入中读 取(按钮或菜单等)。 Tcl和其他编程语言例如C不同,它是一种解释语言而非编译语言。Tcl程序由一系列Tcl 命令组成,在运行时由Tcl解释 器解释运行。 Tcl有大量的用C/C++编写的扩展用于提供Tcl本身不具有的功能。其中使用最广泛的扩展是TK,TK提供了各种OS平台下 的图形用户界面GUI(连强大的Python语言都不单独提供自己的GUI,而是提供接口适配到TK上)。另一个流行的扩展包是Exp- ect,它提供了通过终端自动执行命令的能力,例如passwd, ftp, telnet等命令驱动的外壳。

一、Tcl程序基本结构 1、基本语法 Tcl有类似于shell的语法,一条Tcl的命令串包含了一条或多条命令用换行符或分号来隔开,而每一条命令包含了一个 域(field)的集合,域使用空白(空格或TAB)分开的,第一个域是一个命令的名字,其它的是作为参数来传给它。 Tcl解释器对一个命令的求值过程分为两部分:分析和执行。在分析阶段,Tcl 解释器运用规则识别出命令并把命令分 成一个个独立的单词,同时进行必要的置换(substitution);在执行阶段,Tcl 解释器会把第一个单词当作命令名,并查看这 个命令是否有定义,如果有定义就激活这个命令对应的C/C++过程,并把所有的单词作为参数传递给该命令过程,让命令过 程进行处理。 Tcl的命令名可以是内建的命令也可以是用户建的新命令,在应用程序中可用函数Tcl_CreateCommand来创建新的命令。 所有的参数作为字符串来传递,命令自己会按其所需来解释的参数的。 另外关于Tcl的注释有一个特殊的要求:'#'必须出现在Tcl解释器期望命令的第一个字符出现的地方,才被当作注释。 例如: set a 100 # Not a comment

SpirentTestcenter自动化测试脚本TCL

Spirent Testcenter 自动化测试脚本TCL -1 基本功能 2015-06-18 浏览(69) #!/bin/sh # exec tclsh "$0" ${1+"$@"} #----------------------------------------------------- # # #----------------------------------------------------- #引用STC API ,的路径 source {C:Program FilesSpirent CommunicationsSpirent TestCenter TestCenter } #开启日志,-logTo :日志保存路径,使用stdout为标准输 出; -loglevel :可选DEBUG、INFO 、WARN 和ERROR 四种;stc::config automationoptions -logTo "" -logLevel DEBUG #配置机框Ip 槽位端口号 set chassisAddress "" set slotPort1 "8/25" set slotPort2 "8/26" #创建一个项目

set ProjectA [stc::create project] #在项目ProjextA 下创建一个发送端口和一个接收端口 set TxPort [stc::create port -under $ProjectA] set RxPort [stc::create port -under $ProjectA] set portReturn [stc::config $TxPort -location "//$chassisAddress/$slotPort1"] set portReturn [stc::config $RxPort -location "//$chassisAddress/$slotPort2"] #配置端口类型,根据实际端口类型选择参数:Ethernet10GigFiber、Ethernet100GigFiber、Ethernet40GigFiber、Ethernet10GigCopper、EthernetCopper等; set ethernetFiber(1) [stc::create "Ethernet10GigFiber" -under $TxPort -Name "ethernetFiber 1"] set ethernetFiber(2) [stc::create "Ethernet10GigFiber" -under $RxPort -Name "ethernetFiber 2"] #在发送端口下创建StreamBlock(1)

3D脚本maxscript入门教程

3D 脚本maxscript 入门教程 maxscript 入门教程 内容图文并茂,语言高度概括,文采形象生动,思路清晰可见;指出要害,抓住关键,透彻理解那些难懂的编程概念;不用担心数学基础很差,无需害怕英文单词不懂,只需初中数学知识,把英文单词作图形符号看待,拿脚本编程当文字游戏把玩。 能够提高解决问题的能力,可以降低学习脚本的门槛。 不用费力看英文帮助,何需辛苦找编程资料,减轻学习负担,节省宝贵时间!发挥自己的聪明 才智,运用科学的学习方法,首先认真学好入门教程,然后虚心 请教各位高手, 脚本编程从此不再难! 入门教程内容结构 本教程内容分为五个部分,用几个具体的例子讲解大多数的脚本操作和语法知识。一、 MAXScript 简介 1、说明什么是 MAXScript 以及它有什么功能,能给用户带来什么好处。 2、访问脚本,认识脚 本访问的界面。 二、基本操作:创建和修改简单的对象,给对象赋材质,从而引出下面的概念构造器:创建对 象的语法称为构造器; 路径名; 数据类型:它们是数字,字符串,数组。对象和类(层级树);属性和方法; 变换;函数和方法的联系;通用属性和动态属性;显示属性的函数;一些常用的方法; 三、创建和操作具有复杂关系的对象,从而引出下面的概念变量,变量和属性的关系;对象引 用:引用另外一个对象的属性值作为自己的值;数组和集合等:数组,数组和变量的关系;运 算符和表达式; 表达式:求值的规则。流程控制:选择和循环,条件选择。制作简单的动画: "at time" , 动画控制器。 四、换一角度——从大家熟悉的操作流程来学习脚本这是对前面知识的总结,前面是对语法基本概念的学习,现在是从大家操作流程的角度来学习,一纵一横,让我们对脚本有个相对全面的了解,理论和实际相互联系。有了前面的基础才好学下面的内容。 第一步:创建物体一些常用物体的创建方法。 第二步:选择物体 select 路径名,变量名引用条件选择用类和集合选择物体组 Group : 是一个虚拟对象,不是集合。

TCL脚本基本语法

TCL基本语法 1语言简介 TCL缩短工具命令语言的形式。由加州大学伯克利分校的约翰Ousterhout设计它。它是一种脚本语言,由其自身的解释器,它被嵌入到开发应用程序的组合。 TCL最初在Unix平台中。后来移植到Windows,DOS,OS/2和Mac OSX。TCL非常类似于其他UNIX的shell语言,类似Bourne Shell (Sh), the C Shell (csh), the Korn Shell (sh), 和Perl。 它的目的是提供程序与其他程序,也是作为一个可嵌入的翻译相互作用的能力。虽然原来的目的是为了使程序能够进行交互,可以找到由Tcl/Tk 编写的完全成熟的应用。 1.1TCL特性 TCL的特点如下: 1、减少开发时间。 2、功能强大和简单的用户界面工具包整合传统知识。 3、一次编写,随处运行。它可以运行在Windows,Mac OS X和几乎所有的Unix平台。 4、有经验的程序员很容易上手,因为语言就是这么简单,可以在几个小时或几天学习Tcl就可以搞定。 5、可以轻松地用Tcl扩展现有的应用程序。另外,也可以包括Tcl的用C,C++或Java 来扩展Tcl,或反之亦然。 6、有一组功能强大的网络功能。 7、最后,它的开源,免费的,可以用于其他无任何限制商业应用。 2基本语法 2.1命令结构 commandName空格arguments。每条命令之间通过换行或者;隔开。例如: #设置变量foo为0 set foo 0 set bar 1;puts $bar; #设置(set 为一个Tcl命令)变量bar为1,输出(puts也是一个Tcl命令)bar 2.2注释 使用#注释,不过要注意的是下面的注释是错误的: set foo 0 #设置变量foo为0,这种注释是错误的 因为tcl解析器总是认为一条命令应该以换行或者分号结束,其他的在同一行中都认为是参数。所以正确的应该是: set foo 0 #设置变量foo为0,这种注释是正确的 set foo 0; #设置变量foo为0,这种注释是正确的

DC脚本及解释

#script for Design Compiler# Language : TCL# Usage :# 1) make sure the lib in the current directory# 2) if you... #script for Design Compiler # Language : TCL # Usage : # 1) make sure the lib in the current directory # 2) if you have the file .synopsys_dc.setup, # set synopsys_dc_setup_file 1, # if not, set synopsys_dc_setup_file 0 # 3) change Step 3 : Variables to what you want # Especially : top module name, clock name, # reset name, all files name, and period # 4) typing dc_shell-t -f run_72.tcl | tee -i run.log # #===================================================== === set synopsys_dc_setup_file 0 #----------------------------------------------------- # Step 1 : # Setting Up path and library: # If you have edited the file .synopsys_dc.setup, then you can skip over this step #----------------------------------------------------- if { $synopsys_dc_setup_file == 0} { set search_path [list /home/chanshi/dc/library/smic /home/chanshi/dc/rfid/source /home/chanshi/dc/script] set target_library {typical.db} #set target_library {CSM35OS142_typ.db}; # if you want use typical library,change to typical.db #set link_library [list {*} ram_interp_typical_syn.db ram_458_typical_syn.db typical.db] set link_library [list {*} $target_library] } #set symbol_library {csm18ic.sdb csm18io.sdb} #set synthetic_library {dw_foundation.sldb}; # Design Ware set command_log_file "command.log" #----------------------------------------------------- # Step 2 : # Compile Swithes

tcl脚本进行二次开发

HyperMesh中利用Tcl脚本进行二次开发 杨国雄 上海世科嘉车辆技术有限公司

HyperMesh中利用Tcl脚本进行二次开发 Further Develop by Tcl Script Based on HyperMesh 杨国雄 (上海世科嘉车辆技术有限公司) 摘要:当代企业发展的关键是创新,本文通过对HyperMesh软件进来二次开发的两个实例—频响分析流程订制和通过Comps名自动定义单元属性,研讨了通过HyperMesh软件对企业CAE分析流程进行简化,标准化,人性化的可能性。 关键字:Tcl,二次开发,HyperMesh Abstract:Innovation is the key of contemporary enterprise's development. In this paper, 2 examples(customized frequency analysis process and automatic definition of element properties via comps name)were made by further developed of HyperMesh. The possibility of CAE analysis process be simplified, standardized and humanized with HyperMesh software was also discussed. Keyword:Tcl, Further Develop,HyperMesh 1 概述 随着各个行业对CAE技术应用的深入,企业对规范化分析流程,简化前处理等各个方面提出了需求。HyperMesh是一款功能强大的有限元前处理软件,同时还具有丰富的二次开发能力。通过二次开发为企业更好的利用HyperMesh软件提供了可能性。 2 HyperMesh二次开发简介 HyperMesh二次开发主要包括了2个层次的内容——宏命令和Tcl/Tk脚本。宏命令主要功能是定义面板按钮及对Tcl脚本的调用。Tcl/Tk脚本命令可以自定义各类窗口,程序的流程化控制,宏命令、Tcl脚本和C语言程序的关系如图1所示。本文主要讨论Tcl脚本的编写。

驱动课程资料gec6818开发板-刷机教程v1.1-new

GEC6818开发板刷机教程 作者日期版本更新内容粤嵌2017.02.01V1.0初始版本

版权声明 本文档归属广州粤嵌通信科技股份有限公司(以下简称“粤嵌”)所有,并保留一切权利,非经粤嵌同意(书面形式),任何单位及个人不得擅自摘录本文档部分或者全部内容,违者将追究其法律责任。

目录 版权声明 (1) 目录 (2) 第一章前言 (3) 注意事项 (3) 开发板启动顺序 (3) 第二章使用fastboot烧写镜像 (4) Windows下使用fastboot烧写(推荐) (4) 安装串口工具secureCRT (4) 安装fastboot (6) 烧写Linux映像 (6) 烧写android映像 (8) Linux下使用fastboot烧写(不推荐) (11) 安装串口终端minicom (11) 安装fastboot工具 (12) 烧写Linux映像 (13) 烧写android映像 (14) 第三章使用SD卡烧写镜像 (16) 注意事项 (16) Windows下制作SD启动卡(推荐) (16) Linux下制作SD启动卡 (20) 使用SD启动卡烧写Linux映像 (23) 使用SD启动卡烧写Android映像 (24)

第一章前言 开发板的嵌入式操作系统,包含Linux和Android操作系统。我们出厂时会烧写或者固化其中一个操作系统在里面。本手册讲述如何固化嵌入式操作系统到我们的开发板中。 注意事项 我们把编译好的镜像系统文件,通过SD或者USB的下载方式,固化到板载的eMMC储存器中(ROM),以下简称为“‘刷机”。 方法一:通过fastboot工具,USB下载方式 方法二:通过SD卡方式 使用fastboot工具烧写Linux和android映像时,核心板必须存在uboot(引导程序),因为烧写时需要使用uboot上的fastboot功能, 在板子不存在uboot时,请使用SD卡烧写方式。 使用fastboot烧写时,电脑上必须存在串口接口或者拥有usb转串口模块,使其连接电脑与开发板,让电脑能够通过串口与开发板通信 开发板启动顺序 6818开发板硬件配置固定了开发板启动顺序如下: 1st:从TF卡启动 2nd:从EMMC启动 3rd:从USB启动 开发板上电后首先从TF卡启动,若SD0插入了启动卡则从SD启动;如果SD0未插卡或者插入的不是启动卡,则启动失败;然后从板载EMMC(SD2)启动,若EMMC中已经烧录固件则启动成功,否则启动失败,最后尝试从USB启动。

TCL基础教程——(4)字符串处理

TCL基础教程——(4)字符串处理 对于任何一种脚本语言来说,强大的字符串处理功能都是为人们所津津乐道的,TCL也不例外,那么究竟TCL的字符串处理有什么功能呢?下面将介绍简单模式匹配,在日后的文章中,还将介绍正则表达式。String命令 String命令实际上是一组操作字符串的命令,它的第一个变元决定了进行什么样子的操作,所有String 的命令如下:

对于我来说,常用的有如下几个方法,length,equal,match,range,first。请看下面的程序[ppcorn@localhost ppcorn]$ cat strtest.tcl #!/usr/bin/tclsh set str1 str1 set str2 str1 set str3 isstr1?

set str4 he index of str1 # print the length of str1,the value should be 4 puts [string length $str1] # print the str1 equal str2, the value should be 1 puts [string equal $str1 $str2] # print the str2 match str3, the value should be 1 puts [string match *$str1* $str3] # print the 4 to 9 of str4, the value should be index puts [string range $str4 4 9] # print the postion of first str1 in str4, the value should be 13 puts [string first $str1 $str4] [ppcorn@localhost ppcorn]$ ./strtest.tcl 4 1 1 index 13 请注意一下string match的用法,中间使用了*$str1*的用法,这里使用了模糊匹配。一共有三种进行匹配的方式

Spirent Testcenter 自动化测试脚本 TCL(1)

Spirent Testcenter自动化测试脚本TCL -1 基本功能 2015-06-18 浏览(69) #!/bin/sh # aTemplate.tcl exec tclsh "$0" ${1+"$@"} #----------------------------------------------------- # # #----------------------------------------------------- #引用STC API ,SpirentTestCenter.tcl的路径 source {C:ProgramFilesSpirentCommunicationsSpirentTestCenter 4.20Spirent TestCenterApplicationSpirentTestCenter.tcl} #开启日志,-logTo:日志保存路径,使用stdout为标准输出; -loglevel:可选DEBUG、INFO 、WARN 和ERROR 四种; stc::configautomationoptions -logTo "aTemplateLog.txt" -logLevel DEBUG #配置机框Ip槽位端口号 set chassisAddress "192.168.0.100" set slotPort1 "8/25" set slotPort2 "8/26" #创建一个项目

set ProjectA [stc::create project] #在项目ProjextA下创建一个发送端口和一个接收端口 set TxPort [stc::create port -under $ProjectA] set RxPort [stc::create port -under $ProjectA] set portReturn [stc::config $TxPort -location "//$chassisAddress/$slotPort1"] set portReturn [stc::config $RxPort -location "//$chassisAddress/$slotPort2"] #配置端口类型,根据实际端口类型选择参数:Ethernet10GigFiber、Ethernet100GigFiber、Ethernet40GigFiber、Ethernet10GigCopper、EthernetCopper等; set ethernetFiber(1) [stc::create "Ethernet10GigFiber" -under $TxPort -Name "ethernetFiber 1"] set ethernetFiber(2) [stc::create "Ethernet10GigFiber" -under $RxPort -Name "ethernetFiber 2"] #在发送端口下创建StreamBlock(1)

Tcl脚本语言教程

Tcl教程 TCL语法 ■脚本、命令和单词符号 (2) ■置换(substitution) (2) ■注释 (5) 变量 ■简单变量 (5) ■数组 (6) ■相关命令 (6) 表达式 ■操作数 (7) ■运算符和优先级 (7) ■数学函数 (8) List ■list命令 (10) ■concat命令 (10) ■lindex命令 (11) ■llength命令 (11) ■linsert命令 (11) ■lreplace命令 (11) ■lrange 命令 (11) ■lappend命令 (12) ■lsearch 命令 (12) ■lsort命令 (13) ■split命令 (13) ■join命令 (13) 控制流 ■if命令 (13) ■循环命令:while 、for、foreach (14) ■eval命令 (15) ■source命令 (16) 过程(procedure) ■过程定义和返回值 (16) ■局部变量和全局变量 (17) ■缺省参数和可变个数参数 (17) ■引用:upvar (18) 字符串操作 ■format命令 (19) ■scan命令 (20) 1

■regexp命令 ■regsub命令 ■string命令 文件访问 ■文件名 ■基本文件输入输出命令 ■随机文件访问 ■当前工作目录 ■文件操作和获取文件信息 错误和异常 ■错误 ■从TCL脚本中产生错误 ■使用catch捕获错误 ■其他异常 深入TCL ■查询数组中的元素 ■info命令 TCL语法> 脚本、命令和单词符号 一个TCL脚本可以包含一个或多个命令。命令之间必须用换行符或分号隔开,下面的两个脚本都是合法的: set a 1 set b 2 或 set a 1;set b 2 TCL的每一个命令包含一个或几个单词,第一个单词代表命令名,另外的单词则是这个命令的参数,单词之间必须用空格或TAB键隔开。 TCL解释器对一个命令的求值过程分为两部分:分析和执行。在分析阶段,TCL 解释器运用规则把命令分成一个个独立的单词,同时进行必要的置换(substitution);在执行阶段,TCL 解释器会把第一个单词当作命令名,并查看这个命令是否有定义,如果有定义就激活这个命令对应的C/C++过程,并把所有的单词作为参数传递给该命令过程,让命令过程进行处理。 TCL语法> 置换(substitution) 注:在下面的所有章节的例子中,'%'为TCL的命令提示符,输入命令回车后,TCL会在接着的一行输出命令执行结果。'//'后面是我自己加上的说明,不是例子的一部分。 TCL解释器在分析命令时,把所有的命令参数都当作字符串看待,例如: 2

pymol基本教学教程

简介&安装 Pymol是一个开放源码,由使用者赞助的分子三维结构显示软件,由Warren Lyford DeLano编写,并且由DeLano Scientific LLC负责商业发行。Pymol被用来创作高品质的分子(特别是生物大分子如蛋白质)三维结构。据软件作者宣称,在所有正式发表的科学论文中的蛋白质结构图像中,有四分之一是使用Pymol来制作的。 Pymol名字的来源:“Py”表示该软件基于python这个计算机语言,“Mol”则是英文分子(molucule)的缩写,表示该软件用来显示分子结构。 由于实验需要,本人正在学习该软件,在这里把学习过程记录下来,希望对有需要的朋友有所帮助。今天先来说说安装吧。 自2006年8月1日起,DeLano Scientific 对事先编译好的PyMOL执行程序(包括beta版)采取限定下载的措施。目前,只有付费用户可以取得。不过源代码目前还是可以免费下载,供使用者编译。如果你和我一样,不想为此花钱的话: 1.如果你是Windows用户,首先下载Pymol的源代码。 然后安装CygWin,并且确保正确安装以下模块: ?C++ (gcc or g++ package name) ?Python ?OpenGL ?PNG 然后在源代码目录里面依次运行:

2.如果你是Linux用户,首先确保以下东东已安装: ?Python ?Pmw ?OpenGL driver(我用的是NVdia) ?libpng ?Subversion client(下载源代码需要) 然后下载Pymol的源代码 $ mkdir pymol-src $ svn co https://https://www.wendangku.net/doc/1618633611.html,/svnroot/pymol/trunk/pymol pymol-src 然后进入源代码目录 # cd pymol-src 开始依次编译 # python setup.py install # python setup2.py install 拷贝执行脚本到某个$PATH,安装就搞定了 # cp ./pymol /usr/bin

tcl脚本

#无线节点参数 set val(chan) Channel/WirelessChannel ;#无线信道 set val(prop) Propagation/TwoRayGround ;#无线传输模型是TwoRayGround set val(netif) Phy/WirelessPhy ;#网络接口类型是无线物理层 set val(mac) Mac/802_11 ;#MAC层协议采用802.11 set val(ifq) Queue/DropTail/PriQueue ;#接口队列类型是IFQ队列 set val(ll) LL ;#逻辑链路层类型LL层 set val(ant) Antenna/OmniAntenna ;#天线类型是全向天线 set val(ifqlen) 50 ;#网络接口队列的大小是50 set val(rp) AODV ;#无线路由协议是AODV协议set val(x) 600 ;#设定拓扑范围——长度,600m set val(y) 200 ;#设定拓扑范围——宽度,200m set val(stop) 10.0 ;#设定模拟时间,10s set val(nn) 3 ;#节点数,3个 #建立一个模拟实例 set ns [new Simulator] #开启Trace跟踪文件和NAM显示文件 set tracefd [open wireless.tr w] set namtrace [open wireless.nam w] $ns trace-all $tracefd $ns namtrace-all-wireless $namtrace $val(x) $val(y) #建立一个拓扑对象,记录节点的移动情况 set topo [new Topography] $topo load_flatgrid $val(x) $val(y) #创建God(General Operations Diretor)对象,存储网络状态以及节点间连接信息 create-god $val(nn) #创建物理信道对象 set chan_1_ [new $val(chan)] #配置无线节点(包括使用何种路由协议,何种MAC协议,无线信道模型等) $ns node-config -adhocRouting $val(rp) \ -llType $val(ll) \ -macType $val(mac) \ -ifqType $val(ifq) \ -ifqLen $val(ifqlen) \ -antType $val(ant) \ -propType $val(prop) \ -phyType $val(netif) \ -channel $chan_1_ \

TCL脚本语言-14-输入输出系统

输入输出系统 输入和输出相比大家都不陌生。说起它,我就想起来大学第一次写Pascal程序的时候,总要写出这样的代码: Program Test(input,output); Begin Write(‘Hello,World!’); End. 老实说,第一行的input和output两个参数让我迷惑了很久,一直都不明白它们的用途。后来才慢慢的知道它们叫做输入和输出。 输入和输出总是和文件系统紧密相连。现代操作系统中,所有的设备几乎都被抽象成文件系统。但是不同操作系统下文件系统格式不同,例如Unix和Windows、MAC的目录等都有一定的差异。好在TCL语言比较好的解决了这个问题。本章节我们会详细的介绍如何在TCL中操作文件系统以及读写文件。 操作文件系统 TCL中能够非常方便的操作文件、目录。包括:查询和设置文件属性、复制、删除以及路径名字的操作等。所有这些都是通过一个file命令来完成,其语法都非常简单,所以我们这里只是按照分类,列举出该命令的各种用法: 文件属性操作 命令用法描述 file atime name ?time? 返回文件name最后被读取的时间;该命令在FAT文 件系统上无效(返回数据可能不正确); file mtime name ?time? 设置或者修改文件name的最后被修改时间。time参 数表示1970/1/1到现在的秒。设置最后修改时间,和 那个著名的touch命令完成类似的功能; file attributes name file attributes name ?opt? file attributes name ?opt vla? ?opt val?... 查询或者设置文件的属性。第一个命令查询所有的属性;第二个命令查询指定的属性;第三个设置属性的值。 file executable name 看看这个文件是否是可执行的,是就返回1;

TCL-TK编程实践

第3部分 TK基础 23TK基本原理 23.1TK中的Hello,World! 我们的第一个Tk脚本非常简单。它创建了一个按钮,当你点击它时,就向标准输出设备打印“Hello,World!”。在按钮控件上方是一个由窗口管理器提供的标题栏,本例中在X视窗系统中是twm。 23.1.1例23-1 “Hello,World!”Tk程序 第一行标识了脚本的解释器: 如果此脚本象其它NUIX命令文件那样被调用,则这个特殊的行是必要的,第2节描述了如何设置脚本于不同的平台上。 在这个脚本中有两个TCL命令:一个用来创建按钮,一个用来使其在显示上可见。bu tton命令创建一个按钮的实例:

按钮的名字是.hello。按钮上的标签是Hello,与此按钮相关联的命令是: pack命令将按钮映射到屏幕上。并提供了一些堆叠参数,所以在按钮周围有空间。 当你将这两个命令键入wish中时,当button命令给出时,你不会看到任何东西。然而,在pack命令之后,你将会看到空的主窗口将会收缩到足以容纳按钮和其添充空隙(padd ing)。包装器的行为在第24和第25章进行深入的讨论。 Tk使用一种基本对象的系统来创建和命令控件。与每一种小控件(如按钮)相关联的是一个用于创建此种类别控件实例的命令。当小控件被创建时,一个作用在这个控件实例上的一个新的TCL命令就定义了。例23-1创建了一个名为.hello的按钮,并且我们可以使用其名字作为一个TCL命令来操纵此按钮。例如,我们可以使用此按钮高亮几次: 或者,我们可以运行与此按钮相关联的命令: Tk有控件类和实例,但是它并不是完全面向对象的。不可能去对一个控件类派生子类并继承。相反,Tk,提供了非常灵活的控件,可以通过多种方式调节其外观。资源数据库可以存储被许多控件共享的配置信息,并且新的类也可以被引入到组资源中。控件行为通过使用分缓绑定的绑定标签得到共享。Tk使用部件(composition)来组装共享行为和属性的控件。 23.2Tk小控件的命名 按钮实例名字.hello中的句点是必需的。Tk使用了一种可以反映出控件所在层次的命名系统。层次的根就是应用程序的主窗口,其名字就是一个简单的点(也就是.)。这与U NIX系统中的目录命名习惯很相似,其跟目录名为/,/也用来分隔文件名的组成部分。Tk

Emacs 教程初步

Emacs教程初步 ——轮子 注: 1.本文内容大都来自网络,我只时进行了分类编辑,版权属于原作者。(公司内部使用,不要外传) 2.如果你是第一次使用Emacs,可能感觉非常别扭,但不用担心,当你能够熟练使用一些基本操作后,你会喜欢上它的。 1.Emacs是什么 Emacs是一种强大的文本编辑器,在程序员和其他以技术为主的计算机用户中广受欢迎。Emacs,即Editor Macros(编辑器宏)的缩写,最初由Richard Stallman(理查德·马修·斯托曼)于1975年在MIT协同Guy Steele共同完成。这一创意的灵感来源于TECMAC和TMACS,它们是由Guy Steele、Dave Moon、Richard Greenblatt、Charles Frankston等人编写的宏文本编辑器。自诞生以来,Emacs演化出了众多分支,其中使用最广泛的两种分别是:1984年由Richard Stallman发起并由他维护至今的GNU Emacs,以及1991年发起的XEmacs。XEmacs 是GNU Emacs的分支,至今仍保持着相当的兼容性。它们都使用了Emacs Lisp这种有着极强扩展性的编程语言,从而实现了包括编程、编译乃至网络浏览等等功能的扩展。 在Unix文化里,Emacs是黑客们关于编辑器优劣之争的两大主角之一,它的对手是vi。 2. Emacs的安装和配置 2.1 安装 1)源码安装:从https://www.wendangku.net/doc/1618633611.html,/pub/gnu/emacs/下载源码安装 2)在Ubuntu上用sudo apt-get install emacs安装 2.2 配置 在~/目录下有个隐藏的.emacs文件(如果没有,可以自己创建一个),这个就是Emacs 的配置文件。 Emacs在启动的时候会读.emacs文件,根据里面的配置设置启动后的状态。 配置文件的内容要用elisp语言编写。在这里你可以设置自己的颜色主题,字体,快捷键,以及一些Emacs模式(如emacs wiki)的配置等等。 网上有很多人贴出自己的配置,一般来说可以拷贝他们的配置到自己的.emacs文件中,然后再根据自己的喜好进行改动定制配置文件。 下面列出某.emacs文件中的一小部分作为示例:

Python对Excel操作教程(精编文档).doc

【最新整理,下载后即可编辑】 Python对Excel操作详解 文档摘要: 本文档主要介绍如何通过python对office excel进行读写操作,使用了xlrd、xlwt和xlutils模块。另外还演示了如何通过Tcl tcom 包对excel操作。 关键字: Python、Excel、xlrd、xlwt、xlutils、TCl、tcom 1Python简介 Python是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用縮进来定义语句块。

与Scheme、Ruby、Perl、Tcl等动态语言一样,Python具备垃圾回收功能,能够自动管理存储器使用。它经常被当作脚本语言用于处理系统管理任务和网络程序编写,然而它也非常适合完成各种高级任务。Python虚拟机本身几乎可以在所有的作业系统中运行。使用一些诸如py2exe、PyPy、PyInstaller之类的工具可以将Python源代码转换成可以脱离Python解释器运行的程序。 2Python安装 Python目前的版本已经更新到3.4.0,本文使用的版本为2.7.5,所有的版本都可以在python官网https://www.wendangku.net/doc/1618633611.html,/下载,至于2.x和3.x版本的具体区别也可以在官网查看。 从官网下载了python 2.7.5安装文件python-2.7.5.msi后,直接双击就可以安装python了,可以选择安装路径,我改为C:\Python2.7.5\了,然后一路next就完成安装了,安装完成后在C盘下就多了一个文件夹Python2.7.5。 Python也是一种实时交互语言,可以通过自带的IDLE编写python语句并反馈回显信息,可以通过图1方式调出python IDLE。

相关文档