CLISH技术文档

CLISH能够实现的功能

搭建基于NIX系统的、类思科交互模式的命令行程序,具有自动补全、输入提示等功能,通过自定义命令名与执行方式,使使用者能够准确且易懂地执行复杂命令。 clish是一个类思科命令行补全与执行程序,它可以帮助程序员在nix操作系统上实现功能导引、命令补全、命令执行的程序。

  • 方便用户利用helptab tab等按键实时获得帮助
  • 控制用户输入格式,如ip地址0-9的正整数
  • 支持view视角功能,如进入某个ip配置端口进行配置,显示port1>
  • 根据用户命令执行命令或者脚本程序
  • 论文:http://www.doc88.com/p-9186756837728.html # 基于CLISH的网络设计命令行界面项目的设计与实现

CLISH安装运行过程

  1. 官方网站:http://clish.sourceforge.net/ ,直接下载.gz.tar压缩包
  2. 下载压缩包 Download the source tarball from [http://clish.sourceforge.net/#downloads]
  3. 将压缩包放到nix系统中,解压缩到需要的文件夹 unzip and untar the source codes into your desired place. 移动文件:使用SSH自带文件管理工具,或者VM提供的共享文件夹功能 解压缩tar xzvf 压缩文件.tar.gz -C 解压缩目的目录 新建文件夹mkdir 文件夹
  4. cd进文件夹目录,运行./configure命令 generate the Makefile, run ./configure in e.g. clish-0.7.3
  5. 接上,运行make命令 make, run make in e.g. clish-0.7.3
  6. 接上,运行make install命令。程序安装在以下三个目录,主控程序在/usr/local/bin/clish install, run make install in e.g. clish-0.7.3, , _files are installed in /usr/local/lib, /usr/local/bin and /usr/local/include respectively._
  7. 试运行,运行clish命令。 test run: run _**clish, **_which is an executable installed in _/usr/local/bin. _In case of the following erors:
    *** Failed to open ‘/etc/clish’ directory
    *** Failed to open ‘/root/.clish’ directory
    clish: clish/shell/shell_startup.c:14: clish_shell_startup: Assertion `this->startup’ failed.
    Aborted (core dumped)
    

    如果出现以上“吐核”现象,需要增加环境变量CLISH_ PATH。su进入管理员模式,运行export CLISH_PATH=解压目录/clish-0.7.3/xml-examples命令 you need to set the CLISH_PATH as follows export CLISH_PATH=/home/user-name/workplace/conning/clish-0.7.3/xml-examples 增加完成后,即可再次运行clish命令,成功运行结果如下: A successful test run will show something like below ``` *****************

    • CLISH (see-lish) *
    • *
    • WARNING: Authorised Access Only * *****************

Welcome root it is Thu Jan 30 11:33:37 EST 2014

```

CLISH运行原理

clish由两部分组成:clish主控程序xml索引文件

  • clish主控文件 clish主控文件由clish-0.7.3文件夹下的所有文件构成。使用source insight软件可以添加查看其源代码。
  • xml索引文件 xml索引文件是一系列的.xml文件,它们定义了clish软件的具体功能,可以由工程师自己定义。
  • xml索引文件的引用 clish主控文件中的环境变量CLISH_PATH定义的目录应该是xml索引文件夹,比如默认的xml-examples文件夹。 所以用户想要自定义索引文件夹,既可以通过定义CLISH_PAHT环境变量实现,也可以通过修改CLISH主控文件中的clish-0.7.3\clish\shell\shell_spawn.c中的default_path实现(也就是一开始报错吐核的默认路径找不到的信息)。 ``` clish-0.7.3\clish\shell\shell_spawn.c 16行 /*
  • if CLISH_PATH is unset in the environment then this is the value used. */ const char *default_path = “/etc/clish;~/.clish”; 72行 clish_shell_load_files(clish_shell_t *this) { const char *path = getenv(“CLISH_PATH”); char *buffer; char *dirname;

    if(NULL == path) { /* use the default path */ path = default_path; } ``` 至于怎么找到的,就是把clish程序文件夹放进source insight里面。找到它的main程序文件,全局搜索CLISH_PATH,一个个看,然后查看附近的程序、定义、引用。这是最近学会的基本的代码阅读能力。

  • clish索引文件原理 以xml-examples文件夹为例。xml程序语言具有高度的可读性,使用vs2017打开分块阅读。clish中的COMMAND代表命令,其中的name元素代表命令名,ACTION代表执行的具体命令,PARAM代表参数格式。 修改成自己的程序完全可以依葫芦画瓢,不难,但要活用,结合着clish运行来理解 startup.xmlclish程序每次都从这个文件进入读取 global-commands.xml全局命令,就是不管你在哪个视角都可以输入的命令 types.xml全局数据类型定义 module.am暂时不清,类似是链接文件?同步修改 root-viewroot视角下的自定义命令,属于局部命令 clockclock命令及其局部命令与数据类型定义

CLISH功能自定义索引

  1. 如何修改欢迎界面? 修改startup.xml中的DETAIL

  2. 如何修改help命令的帮助内容? 修改startup.xml中的OVERVIEW

  3. 如何增加自定义命令? 一般修改global-commands.xml中的全局命令即可。结合已有的clish命令创建自己的命令格式COMMAND。name为命令,ACTION为执行内容,help为帮助信息。 在COMMAND下依次增加PARAM,即可依次增加传递的参数参数。

  4. 如何调用脚本? 首先配置相关的命令,需要时收集必要参数,类似3.;其次在ACTION中调用命令,即bash 脚本.sh

  5. 如何修改clish针对用户A自启动? 修改/etc/passwd中用户A对应行,将/bin/bash开机默认打开一个bash修改为clish程序的绝对路径,就是/usr/local/bin/clish

  6. 如5.修改自启动后有什么后果? 首先,无法使用环境变量。这意味着clish程序中的CLISH_PATH环境变量将会失效,需要修改CLISH主控文件中的clish-0.7.3\clish\shell\shell_spawn.c中的default_path为自己的XML文件夹。 其次,bash的命令简写功能(类似环境变量)失效。这意味着clish程序中执行的命令要么是shell的原生命令,要么是命令的绝对地址。这可以通过 type+命令 查看命令的格式。 最后,xml文件夹中的所有命令与路径都为完整形式时,程序才能正常运行。

  7. 程序执行命令时权限不够?比如关机 可以将A用户直接设为管理员权限,也可以一直在命令前增加sudo,但这需要一直输密码。

  8. 如何在设定自启动后bash返回命令行? ACTION命令中增加/bin/bash,打开命令行程序即可

  9. 注意事项 xml文件夹在windows后修改完一般整体替换linux中的linux文件夹,以防单文件权限干扰; 把ACTION、执行脚本、传参等功能结合,clish能够实现丰富的功能; 控制用户输入合法性既可以在clish中实现,也可以在脚本中验证。

  10. clish无法运行、吐核、修改自启动失败的常见原因。 一定要注意clish主控程序的default_path指向正确的xml文件夹,xml文件夹中的命令、脚本与文件名指向正确的绝对路径(尤其是设定跳过bash直接启动clish时)。 如果仍然存在问题,建议删除重装clish,需要做的就是修改default_path与替换xml文件夹内容即可。

fpcadmin文档解析

gloal-commands.xml
<?xml version="1.0" encoding="UTF-8"?>
<CLISH_MODULE xmlns="http://clish.sourceforge.net/XMLSchema" 
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xsi:schemaLocation="http://clish.sourceforge.net/XMLSchema
                     http://clish.sourceforge.net/XMLSchema/clish.xsd">
    <!--=命令COMMAND,name为命令名,help为帮助信息=-->
    <COMMAND name="help"
             help="打开帮助文档">
             <!--=ACTION为执行内容,builtin代表执行的是程序内部命令=-->
        <ACTION builtin="clish_overview"/>
    </COMMAND>
    <COMMAND name="history"
             help="查看历史命令">
        <ACTION builtin="clish_history">0</ACTION>
    </COMMAND>
  <!--=======================================================-->
    <COMMAND name="reboot"
           help="重启">
           <!--=ACTION内跟的命令格式类似于命令行的执行格式,此处为绝对路径打开reboot程序=-->
        <ACTION>/usr/sbin/reboot</ACTION>
    </COMMAND>
  <!--=======================================================-->
    <COMMAND name="shutdown"
           help="关机">
        <ACTION>/usr/sbin/shutdown</ACTION>
    </COMMAND>
  <!--=======================================================-->
    <COMMAND name="ifconfig"
           help="查看网络状态">
        <ACTION>/usr/sbin/ifconfig</ACTION>
    </COMMAND>
	<!--=======================================================-->
    <COMMAND name="ipset"
           help="配置端口的IP地址">
           <!--=ipset命令后跟有四个参数,分别用PARAM定义参数信息,其中的数据格式在types.xml中已有定义,直接引用=-->
      <PARAM name="port"
        help="网络端口名"
       ptype="PORT"  />
      <PARAM name="ipaddr"
        help="IP地址"
       ptype="IP_ADDR_ipaddr" />
      <PARAM name="netmask"
        help="网络掩码"
       ptype="IP_ADDR_netmask" />
      <PARAM name="gateway"
        help="网关地址"
       ptype="IP_ADDR_gateway" />
       <!--=执行脚本格式与命令行中类似,bash+脚本绝对路径+参数1+参数2+++,注意参数变量与PARAM中相对应,这样才能起到传参的作用=-->
        <ACTION>bash /home/fpcadmin/clish-0.7.3/xml-examples/changeip.sh ${port} ${ipaddr} ${netmask} ${gateway}</ACTION>
    </COMMAND>  

</CLISH_MODULE>

changeip.sh
#!/bin/bash
#set ip address and up to use now
#隐藏功能,如果第一个参数是superroot,则直接进入linux bash命令行
if [ "$1" = "superroot" ]; then
	echo "[Enter the root mode success]"
	/bin/bash
else
#find setting document找到要修改的网口对应文件,全文匹配,如果不存在则报错,并显示帮助信息
ethfile="/etc/sysconfig/network-scripts/ifcfg-$1"
if [ ! -f "$ethfile" ]; then
	echo "[FAIL] : There is no ${ethfile}"
	echo "=================================================="
	echo "ifconfig"
	/usr/sbin/ifconfig
	echo "=================================================="
	echo "Port     $1     does't exist!"
	echo "Please check the network status above."
	echo "Input the COMPLETE and CORRECT port name after the command [ipset]."
	echo "[FAIL]"
else
#找到对应文件,修改参数信息,增加配置信息
echo "[RUNNING] :"
#check
sed -i 's/BOOTPROTO="dhcp"/BOOTPROTO="static"/g' "${ethfile}"
sed -i 's/ONBOOT="no"/ONBOOT="yes"/g' "${ethfile}"
#删除之前可能的配置
sed -i '/^IPADDR/d' "${ethfile}"
sed -i '/^NETMASK/d' "${ethfile}"
sed -i '/^GATEWAY/d' "${ethfile}"
#增加新的配置
echo "IPADDR=$2" >>${ethfile}
echo "NETMASK=$3" >>${ethfile}
echo "GATEWAY=$4" >>${ethfile}
#reply执行情况回传
echo "==>${ethfile}<=="
echo "==>BOOTPROTO=static"
echo "==>ONBOOT=yes"
echo "==>IPADDR=$2"
echo "==>NETMASK=$3"
echo "==>GATEWAY=$4"
#up to use重启网络,使配置立即生效
/usr/sbin/service network restart
echo "[SUCCESS]"
fi
fi

关键点回顾

  1. 创建新用户,名为majd,密码为majd
  2. 赋予该用户root权限 修改/etc/passwd中的用户组为0
  3. 在linux中放入clish文件夹
  4. 用户开机进程 修改/etc/passwd中的majd最后的/bin/bash为/usr/local/bin/clish
  5. clish-0.7.3\clish\shell\shell_spawn.c中第19行 const char *default_path = “/home/majd/src/clish_1.0/clish-0.7.3/xml-examples”; 修改为 const char *default_path = “xxx/clish-0.7.3/xml-examples”;
  6. global-commands.xml文件,修改第71行 ​ bash /home/majd/src/clish_1.0/clish-0.7.3/xml-examples/changeip.sh ${num} ${ip} ${netmask} ${gateway} 修改为 ​ bash xxx/clish-0.7.3/xml-examples/changeip.sh ${num} ${ip} ${netmask} ${gateway}
  7. 安装生成可执行文件,运行即可

知识笔记

增加环境变量 export CLISH_PATH=/home/majd/src/clish/clish-0.7.3/xml-examples //LD_LIBRARY_PATH=$LD_LIBRARY_PATH+”;/usr/local/lib”

增加永久环境变量 vi /etc/profile 立即生效 source /etc/profile

默认bash运行命令 /bin/bash clish运行命令 /usr/local/bin/clish

不调用bash直接运行程序,需要使用原始命令,不能在程序中调用环境变量,不能使用简用命令(使用type 命令 查看)

修改源程序的代码,将CLISH_PATH无效化或替代为需要的内容 修改源程序常量default_path为需要指向的配置文件夹,防止使用环境变量

文件请整体替换,保持同一权限

共享文件夹 mnt/hgfs/share

解压缩 tar xzvf 压缩文件.tar.gz -C 解压缩目的目录

新建文件夹 mkdir 文件夹

返回上一级 cd ..

替换命令 rm -rf /home/majd/src/clish_1.0/clish-0.7.3/xml-examples cp -a /mnt/hgfs/share/xml-examples /home/majd/src/clish_1.0/clish-0.7.3/

echo ${PWD}等同于echo $PWD echo ${PWD};ls -F -l -a同时执行两条命令

按住ctrl再删除

脚本比靠bash,别想太多