免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4696 | 回复: 5
打印 上一主题 下一主题

共享一个expect程序的功能实现描述和注释,感谢waker [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-09-17 15:06 |只看该作者 |倒序浏览
一个EXPECT程序注释
author:bobkey
date:2007.9.17
mail:toqinbo AT msn.com

上上个周末,我在外地临时抱佛脚写的,由于对expect不深入了解,幸亏得到waker 版主的远程指导,在此衷心地谢谢热心的waker。

现在把这个比较烂的东东贴出来共享,希望能给有需要的人带来启发和帮助,并希望高手能指点改进,在技术上获得提升。



首先,简单说说实现过程:
1.启动交互式程序,然后发送特定指令到网络,并把要发送的号码作为“增加”,会在远程设备上标价一个未知的动态PID值。
2.启动交互式程序,发送查看PID值,用expect -re获得PID值,然后赋值给一个变量,再次发送一个删除指令,把刚才获得的PID作为本指令

的一个参数执行,执行后返回相应的信息,信息有成功、或者各种失败的描述。
3.把每次执行的时间、号码参数、执行种类{del|add}、返回信息记录到日志里。

以下是比较罗嗦的各个部分的描述,为了不泄露客户信息系统的细节,我把关键指令和返回信息用ABC做了替换修改。


整个shell脚本分成块功能,主要是控制整个程序执行流程,提供输入和输出,输入部分是add/del、号码,输出包括屏幕回显消息给监控人

员和日志文件给管理员。对设备操作程序主体其实在两个expect脚本上。
Shell的功能说明:
1.        定义变量,校验输入的参数,是否是两个,是否是号码白名单,由于程序执行需要调用另一个expect脚本,为了方便操作,把变量以

参数形式传递调用;
2.        生成add.exp 和del.exp脚本;
3.        增加函数,负责调用add.exp脚本执行对所输入的号码到设备的新增,并把执行成功的反馈值生成一个以号码命名的文件,内容是新增

成功的设备主机名,同时收集反馈结果输送到日志文件;
4.        删除函数,负责调用del.exp脚本执行对所输入的号码从对应的设备执行删除,此处不需要轮询16台设备,直接把上一次增加功能时生

成的文件参数传递给del.exp,同时收集反馈结果输送到日志文件;


Expect的功能说明:
1.        Add.exp程序接受shell传递的号码参数,并读取设备文件,以轮询的方式新增,一旦执行成功或者失败则退出,并传递返回值给shell

,shell根据返回值把对应的提示信息写道日志里。
2.        Del.xp 程序按照shell传递的号码,判断是否曾经新增过,如没有则退出,否则按照临时文件内容作为参数直接

程序文件说明:
1.        附属文件为白名单,保存可允许操作设备的号码,每行一个;
2.        设备主机名文件,保存所有的设备,共16台;
3.        在运行之前只有这个此shell程序存在;
4.        运行后会产生一个add.exp;
5.        运行后会产生一个del.exp;
6.        在运行add.exp成功时,会临时产生一个以号码命名包含设备号的文件,如果执行删除成功后会删除此临时文件;



执行流程:
1.        执行流程如下 edge用户电话通知 
2.        监控人员执行上的TCL脚本
3.        执行solaris上的shell程序,传递增加/删除、号码参数
4.        调用del.exp或者add.exp
5.        执行完毕,反馈success/fail给监控人员,生成日志。
执行参数:./es.sh {add|del} 号码



#!/bin/sh
#变量声明
current_day=`date +%Y%m%d"-"%R`
TELNUM=/home/eric/wlj/Edge_APN/TELNUM  #这个是号白名单
EENUM=/home/eric/wlj/Edge_APN/EENUM  #登录的设备
LOG=/home/eric/wlj/Edge_APN/log #记录日志

#判断输入是否小于2个参数
if [ $# -lt 2 ]
then
echo -e " Please use  two parameter. \nUsage0 {del|add} telnumber"; exit 12
fi

#定义增加功能的函数
function add() {
if grep $2 $TELNUM  #判断输入的号码是否在白名单文件内,不在则退出程序
then
        echo "match"
        echo $2 >$2
        else
        echo "no match"
        exit 11
fi
#是合法号码则执行add.exp脚本,其中$2表示号码,$EENUM表示白名单文件
./add.exp $2 $EENUM

#根据add.exp运行返回值写入日志里,共18种情况,其中只有返回100时表示成功,其余是错误。
case "$?" in
100)        echo -e "$current_day\tadd\t$1\tADD_EXE_CUTED" >>$LOG
;;
101)        echo -e "$current_day\tadd\t$1\tABC" >>$LOG
;;
102)        echo -e "$current_day\tadd\t$1\tABC" >>$LOG
;;
103)        echo -e "$current_day\tadd\t$1\tABC" >>$LOG
;;
104)        echo -e "$current_day\tadd\t$1\tABC" >>$LOG
;;
105)        echo -e "$current_day\tadd\t$1\tABC " >>$LOG
;;
106)        echo -e "$current_day\tadd\t$1\tABC " >>$LOG
;;
107)        echo -e "$current_day\tadd\t$1\tABC " >>$LOG
;;
10        echo -e "$current_day\tadd\t$1\tABC" >>$LOG
;;
109)        echo -e "$current_day\tadd\t$1\tABC " >>$LOG
;;
110)        echo -e "$current_day\tadd\t$1\tABC" >>$LOG
;;
111)        echo -e "$current_day\tadd\t$1\tABC" >>$LOG
;;
112)        echo -e "$current_day\tadd\t$1\tABC" >>$LOG
;;
113)        echo -e "$current_day\tadd\t$1\tABC" >>$LOG
;;
114)        echo -e "$current_day\tadd\t$1\tABC" >>$LOG
;;
115)        echo -e "$current_day\tadd\t$1\tABC " >>$LOG
;;
116)        echo -e "$current_day\tadd\t$1\tEABC" >>$LOG
;;
117)        echo -e "$current_day\tadd\t$1\tABC" >>$LOG
;;
11        echo -e "$current_day\tadd\t$1\tABC" >>$LOG
;;
*)    echo
esac
}

#定义删除功能的函数
function del() {
test –s $2||exit 12
ADDEENUM=`cat $2`
./del.exp $2 $ADDEENUM
case "$?" in
200)  echo -e "$current_day\tdel\t$1\tADD_EXE_CUTED" >>$LOG
;;
201)  #执行成功才删除之前增加时产生的文件
                echo -e "$current_day\tdel\t$1\tADD_EXE_CUTED" >>$LOG
                test -s $2 && rm -rf $2
;;
202)  echo -e "$current_day\tdel\t$1\tABC " >>$LOG
;;
203)  echo -e "$current_day\tdel\t$1\tABC" >>$LOG
;;
204)  echo -e "$current_day\tdel\t$1\tABC " >>$LOG  
;;
205)  echo -e "$current_day\tdel\t$1\tABC " >>$LOG
;;
206) echo -e "$current_day\tdel\t$1\tABC" >>$LOG
;;
207) echo -e "$current_day\tdel\t$1\tABC " >>$LOG
;;
20 echo -e "$current_day\tdel\t$1\tABC" >>$LOG
;;
209) echo -e "$current_day\tdel\t$1\tABC" >>$LOG
;;
*)  echo
esac
}


#生成add.exp 的expect程序并赋值可执行权限
cat <<EOF >add.exp&&chmod a+x add.exp
#!/usr/local/bin/expect
if {\$argc<2} {
send_user "usage: \$argv0 number "
exit 11
}
log_user 0  #0为屏蔽输出,缺省值1为显示
set timeout 20

#设置变量为获得的参数1、2
set TELNUM [lindex \$argv 0]
set EENUM [lindex \$argv 1]

#设置文件对象
set fil [open \$EENUM r]
set n 0

#循环读取文件内容,并把内容作为新增指令的参数之一,直到新增成功或者错误中途退出
while {[gets \$fil line ]>=0} {
incr n
spawn program \$line
expect "<"
#发送新增指令
Send ”AAAAAA:APAPAP=86\$NUM,NID=202,OSID=311;\r"
sleep 3
expect {
                "*ADD_EXE_CUTED*" { send [exec echo \$line >\$TELNUM ];send_user "add..success..";exit 100 }
                "*ABC*" { send_user "add..fail..;exit 101 }
                "*ABC" { send_user "add..fail..";exit 102 }
                "*ABC*" { send_user "add..fail..";exit 103 }
                "*ABCR*" { send_user "add..fail..";exit 104 }
                "*ABC*" { send_user "add..fail..";exit 105 }
                "*ABC*" { send_user "add..fail..";exit 106 }
                "*ABC*" { send_user "add..fail..";exit 107 }
                "*ABC*" { send_user "add..fail..";exit 108 }
                "*ABC*" { send_user "add..fail..";exit 109 }
                "*ABC*" { send_user "add..fail..";exit 110 }
                "*ABC*" {send_user "add..fail..;exit 111 }
                "*ABC*" { send_user "add..fail..";exit 112 }
                "*ABC*" { send_user "add..fail..";exit 113 }
                "*ABC*" { send_user "add..fail..";exit 114 }
                "*ABC*" { send_user "add..fail..";exit 115 }
                "*ABC*" { send_user "add..fail..";exit 116 }
                "*ABC*" { send_user "add..fail..";exit 117 }
                "*ABC*"  { send_user "add..fail..";exit 118 }
        }
}
close $fil
EOF

#生成del.exp 的expect程序并赋值可执行权限
cat <<EOF >del.exp&&chmod a+x del.exp
#!/usr/local/bin/expect
log_user 0  #0为屏蔽输出,缺省值1为显示

set NUM [lindex \$argv 0]
set EENUM [lindex \$argv 1]
spawn program \$EENUM
#先查看
expect "<"
send "APPACP:TTT=\$TELNUM;\r"
sleep 3
expect -re {\s*152[^\n]*([0-9]+)\s*}
#取得PID值
set PID \$expect_out(1,string)
#执行删除指令
send "APPACE:MSISDN=86\$TELNUM,PID=\$PID\r;"

expect {
                        "*ADD_EXE_CUTED*" { send_user "del..success..";exit 200 }
                        "*ABC*" { send_user "del..fail..";exit 201 }
                        "*UABC*" { send_user "del..fail..";exit 202 }
                        "*ABC*" { send_user "del..fail..";exit 203 }
                        "*ABC*" { send_user "del..fail..";exit 204 }
                        "*ABC*" { send_user "del..fail..";exit 205 }
                        "*ABC*" { send_user "del..fail..";exit 206 }
                        "*ABC*" { send_user "del..fail..";exit 207 }
                        "*ABC*" { send_user "del..fail..";exit 208 }
                        "*ABC*" { send_user "del..fail..";exit 209 }
}
interact
EOF


case "$1" in
add) add
;;
del) del
;;
*)  echo -e "Usage0 {del|add} telnumber"; exit 13
esac

[ 本帖最后由 bobkey 于 2007-9-17 15:11 编辑 ]
waker 该用户已被删除
2 [报告]
发表于 2007-09-17 17:58 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
3 [报告]
发表于 2007-09-17 17:59 |只看该作者
赶快打假.瓦咔咔

论坛徽章:
0
4 [报告]
发表于 2007-09-17 18:38 |只看该作者
学习

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
5 [报告]
发表于 2007-09-17 20:53 |只看该作者
expect {
                        "*ADD_EXE_CUTED*" { send_user "del..success..";exit 200 }
                        "*ABC*" { send_user "del..fail..";exit 201 }
                        "*UABC*" { send_user "del..fail..";exit 202 }
                        "*ABC*" { send_user "del..fail..";exit 203 }
                        "*ABC*" { send_user "del..fail..";exit 204 }
                        "*ABC*" { send_user "del..fail..";exit 205 }
                        "*ABC*" { send_user "del..fail..";exit 206 }
                        "*ABC*" { send_user "del..fail..";exit 207 }
                        "*ABC*" { send_user "del..fail..";exit 208 }
                        "*ABC*" { send_user "del..fail..";exit 209 }
}

感觉这个有问题,expect到ABC后,后面的其它选项就直接无视了吧

论坛徽章:
0
6 [报告]
发表于 2007-09-18 09:13 |只看该作者
上面这段确实有问题:
1.expect 要匹配的项太多,所以程序运行肯定延迟很大;
2.用expect -re肯定比 *字符* 准确率高,速度肯定要快,但匹配的字符都不同,不知道怎么办。

如果匹配到了ABC之后,会退出程序,并返回一个值,因为是在sh shell中调用的,所以会得到这个返回值。


其实这个写得有点怪,不是纯shell,也不是纯expect,如果都用expect写,效果和流程可以更简化。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP