首页 > 范文大全 > 正文

网络设备中命令行管理系统的设计与实现

开篇:润墨网以专业的文秘视角,为您筛选了一篇网络设备中命令行管理系统的设计与实现范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

摘要:命令行接口是高端网络设备中一个十分重要的功能模块,通过它,后台可发送命令来对前台的资源进行查询、配置其工作模式、进行系统控制等。本文旨在提供一种设计高效、稳定的命令行系统的方法,描述了命令行接口的工作原理、总体设计、关键模块的流程图及重要数据结构,并介绍了命令行的语法设计、解析原理并配有实例说明。

关键词:命令行;命令树;命令节点;参数关键词

中图法分类号:TP393.07文献标识码: A

1 引言

命令行接口(Command Line Interface)简称:CLI,是用户与操作系统或应用程序之间的一种基于文本的命令接口。它通过输入命令来实现对系统的管理和维护,并接收系统的响应。CLI是商业化电信网络设备中必备的管理控制方法,与SNMP、基于Web等管理方式所不同的是,CLI通过一个普通的串口应用程序或Telnet外壳(shell)程序使用键盘输入命令来实现对设备的监控[1]。

虽然对网络设备的配置和管理也可以通过其他多种方式实现,可以使用纯字符形式的命令行和菜单,也可以使用图形界面的web浏览器或专门的网管软件。但无论何种网络设备,其基于Telnet(SSH)协议的CLI命令行方式提供了比其支持的任何网管功能更为完备的管理能力。尤其是,当网络出现问题,通过其他管理方式都无法访问到被管理设备时,我们依然可以通过完全带外的CONSOLE口使用CLI命令对被管理设备进行信息采集和排障,而这点是所有其他管理方式所不具备的。相比较而言,CLI命令行方式的功能更强大,但掌握起来难度也更大些。

2 CLI综述

2.1 CLI工作原理

CLI是现代通信设备中一个十分重要的功能模块,它与OMS(操作维护系统)配合工作,通过后台向前台发送人机命令来对前台的资源进行操作,如资源使用查询,单板的倒换、复位和状态查看,环境设置等。命令行是驻留在通信设备中的程序,后台主机通过一定的通信方式与命令行进行交互,并根据命令行定义的规则,响应后台的命令,并返回执行结果[2]。如图1所示:

串口方式用于本地管理,管理员必须使用超级终端在被管设备所在地对它进行管理。

Telnet方式用于Internet的远程登录,它可以使管理员坐在入网的计算机前,通过网络进入远距离的被管设备,成为此被管设备的终端。当用Telnet登录到设备时,实际上启动了两个程序,一个叫“客户”程序,它在管理员的本地机上运行,另一个叫“服务器”程序,它在要登录的远程设备上运行。

当管理员运行超级终端或Telnet并按下一个键时,超级终端将向串口发送一个表示该键的字符串,Telnet则通过TCP/IP连接发送一个表示该键的字符串。只要能得到该字符串,就可以得知用户按下了什么键。把该字符串解码成键盘上的键位,然后传递给控制台的上层软件。上层软件可以完全屏蔽串口和Telnet的操作,只要对该键进行分析和处理,完全不用管是从串口还是从Telnet上来的[3]。

2.2 命令行的基本操作流程

(1) 用户通过Console或Telnet输入信息,可以是配置、管理等常规命令,也可以是故障查询等非常规命令。

(2) 管理程序通过命令Shell将用户输入信息组合成一个单独的命令,并发送给解析引擎(parser)。此外,Shell还应具有编辑和记录命令等基本功能。

(3) 解析引擎(parser)对命令按特定语法规则进行分析和检查。如果命令格式正确,就定位(locate)命令集中相应的回调函数(callback function)。该函数应将命令参数等信息封装为消息(message),并通过消息队列(queue)发送给相关的任务(task)以执行该命令(参见图1)。反之,如果命令格式错误,则向Console或Telnet输出解析错误信息。

(4) 通过Shell将回调函数的执行结果发回到用户指定的Console或Telnet。

3 命令二叉树的设计

命令集合可以用一个树形结构直观表示,称之为命令树。实际上,在同一个模式下,该树形结构是棵二叉树结构。树上的每一个节点,称之为命令节点。而每个命令节点与一个命令关键字对应。一个完整的命令可以由沿着树干从根节点一直到叶子节点的命令关键字构成,叶节点里存有指向该命令处理函数的指针。因为命令行由命令关键字和参数组成,所以在设计命令节点的时候应同时考虑命令关键字和参数的构成情况。

下面给出了节点数据结构:

typedef struct cmdNode

{

char *pKeyword;/*命令关键字*/

char *pKwab; /*命令名缩写*/

char *pHelp; /*该命令帮助*/

byte flag; /*判断该节点是否带参数*/

Access accesslv; /*命令级别*/

struct cmdNode*parent; /*指向该节点的双亲节点*/

struct cmdNode*lChildren;/*该命令节点的下级子命令节点*/

struct cmdNode*rChildren;/*与该命令节点同级的命令节点描述*/

paramInfo*pParams;/*描述该命令参数的数据结构*/

}cmdNode;

参数是命令执行的附加信息,具有四个属性:

(1) 参数的类型,分为可选和必选型。对于必选型,要求必须给出参数,如:配置端口地址的命令ip address后面必须跟ip地址,否则程序会报错。而查看vlan设置的命令show vlan后面可以跟vlan号,也可以不加。

(2) 参数的数据类型,包括整型、字符串型、枚举型等。

(3) 参数的默认值,通过一个flag判断该参数是否有默认值,若有,在没输入参数时,命令解析引擎将自动给它设置成该默认值。

(4) 参数的取值范围,设置参数的取值范围,可将参数越界这样的低级错误消除在解析阶段。

这样参数的数据结构为:

typedef struct paramStruct

{byte Ptype;/*参数的类型,分为可选和必选型*/

intpnum; /*参数个数*/

SbyteDtype;/*参数的数据类型,包括整型、字符串型、枚举型等*/

Sbyte1 Default;/*参数的默认值*/

Sbyte2 Prange; /*参数的取值范围*/

}paramInfo;

命令树有一个根节点,是所有命令的入口。根节点下面就是所有命令的集合,根节点以下是模式节点,在相应模式节点以下是一棵二叉树,该二叉树每一个节点代表命令中的一个关键字。相同等级的相同关键字合并成为一个节点,以节省存储空间。每一个叶子节点意味着一个完整命令的结尾,所以都存储着一个命令回调函数[4]。

如图2所示最上面的节点是根节点,其下有多个模式节点,模式1下面就是命令二叉树。两个命令show cpu、 show interface brief中,关键字“show”的左子节点的关键字是“cpu”,表示“cpu”可以根在“show”的后面,由于某个节点的所有右子节点均与其同级,所以,“cpu”的右子节点“interface”都是同级别的,即均可以跟在“show”关键字的后面组成命令。而在端口配置模式下,命令节点“address”中的flag=1,可知该节点后要接参数,并调用参数的数据结构。实际上,命令“ip address”后要加ip地址及掩码,用以配置端口地址。三个叶节点中保存着三条命令对应的回调函数指针。

4 命令行的解析

命令解析引擎使用一种向量数组的数据结构用以存储待匹配的字符串。其数据结构如下:

typedef struct vector

{slong locMax;/*已经分配的最大单元号*/

slong usedMax; /*已经用到的最大单元号,必须在0到locmax之间*/

void**vec; /*地址数组,数组长度为locMax+1*/

} VECTOR_U;

typedefVECTOR_U*PVECT;

4.1 命令行语法分析

用户在命令行界面下输入的命令行字符串,以空格为分隔符分为一个个小块,我们把每一小块称为一个命令元素即token。为了对命令元素进行区分,我们使用$加数字来标识每个命令元素。由于命令是由命令关键字和参数组成,所以相应的命令元素也分为命令关键字和参数。

如:命令ping -t -n 100 192.168.0.6,其中ping是命令关键字,必须严格输入p、i、n、g四个字母,-t和-n也作为命令关键字,但是可选项,-t表示ping指定的计算机直到中断,100作为-n的参数指发送100个ECHO数据包,默认值为4。192.168.0.6为必选参数目的端的ip地址。使用标识符表示:$1 [$2|$3] $4。

我们可以用不同的方法来区分命令关键字,参数关键字,哪些是可选项,哪些是必选项,以及相互之间的关系,使用户明白一个命令各个组成部分及其属性,这就是命令行的语法。通常我们使用如下规定:

(1) 黑体字表示关键字,可以是命令关键字、参数关键字或有特定含义的参数值。

(2) 斜体字表示参数变量。

(3) “[]”表示括号中的元素是可选的。

(4) “{}”表示括号中的元素是必选的。

(5) “[]”和“{}”可以嵌套使用。

(6) “|”表示并列关系,与“{}”或“[]”配合使用。

例如:华为交换机中添加/修改地址表项的命令:

mac-address {static|dynamic} mac_address interface{interface_name|interface_type interface_num} vlan vlan_id

undo mac-address {static|dynamic}[[mac_address]interface[interface_name| interface_type interface_num] vlan vlan_id]

在上一个命令中黑体字mac-address、static、dynamic、interface、vlan为关键字,static和dynamic为必选项且为并列关系,斜体字部分为参数变量。且看下面具体实现:

[Switch] mac-address static 0010-6c78-

2314 interface Ethernet 0/2 vlan 1

#设置vlan 1 中静态MAC地址0010-6c78-2314所在的以太口为E0/1。

[Switch] undo mac-address static 0010-6c78-2314 interface Ethernet 0/2 vlan 1

#删除静态MAC地址。

用户在输入命令的过程中可以使用“?”来寻求帮助。系统的帮助信息可分为两种:一是在命令的输入过程中,在空格后输入“?”,此时系统会调出前一个命令元素的帮助信息。如:用户输入“ping?”,此时用户想知道ping后接什么元素。系统会输出:

KEYWORD ping until CTRL+C [optional]

IPADDRESS ip address

而在输入命令元素的过程中用户使用“?”时,如“p?”,系统会列出所有以p开头的命令元素。

用户输入完成后(通常以enter结束),系统会将用户输入与相应的命令语法匹配,若匹配不成功,则会报错,返回提示符界面等待用户重新输入,如匹配无误则进入下面的解析模块。

4.2 命令解析步骤

(1) 接收用户输入,并判断键值,如果用户输入的是DELETE键则删除缓冲区中当前光标的字符,如用户输入UP/DOWN键,则查阅历史命令。

(2) 将用户输入的字符串分片,以空格为分割符,分成一个个token,并将地址保存至向量数组*PVECT中,遇到回车则表示用户完成输入。

(3) 根节点开始,找到相应的命令模式,逐个节点进行匹配。因为每个节点的右节点均是与其同级的节点,所以,查找一个当前节点的所有右节点,如不匹配则再查找其右节点,一直深入到没有右节点为止。若没有匹配成功,则直接报错,并返回。若有一个节点匹配成功,则往该节点左树深入一级,也就是进入下一个keyword或者argument的匹配,一直到所有的“词”解析完毕。

(4) 调用相应叶节点中的处理函数指针,使其工作完成命令。

在此解析过程中,如果用户某个命令关键字没有输全并以Tab键结束,可以自动实现命令补全,并将补全后的命令送到用户输入命令行,供用户输入下一个关键字。该命令解析模块同样可以为Web服务器接口工作,搜索用户通过Web浏览器输入的命令。

5 结束语

一个功能强大的命令行接口是任何高端路由器所必须具有的模块,通过它,后台可方便地对前台进行操作。本文介绍的命令行的设计及解析方法,为网络与电信行业的嵌入式系统提供了一种方便的、可维护性强、可扩展性好的命令配置管理方式。本系统提出的关键字缩写、灵活的访问级别控制等功能可以进一步改进现有设备中CLI的性能。实践证明,该系统具有稳定、高效、智能、可移植性强、可维护性好等诸多优点。

――――――――――

参考文献

[1]崔滔,陈自力.命令行接口管理系统的研究与实现.计算机应用,2002,22(10):82-84.

[2]解震春,邱智亮.命令行接口管理系统的设计实现.网络技术与应用,2002,32(11):44-56.

[3]徐立锋,芦东昕,缪敬.一种高端数据产品命令行接口的设计//中兴通讯公司成都研究所.计算机工程,2003,29(22):64-67.

[4]祝鹏,杨宗凯.嵌入式命令行管理系统的设计与实现.计算机应用,2003,23(12):244-245.

作者简介:

赵辉(1976-),男,山东省枣庄市,硕士研究生,主要研究领域为网络管理与安全。

张志刚(1963-),男,北京市,副教授,主要研究领域为应用数学、概率统计、计算机应用、智能算法等。