Clish技术文档
CLISH技术文档
CLISH能够实现的功能
搭建基于NIX系统的、类思科交互模式的命令行程序,具有自动补全、输入提示等功能,通过自定义命令名与执行方式,使使用者能够准确且易懂地执行复杂命令。 clish是一个类思科命令行补全与执行程序,它可以帮助程序员在nix操作系统上实现功能导引、命令补全、命令执行的程序。
- 方便用户利用
?
、help
、tab tab
等按键实时获得帮助 - 控制用户输入格式,如ip地址、0-9的正整数等
- 支持view视角功能,如进入某个ip配置端口进行配置,显示
port1>
- 根据用户命令执行命令或者脚本程序
- 论文:http://www.doc88.com/p-9186756837728.html
# 基于CLISH的网络设计命令行界面项目的设计与实现
CLISH安装运行过程
- 官方网站:http://clish.sourceforge.net/ ,直接下载.gz.tar压缩包
- 下载压缩包 Download the source tarball from [http://clish.sourceforge.net/#downloads]
- 将压缩包放到nix系统中,解压缩到需要的文件夹
unzip and untar the source codes into your desired place.
移动文件:使用SSH自带文件管理工具,或者VM提供的共享文件夹功能
解压缩
tar xzvf 压缩文件.tar.gz -C 解压缩目的目录
新建文件夹mkdir 文件夹
cd
进文件夹目录,运行./configure
命令 generate the Makefile, run ./configure in e.g. clish-0.7.3- 接上,运行
make
命令 make, run make in e.g. clish-0.7.3 - 接上,运行
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._ - 试运行,运行
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.xml
clish程序每次都从这个文件进入读取global-commands.xml
全局命令,就是不管你在哪个视角都可以输入的命令types.xml
全局数据类型定义module.am
暂时不清,类似是链接文件?同步修改root-view
root视角下的自定义命令,属于局部命令clock
clock命令及其局部命令与数据类型定义
CLISH功能自定义索引
-
如何修改欢迎界面? 修改
startup.xml
中的DETAIL -
如何修改help命令的帮助内容? 修改
startup.xml
中的OVERVIEW -
如何增加自定义命令? 一般修改
global-commands.xml
中的全局命令即可。结合已有的clish命令创建自己的命令格式COMMAND。name为命令,ACTION为执行内容,help为帮助信息。 在COMMAND下依次增加PARAM,即可依次增加传递的参数参数。 -
如何调用脚本? 首先配置相关的命令,需要时收集必要参数,类似3.;其次在ACTION中调用命令,即
bash 脚本.sh
-
如何修改clish针对用户A自启动? 修改/etc/passwd中用户A对应行,将/bin/bash开机默认打开一个bash修改为clish程序的绝对路径,就是/usr/local/bin/clish
-
如5.修改自启动后有什么后果? 首先,无法使用环境变量。这意味着clish程序中的CLISH_PATH环境变量将会失效,需要修改
CLISH主控文件
中的clish-0.7.3\clish\shell\shell_spawn.c
中的default_path
为自己的XML文件夹。 其次,bash的命令简写功能(类似环境变量)失效。这意味着clish程序中执行的命令要么是shell的原生命令,要么是命令的绝对地址。这可以通过type
+命令 查看命令的格式。 最后,xml文件夹中的所有命令与路径都为完整形式时,程序才能正常运行。 -
程序执行命令时权限不够?比如关机 可以将A用户直接设为管理员权限,也可以一直在命令前增加sudo,但这需要一直输密码。
-
如何在设定自启动后bash返回命令行? ACTION命令中增加/bin/bash,打开命令行程序即可
-
注意事项 xml文件夹在windows后修改完一般整体替换linux中的linux文件夹,以防单文件权限干扰; 把ACTION、执行脚本、传参等功能结合,clish能够实现丰富的功能; 控制用户输入合法性既可以在clish中实现,也可以在脚本中验证。
-
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
关键点回顾
- 创建新用户,名为majd,密码为majd
- 赋予该用户root权限 修改/etc/passwd中的用户组为0
- 在linux中放入clish文件夹
- 用户开机进程 修改/etc/passwd中的majd最后的/bin/bash为/usr/local/bin/clish
- 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”;
- 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} - 安装生成可执行文件,运行即可
知识笔记
增加环境变量 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,别想太多