Linux 版 (精华区)

发信人: howdoit (第一个角球), 信区: Linux
标  题: Xenmenu:ASCII码菜单生成器
发信站: 哈工大紫丁香 (Thu May 20 08:52:46 1999), 转信

"Linux公报...让Linux更富魅力!"

   Xenmenu: ASCII 码菜单生成器

                    By Karyl F. Stein     翻译:李涛

  

    尽管图形界面和Web技术是越来越流行,但有时我们也必须照顾那

些只使用文字终端的用户.例如,很多ISP都提供Shell账号,以及许多公

用系统应用都是基于文字界面的.那些基于文字界面的应用系统大都建

立了供用户使用的自动化程序,但不可避免的是用户还得学习如何运行

它们.一些组织已经开发了一些菜单系统来帮助用户避开复杂的底层系

统.然而它们大都用Shell编写,通常很慢,没什么安全性,消耗过多的资

源,且难于维护. 

    在有了些作为一些公用系统管理员的经验之后.我就面临一个挑

战:既设计WWW界面;也要提供一个易于使用的文本界面.为了实现后者,

我使用了乏味的Shell和缺乏灵活性的C的混合编程.很快我觉得,得有

一种方法能使这件事变得简单,快速,且可灵活配置.最终,本文就提出

了这个解决方案,Xenmenu ( 读Zenmenu ). 

    在Xenmenu的设计初期,考虑了一些基本目标.首先,也是最重要的,

就是简单且易于使用和管理.同时,也必须给管理员提供足够的灵活性

来裁减系统满足他们特定的要求.这一需求可能包括安全性,所以

Xenmenu需要整合安全特性.最后,Xenmenu还必须小而快. 

    Xenmenu的四个主要部分:核心程序(Core program),配置文件

(Confiuration file),菜单描述文件(the menu description file),

支持文件(support file).核心程序首先要配置它自己,然后循环读入

菜单描述文件,格式化并显示给用户,读取用户输入.下面将详述每一步

骤. 

    有三个可存在的配置文件.前两个类似于系统端和用户配置文件

/etc/csh.login和~/.login.最后一个,可有可无,是安全配置文件;任

何先前两个配置文件定义的动作都可被最后一个安全配置文件所覆盖.

这可以给用户一个余地在系统安全条件下去设计他们自己的环境.当然

也可以完全禁止这一功能. 

    配置文件只有两条指令:环境变量设置;执行程序.显然配置文件很

简单,格式如下: 

      ENVIROMENT_VARIABLE VALUE 

      run PROGRAM [ ARGUMENT [ ARGUMENT ...] ] 

    第一行给出设置环境变量的范例.例如: PAGER /usr/bin/more.

这会设置变量PAGER等于/usr/bin/more.第二行则示例执行一个外部程

序.例如:run /bin/cat /etc/motd 

    一旦配置文件被如上执行,一个菜单文件就被读取且显示给用户.

从管理员的角度,这些菜单文件是Xenmenu 最重要的部分了,因为它们

定义了菜单的外观和与用户的交互.因此管理员的大部分时间都化在编

写菜单文件上,它们被设计成易于创建.同时,灵活性也是被着重考虑

的. 

    菜单文件是纯文本文件,可修改和重装.每一行都是一个命令,注

示,或空行.命令可有由空格所分隔的参数.注示行则在行首插入"#".空

行则被忽略. 

    菜单文件有三个主要部分:全局设置(global option),格式化和显

示设置(formatting and display options),选择项声明(choice

declaratioons).全局设置必须位于任何选择项声明之前,它影响菜单

的整体外观.目前只有两种全局设置选项:checkcase和nocheckcase.如

果定义checkcase,则选择项声明将会大小写敏感.举例来说,用户键入

"Q"和"q"是不一样的. 

    在菜单文件中我们可以使用很多命令来指定格式和显示方式.这些

选项定义了怎样将菜单显示在屏幕上,它们可以在文件中任一处使用.

以下给出这些命令和参数的详细说明.在<>中的参数是必须的,而[]中

的参数则是可选的.一些引用声明在config.h,这个文件是Xenmenu的一

部分,编译前你可以修改. 

      center <string>: 使字串居中显示.可能会在需要时字串显示发

      生卷绕. 

      column [number]: 设置列数,缺省为1.类似HTML中的<table>. 

      header [header]: 设置菜单标头.缺省将使用定义在config.h中

      的MENUHEAD. 

      name [name]: 设置菜单名.缺省为空. 

      notype: 禁止选项名后的选项类型的打印,(例如menu, file, or

      exit). 

      opttail [string]: 定义在一个选项值后面打印的字串.它分隔

      选项值和选项名字. 

      print [-n] [string]: 显示字串[string].如果没定义

      [string],则输出空行.如果[string]中含有在''之间的字串,那

      部分作为命令运行.为输出',以''代替.输出环境变量,可在变量

      名前加$.为输出$,以$$代替.如果有-n选项,则字串后不加新行.

      通常串前的空格和TAB会被消去.如果想打印前面的空格则可以在

      字串头部加".任何"string"串都会照原样输出.如果串尾有一个

      ',则串头的"不会输出.如果你需要在串头输出-n,可加上".最后,

      可能会在需要时字串显示发生卷绕. 

      printfile <file>: 输出文件<file>.如果SECURE大于4,文件路

      径将取自SECUREDIR,否则<file>应包含路径. 

      printheader: 打印菜单标题.[header]显示在屏幕左边,[name]

      在右边.如果标题没有定义,则采用config.h中定义的缺省值.如

      果没有定义name,则不显示. 

      printline [string]: 显示一行串.如string没定义,则输出一行

      虚线. 

      promtp [string]: 设置菜单提示为string.如果没定义,则采用

      config.h中的DEFAULTPROMPT.注意,prompt后的每一个字符,包括

      空格都作为提示字串. 

      run <file>: 运行file.如果SECURE为1,3,5,7.则文件路径采用

      SECURERUN,否则<file>应指定路径. 

      type : 在选项名字后输出选项类型,(如 菜单,文件等).这是缺

      省设置. 

    选择项声明定义菜单如何相应用户输入.一个选项可以是运行一个

外部程序,显示一个文件,加载和显示另一个菜单,或退出菜单系统.每

一个选项包括值,名字,注释,或者是三者组合.选项如下定义: 

option{ 

    <definitions> 



<definition>部分含有一条或更多的命令,如下所示.在<>中的参数是

必须的,而[]中的参数则是可选的.一些引用声明在config.h中. 

      exit: 退出菜单 

      file <file>: 读入文件<file>,如果SECURE大于4,文件路径将取

      自SECUREDIR,否则<file>应包含路径. 

      menu <file>: 加载菜单<menu>,如果SECURE为2,3,6,7.则文件路

      径采用MENUHOME,否则<file>应指定路径. 

      run <file>: 运行程序<file>,如果SECURE为1,3,5,7.则文件路

      径采用SECURERUN,否则<file>应指定路径. 

      comment <comment>: 菜单项目描述. 

      name <name>: 选项名. 

      noprint: 禁止选项输出. 

      value <value>: 菜单值.注意:如没有此项,菜单值会自动赋予. 

    如上所述,Xenmenu可用于安全界面.编译时,管理员可选择不同的

安全选项.0为缺省值,它们都在编译时指定.这些选项是: 

   1.仅可在指定目录运行程序. 

   2.仅可在指定目录显示文件. 

   3.仅可在指定目录显示菜单. 

   4.禁止编译用户配置文件. 

    记住,Xenmenu无法保证它所运行的一个外部程序的安全性.如果你

允许用户运行一个含有安全漏洞但你并不知道的外部程序,无疑会侵害

你系统的安全.你可以通过Xenmenu作为用户界面,并按照以上设置安全

权限,管理员可以限制用户. 

    最后Xenmenu还有一些其他特性.第一,如果用户输入的不是菜单中

的选项,它们会被传入到Shell来解释.这允许用户不经过菜单执行命

令.但这不允许破坏安全性.第二,用户可设置菜单大小,下一个菜单将

会采用新尺寸显示. 

    我希望本文让你了解Xenmenu.同时也希望它能带给你一个文本菜

单的解决方案.她仍在不断完善中,但已应用于不止一个系统.源代码遵

从于GPL.存放于http://www.xenos.net/~xenos/software/xenmenu.作

者欢迎任何建议.xenon@xenos.net">我希望本文让你了解Xenmenu.同

时也希望它能带给你一个文本菜单的解决方案.她仍在不断完善中,但

已应用于不止一个系统.源代码遵从于GPL.存放于 

http://www.xenos.net/~xenos/software/xenmenu.作者欢迎任何建

议: xenon@xenos.net 

  

                       版权所有 (C) 1999 NJLUG

           出版于第39期《Linux公报》1999年4月 中文版第六期

                            


--
☆ 来源:.哈工大紫丁香 bbs.hit.edu.cn.[FROM: bin@mtlab.hit.edu.cn]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.288毫秒