当前位置:  技术问答>linux和unix

怎样做一个linux的CLI(command line interface)?

    来源: 互联网  发布时间:2016-02-26

    本文导语:  我想做一个telnet的登陆界面,就像cisco路由器一样,用户登陆后只能使用指定的命令,请问有谁做过?怎么做? 我用的是Linux,Linux本身的用户登陆时会指定执行某种shell,比如/bin/sh,我是想做一个替换他,比如/bin/myc...

我想做一个telnet的登陆界面,就像cisco路由器一样,用户登陆后只能使用指定的命令,请问有谁做过?怎么做?
我用的是Linux,Linux本身的用户登陆时会指定执行某种shell,比如/bin/sh,我是想做一个替换他,比如/bin/mycli。

|
算了,直接上代码
#include 
#include 
#include 
#include 
#include 
#include 
#include 
/* The maximum number of command's args */
#define MAX_ARGVS 16
/* The maximum size of command */
#define MAX_CMD_SIZE 50
/******************************************************************************
 An entry in the console command list consists of a command name and its
 entry point.
 ******************************************************************************/
typedef int executable(int argc, char **argv);
typedef struct {
    char *name;
    executable *entry;
} cmd_t;
/******************************************************************************
 Command prototypes
 ******************************************************************************/
static int help(int argc, char **argv);
static int SystemCall(int argc, char **argv);
static int cd(int argc, char **argv);
/******************************************************************************
 List of all console commands.
 ******************************************************************************/
static cmd_t cmd_list[] = {
    {"help", (executable *) help},
    {"q", (executable *) exit},
    {"exit", (executable *) exit},
    {"quit", (executable *) exit},
    {"$", SystemCall},
    {"cd", cd},
    {NULL, NULL}
};
 /******************************************************************************
 Search for a console command with matching name in the console command list.
 Return 0 if not found.
 ******************************************************************************/
static cmd_t *GetEntry(char *name)
{
    cmd_t *p = cmd_list;
    int i;
    for (i = 0; cmd_list[i].name != NULL; i++, p++)
        if (strcmp(name, p->name) == 0)
            return p;
    return 0;
}
static char *command_generator(char *text, int state)
{
    static int list_index, len;
    char *name;
    /* If this is a new word to complete, initialize now.  This includes
       saving the length of TEXT for efficiency, and initializing the index
       variable to 0. */
    if (!state) {
        list_index = 0;
        len = strlen(text);
    }
    /* Return the next name which partially matches from the command list. */
    while ((name = cmd_list[list_index].name)) {
        list_index++;
        if (strncmp(name, text, len) == 0)
            return (g_strdup(name));
    }
    /* If no names matched, then return NULL. */
    return ((char *) NULL);
}
static char **command_completion(char *text, int start, int end)
{
    char **matches;
    matches = (char **) NULL;
    /* If this word is at the start of the line, then it is a command
       to complete.  Otherwise it is the name of a file in the current
       directory. */
    if (start == 0)
        matches = (char**)completion_matches(text, command_generator);
    return (matches);
}
static void initialize_readline()
{
    /* Allow conditional parsing of the ~/.inputrc file. */
    rl_readline_name = "FileMan";
    /* Tell the completer that we want a crack first. */
    rl_attempted_completion_function = (CPPFunction *) command_completion;
}
static void execute_line(char *line)
{
    cmd_t *pcmd;
    int argc = 0;
    char *argv[MAX_ARGVS];
    char *q = strtok(line, " ");
    while (1) {
        if (q == 0)
            break;
        argv[argc++] = q;
        q = strtok(0, " ");
    }
    /* Look for the command in the console command list */
    pcmd = GetEntry(line);
    if (pcmd == 0) {
        printf("Bad Command! n");
        printf("Type "help" to get helpn");
    } else {
        pcmd->entry(argc, argv);
    }
}

int main()
{
    printf("***************************************************************n");
    printf("                         CONSOLE                               n");
    printf("***************************************************************n");
    printf("To get help, please type "help"n");
    char *line, *s;
    initialize_readline();
    while (1) {
        line = readline("> ");
        if (!line)
            break;
        s = g_strstrip(line);
        if (*s) {
            add_history(s);
            execute_line(s);
        }
    }
    return 0;
}
/*****************************************************************************
 *command help
 *The "help" command do nothing but just print the command and it's argvs
 *****************************************************************************/
static int help(int argc, char **argv)
{
    if (argc 

    
 
 

您可能感兴趣的文章:

  • linux启动不了,Bringup loopback interface时出错,请问是什么原因?
  • linux系统下,采用 ADSL 路由方式上网,如何设置网络端口interface的值?
  • 我的Linux7.2启动时有一项显示:Bringing up interface eth0 [failed]
  • 请教,linux启动的时候到bringing up interface eth0 就停住了,只能自己瞎输入字符?
  • 怎样在LINUX的COMMAND LINE下编辑文本。
  • radhat linux中 gcc command not found
  • linux makefile error :Makefile:335: *** commands commence before first target。
  • make: arm-linux-: Command not found的奇怪问题
  • 红旗Linux6.0 bash: qsub: command not found
  • linux 终端提示bash: .bashrc: command not found
  • linux安装完成后,敲xterm,报command not found
  • linux shell 脚本中的command << delimiter的问题
  • 使用gdb 时, command not found , linux里不是应该有这个工具吗?
  • linux下shell编程时出现command not found
  • 新手急求答案:在linux中当open()时给出提示command not find
  • linux shell 小程序总是提示command not found
  • linux下安装oracle出现bash:sqlplus:command not found
  • Linux mv command 一周一周的move
  • 请问为什么我在RH Linux 9.0 Terminal中运行经过gcc编译生成的a.out时提示-bash: a.out:command not found ?
  • linux command无法撤消mv命令,在linux下没有undo.刚google下,看到老外说的一句比较经典的话。
  • 在线等答案!----- Linux下安装NS2 2.33版本,出现barsh:ns:command not found错误,什么原因?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 请问哪有 arm-linux-nm, arm-linux-addr2line等等这些工具的使用说明~~~
  • On Line --100--Please tell me how to use QQ on linux??
  • 请教:开机时,如何对linux中的声卡进行音量及line in控制设置。。。。。。。急急急
  • how to use qq(or other char tool)in linux?Is there some softwares in linux?waiting on line.
  • 请问如何在LINUX下如何调用有关VIDEO的API?(waiting on line)
  • linux c/c++ IP字符串转换成可比较大小的数字
  • 在win分区上安装linux和独立分区安装linux有什么区别?可以同时安装吗?(两个linux系统)
  • linux哪个版本好?linux操作系统版本详细介绍及选择方案推荐
  • 在虚拟机上安装的linux上,能像真的linux系统一样开发linux程序么?
  • secureCRT下Linux终端汉字乱码解决方法
  • 我重装window后,把linux的引导区覆盖了,进不了linux怎么办?急啊,望热心的人帮助 (现在有linux的盘)
  • Linux c字符串中不可打印字符转换成16进制
  • 安装vmware软件,不用再安装linux系统,就可以模拟linux系统了,然后可以在其上学习一下LINUX下的基本操作 了?
  • Linux常用命令介绍:更改所属用户群组或档案属性
  • 红旗Linux主机可以通过127.0.0.1访问,但如何是连网的Win2000机器通过Linux的IP去访问Linux
  • linux命令大全详细分类介绍及常用linux命令文档手册下载
  • 我重装window后,把linux的引导区覆盖了,进不了linux怎么办?急啊,望热心的人帮助 (现在没有linux的盘,只有DOS启动盘)
  • Linux Kernel 'sctp_v6_xmit()'函数信息泄露漏洞
  • 如何让win2000和linux共存。我装好WIN2000,再装LINUX7.0,但LILO只能找到LINUX,不能引导WIN2000
  • linux c下利用srand和rand函数生成随机字符串
  • 在windows中的VMware装了个linux,主板有两个串口,能做windows和linux的串口通信测试么,怎么测试这两个串口在linux是有效
  • Linux c++虚函数(virtual function)简单用法示例代码
  • 我们网站的服务器从windows2000迁往linux,ASP程序继续使用,可是我连LINUX的皮毛都不了解,大家告诉我LINUX下怎么建网站??
  • Docker官方镜像将会使用Alpine Linux替换Ubuntu
  • 中文Linux与西文Linus分别哪一个版是权威?I认为是:中科软的白旗Linux与西文的绿帽子Linux!大家的看法呢?
  • Linux下chmod命令详细介绍及用法举例
  • 我重装了winme,却进不了Linux了,而我现在又没有Linux光盘,也没有Linux启动盘,还有没有办法?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3