本发明涉及通讯技术领域,尤其涉及一种命令重发的方法及装置。
背景技术:
终端模拟器:是一种支持ssh(ssh1和ssh2)、telnet、serial、rlogin等多种协议的终端仿真程序,同时也支持vbscript、jscript和python等脚本语言,是连接管理网络设备的理想工具。
为了使路由器等网络设备在现网上能够稳定的运行,在路由器交付给客户前,都必须经过详细、复杂的测试。在测试的过程中,经常需要做大量的配置。如果完全手工去配置路由器,不仅耗时耗力,还会增加出错的概率。所以,一般来说都会采取一定的措施来实现大量的配置,目前主要有下面2种方法:1、通过第三方应用程序,生成txt文本格式的配置文件,然后通过终端模拟器登录设备,再复制txt文件的内容,粘贴到终端模拟器上;2、通过脚本语言来实现,主要是利用终端模拟器中脚本引擎提供的发送命令的api函数:x.screen.send。
实际应用中,路由器等网络设备中的部分命令,执行起来需要一定的时间,连续大量的执行这样的命令,会导致路由器等网络设备无法处理,从而出现系统忙的错误提示。一旦出现系统忙的错误时,最终的配置都会出错,达不到预期的要求。
为了避免出现系统忙的问题,现有技术分别对上述两种方法进行了改进:对于第一种方法,可以设置终端模拟器的参数、修改行发送延迟和字符发送延迟,但是,这种方法需要修改全局生效的参数,改的值太小达不到目的,改的值太大了,又会影响其它可以快速执行命令的执行效率,此外,对于容易冲突的命令,每次需要的时间间隔也是不一定的,所以这种规避的方式,不够灵活、高效。对于第二中方法,可以在每个发送命令的函数后面加一个时间延迟的函数语句,但是,这种方式,会增加脚本代码量,并且合适的延迟时间也很难把握,当设备处于不同的状况时,这个时间间隔也不一样。所以,这个方法同样不够灵活,高效。
因此,有必要提供一种路由器配置命令重发的方法及装置,以灵活、高效的确保路由器成功执行各配置领命。
技术实现要素:
有鉴于此,本发明的目的在于提供一种路由器配置命令重发的方法及装置,以灵活、高效的确保路由器成功执行各配置领命。
本发明解决上述技术问题所采用的技术方案如下:
根据本发明的第一个方面,提供一种命令重发的方法,适用于终端模拟器,所述方法包括:
向执行设备发送命令;
若接收到所述执行设备返回的执行失败消息,延时预定时间后再次向所述执行设备发送所述命令;
判断是否接收到所述执行设备返回的执行失败消息;
若接收到所述执行失败消息,重复所述延时预定时间后再次向所述执行设备发送所述命令的步骤。
可选的,所述重复所述延时预定时间后再次向所述执行设备发送所述命令的步骤之前,所述方法还包括:
判断当前重复发送所述命令的次数是否超过预设值;
若未超过所述预设值,执行所述重复所述根据所述延时发送指令延时向所述执行设备发送所述命令的步骤;
否则,输出错误提示,并停止执行所述重复所述根据所述延时发送指令延时向所述执行设备发送所述命令的步骤。
可选的,所述若接收到所述执行设备返回的执行失败消息,延时预定时间后,再次向所述执行设备发送所述命令,包括:
接收所述执行设备返回的执行结果;
判断所述执行结果是否包含所述执行失败消息;
若是,判断所述执行失败消息是否包含“系统忙”的错误关键字;
若是,执行所述延时预定时间后,再次向所述执行设备发送所述命令的步骤。
可选的,所述方法利用python脚本的api函数实现。
可选的,所述向执行设备发送命令之前,所述方法还包括:
定义基础函数库;
封装sent函数并将其放入所述基础函数库中,在所述sent函数中通过调用tab.screen.send函数实现所述向执行设备发送命令的步骤,通过调用tab.screen.waitforstrings函数实现收集所述命令返回的执行结果,并在所述返回结果包括“系统忙”的关键字时,生成一个延时,定义在所述延时之后,再次调用tab.screen.send函数实现向所述执行设备再次发送所述命令的步骤。
加载并初始化所述基础函数库。
根据本发明的第二个方面,提供一种命令重发的装置,适用于终端模拟器,所述装置包括:
发送模块,用于向执行设备发送命令,以及用于在接收到所述执行设备返回的执行失败消息时,延时预定时间后再次向所述执行设备发送所述命令;
第一判断模块,用于判断是否接收到所述执行设备返回的执行失败消息;
所述发送模块,还用于在接收到所述执行失败消息时,重复所述延时预定时间后再次向所述执行设备发送所述命令的步骤。
可选的,所述所装置还包括:
第二判断模块,用于在重复所述延时预定时间后再次向所述执行设备发送所述命令的步骤之前,判断当前重复发送所述命令的次数是否超过预设值;
所述发送模块,还用于在所述次数未超过所述预设值时,执行所述重复所述根据所述延时发送指令延时向所述执行设备发送所述命令的步骤,或用于在所述次数超过所述预设值时,停止执行所述重复所述根据所述延时发送指令延时向所述执行设备发送所述命令的步骤。
输出模块,用于在所述次数超过所述预设值时,输出错误提示。
可选的,所述第一判断模块,还用于判断所述执行失败消息是否包含“系统忙”的错误关键字;
所述发送模块,还用于在所述执行失败消息包含所述错误关键字时,执行所述延时预定时间后再次向所述执行设备发送所述命令的步骤。
可选的,所述装置利用python脚本的api函数实现各模块的功能。
可选的,所述装置还包括:
定义模块,用于在向执行设备发送命令之前,定义基础函数库;
封装模块,用于在所述基础函数库中封装sent函数,所述sent函数中通过调用tab.screen.send函数实现所述向执行设备发送命令的步骤,通过调用tab.screen.waitforstrings函数实现收集所述命令返回的执行结果,并在所述返回结果包括“系统忙”的关键字时,生成一个延时,定义在所述延时之后,再次调用tab.screen.send函数实现向所述执行设备再次发送所述命令的步骤。
加载模块,用于加载并初始化所述基础函数库。
本发明实施例的命令重发的方法和装置,采用重传机制,对每个命令的执行结果做一个判断,如果执行失败了,就设置一个延迟,等延迟时间一到,再次发送执行失败的命令,然后再判断结果,直到执行成功为止。为了防止死循环,可以加上一个重试的次数的限制,当达到这个限制时,就退出循环,给出一个错误提示。这样,当批量发送配置命令时,可以收集每个命令的执行结果,然后只对出现了错误的命令进行延时重发,其它没有出现错误的命令则不受影响,能够高效、灵活的确保批量发送命令时,每条命令的成功执行。
附图说明
图1为本发明实施例一提供的一种命令重发的方法的流程图;
图2为本发明实施例二提供一种另一种命令重发的方法的流程图;
图3为本发明实施例二中终端模拟器按照该send函数的逻辑向路由器发送配置命令的方法流程图;
图4为本发明实施例三提供的一种命令重发的装置的模块结构示意图。
本发明目的的实现、功能特点及优点将结合实施例,参照附图做进一步说明。
具体实施方式
为了使本发明所要解决的技术问题、技术方案及有益效果更加清楚、明白,以下结合附图和实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
在后续的描述中,使用用于表示元件的诸如“模块”、“部件”或“单元”的后缀仅为了有利于本发明的说明,其本身并没有特定的意义。因此,″模块″与″部件″可以混合地使用。
本发明实施例一提供了一种命令重发的方法,本实施例主要基于终端模拟器的脚本引擎来实现,适用于终端模拟器,请参阅图1,方法流程包括:
s101、向执行设备发送命令;
s102、若接收到该执行设备返回的执行失败消息,延时预定时间后再次向该执行设备发送该命令;
s103、判断是否接收到该执行设备返回的执行失败消息;
s104、若接收到该执行失败消息,重复该延时预定时间后再次向该执行设备发送该命令的步骤。
实际应用中,执行设备可以是路由器等网络设备,发送的命令可以是配置命令。
在一个可行的方案中,重复该延时预定时间后再次向该执行设备发送该命令的步骤之前,该方法还包括:
判断当前重复发送该命令的次数是否超过预设值;
若未超过该预设值,执行该重复该根据该延时发送指令延时向该执行设备发送该命令的步骤;
否则,输出错误提示,并停止执行该重复该根据该延时发送指令延时向该执行设备发送该命令的步骤。
在一个可行的方案中,步骤s102包括如下步骤:
接收该执行设备返回的执行结果;
判断该执行结果是否包含该执行失败消息;
若是,判断该执行失败消息是否包含“系统忙”的错误关键字;
若是,执行该延时预定时间后,再次向该执行设备发送该命令的步骤。
本实施例的向执行设备发送配置命令的方法,采用重传机制,对每个命令的执行结果做一个判断,如果执行失败了,就设置一个延迟,等延迟时间一到,再次发送执行失败的命令,然后再判断结果,直到执行成功为止。为了防止死循环,可以加上一个重试的次数的限制,当达到这个限制时,就退出循环,给出一个错误提示。这样,当批量发送配置命令时,可以收集每个命令的执行结果,然后只对出现了错误的命令进行延时重发,其它没有出现错误的命令则不受影响,能够高效、灵活的确保批量发送命令时,每条命令的成功执行。
在上述实施例的基础上,本发明实施例二提供了另一种命令重发的方法,本实施例以python脚本为例,详细说明通过终端模拟器向路由器发送配置命令的方法,请参阅图2,该方法包括:
s201、定义基础函数库。
实际应用中,为了能够对发送命令的执行结果做判断,需要预先封装一个发送命令的函数,本实施例中,所有的函数实现都是基于终端模拟器的脚本引擎的里的api函数来实现的。基于该函数,封装出需要的send函数,然后把封装好的函数都放在同一个*.py文件中,作为基础库函数,其它脚本在运行前,都要加载这个基础库函数。
在这个基础函数库中,首先要定义一个初始化函数,因为在终端模拟器中为python定义了一个全局的变量x,如果想要在基础函数库中的函数调用api函数,就必须把x作为全局变量传递到基础函数库中。其它脚本加载基础函数库后,要先调用这个初始化函数,来初始化基础函数库。
实际应用中,可以采用如下方法定义初始化函数:
definit(var):
globalx
x=var
globaltab
tab=x.getscripttab()
tab.screen.synchronous=true
s202、封装发送命令的函数send,并将其放入步骤s201中定义的基础函数库中。
实际应用中,可以调用终端模拟器提供的tab.screen.send函数发送命令,调用tab.screen.waitforstrings函数收集命令路由器返回的执行结果,如果某个执行结果中包含了系统忙的关键字,就针对该执行结果对应的执行命令设置一个延迟,在延迟时间到达后再次调用tab.screen.send函数发送命令,同时设置一个循环的次数的最大阈值防止进入死循环。
实际应用中,可以通过如下方法实现send函数:
defsend(szcommand,time=0):
tab=crt.getscripttab()//获取当前脚本执行的tab对象
tab.screen.synchronous=true//将执行过程同步显示
if(szcommand==″orszcommand==′\r′or′?′inszcommand):
tab.screen.send(szcommand)//在当前tab对象中发送命令
else:
tab.screen.send(szcommand+′\r′)//在当前tab对象中在发送的命令后加上回车符,并发送数据
szresult=tab.screen.waitforstrings([′#′,′--more--′,′%error′])//发送命令后等待并显示执行结果
if(szresult==1):
pass
elif(szresult==2):
whitespace=true
whilewhitespace:
tab.screen.send(″)
szresult=tab.screen.waitforstrings([′#′,′--more--′])
if(szresult==1):
whitespace=false
elif(szresult==3):
szresult=tab.screen.waitforstrings([′again′,′invalid′],2)
if(szresult==1):
foriinrange(1,6):
tab.sereen.waitforstring(′#′)
crt.sleep(i*1000)//暂停1秒后发送命令
tab.sereeh.send(szcommand+′\r′)
szresult=tab.sereen.waitforstrings([′again′,′#′])
if(szresult==2):
break
else:
raiseioerror
if(time!=0):
crt.sleep(time)
当上述send函数被调用后,终端模拟器将会按照该send函数的逻辑向路由器发送配置命令,请参阅图3,向路由器发送配置命令的过程包括如下步骤:
s301、获取终端模拟器上会话的对象,设置窗口同步模式。
这里设置窗口同步模式的目的是为了方便手机路由器返回的配置命令的执行结果。
s302、判断待发送的命令是否为特殊字符,若是执行步骤s303,否则执行步骤s304;
s303、对该命令进行特殊处理;
s304、发送该命令;
实际应用中,根据上述函数的定义,需要在发送该命令时加个回车符。
s305、收集命令执行结果。
s306、判断该执行结果的字符串是否包含“系统忙”的提示字符,若是,执行步骤s307,否则执行步骤s308。
s307、延迟预定时间后向该路由器再次发送该命令。
s3071、收集命令执行结果,判断该执行结果的字符是否包含“系统忙”的提示字符,若是执行步骤s3072,否则执行步骤s308。
s3072、判断该命令当前重发次数是否超过预设的次数,若是,执行步骤s308,否则执行步骤s307。
本实施例中预设的最高重发次数可以是6次。
s308、结束。
采用该send函数,可以对每个发送的命令的执行结果做一个判断,如果执行成功,就继续执行下一条命令,如果执行失败了,就收集执行失败的返回的字符串,再根据具体的返回信息,做下一步的判断。如果返回的消息中,包含了系统忙的错误关键字,就说明是执行的太快了,需要稍后再执行,这个时候,才加一个固定的时间的延迟,等延迟时间定时器一到,再次发送上次失败的命令,然后再次判断结果,直到执行成功为止,同时,为了防止死循环,加上一个重试次数的限制,当达到这个限制时,就退出循环,给出一个错误提示。
s203、编写脚本,在该脚本的开头加载并初始化该基础函数库。
实际应用中,当需要发送命令到路由器等设备时,直接调用send函数就可以实现本发明了。
该步骤可以采用如下模板实现:
#-*-coding:utf-8-*_
importsys,os
current_dir=os.getcwd()
ifcurrent_dirnotinsys.path:
sys.path.append(current_dir)
importzte//zte是基础库的名字
reload(zte)
zte.init(crt)//初始化基础库
######################################
zte.send(′showinterface′)。
采用本发明实施例,可以实现在批量发送配置命令时,只对出现了错误的命令进行延时重发,其它没有出现错误的命令则不受影响,能够高效、灵活的确保批量发送命令时,每条命令的成功执行。
在上述实施例的基础上,本发明实施例三提供了一种向执行设备发送配
置命令的装置,适用于终端模拟器,请参阅图4,该装置包括:
发送模块401,用于向执行设备发送命令,以及用于在接收到该执行设备返回的执行失败消息时,延时预定时间后再次向该执行设备发送该命令;
第一判断模块402,用于判断是否接收到该执行设备返回的执行失败消息;
该发送模块401,还用于在接收到该执行失败消息时,重复该延时预定时间后再次向该执行设备发送该命令的步骤。
实际应用中,执行设备可以是路由器等网络设备,发送的命令可以是配置命令。
在一个可行的方案中,该所装置还包括:
第二判断模块,用于在重复该延时预定时间后再次向该执行设备发送该命令的步骤之前,判断当前重复发送该命令的次数是否超过预设值;
该发送模块401,还用于在该次数未超过该预设值时,执行该重复该根据该延时发送指令延时向该执行设备发送该命令的步骤,或用于在该次数超过该预设值时,停止执行该重复该根据该延时发送指令延时向该执行设备发送该命令的步骤。
输出模块,用于在该次数超过该预设值时,输出错误提示。
在一个可行的方案中,该第一判断模块402,还用于判断该执行失败消息是否包含“系统忙”的错误关键字;
该发送模块401,还用于在该执行失败消息包含该错误关键字时,执行该延时预定时间后再次向该执行设备发送该命令的步骤。
在一个可行的方案中,该装置利用python脚本的api函数实现各模块的功能。
在一个可行的方案中,该装置还包括:
定义模块,用于在向执行设备发送命令之前,定义基础函数库;
封装模块,用于在该基础函数库中封装sent函数,该sent函数中通过调用tab.screen.send函数实现该向执行设备发送命令的步骤,通过调用tab.screen.waitforstrings函数实现收集该命令返回的执行结果,并在该返回结果包括“系统忙”的关键字时,生成一个延时,定义在该延时之后,再次调用tab.screen.send函数实现向该执行设备再次发送该命令的步骤。
加载模块,用于加载并初始化该基础函数库。
具体的,对send函数的定义,以及对基础函数库的定义、初始化及加载可以采用实施例二中的方法,此处不在赘述。
本实施例的向执行设备发送配置命令的装置,可以实现在批量发送配置命令时,只对出现了错误的命令进行延时重发,其它没有出现错误的命令则不受影响,能够高效、灵活的确保批量发送命令时,每条命令的成功执行。
以上参照附图说明了本发明的优选实施例,并非因此局限本发明的权利范围。本领域技术人员不脱离本发明的范围和实质内所作的任何修改、等同替换和改进,均应在本发明的权利范围之内。