【问题标题】:Are there any libraries that provide an administrative CLI for a C/C++ daemon?是否有任何库为 C/C++ 守护程序提供管理 CLI?
【发布时间】:2012-11-19 16:47:23
【问题描述】:

我正在寻找某种可以嵌入 C/C++ 守护进程的嵌入式 shell。这个想法是我们可以远程登录到正在监听的端口,并更改配置/查看状态/等。

类似于 Quagga/Zebra 的 CLI(以 IOS 为模型)或类似的东西。理想情况下,它具有类似 readline 的支持,易于使用,并且易于扩展,以便我们向其添加新功能。

我曾考虑使用嵌入式 Python 或 Lua 之类的东西来提供该语言的 shell,但我从未真正见过其他人这样做。

还有其他人介意他们之前是如何做到这一点的吗?

【问题讨论】:

    标签: c admin command-line-interface daemon


    【解决方案1】:

    libcli 会做你想做的事。它还具有身份验证功能,可在命令行、telnet 上运行,并且您可以轻松地构建客户端以随心所欲地工作。非常喜欢 cisco 的自动完成、子命令等。你可以在这里找到它: https://github.com/dparrish/libcli

    这是一个实现命令“hello”并让您在端口 12345 上远程登录到它的小示例:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <errno.h>
    #include <sys/socket.h>
    #include <sys/types.h>
    #include <netinet/in.h>
    
    #include <libcli.h>
    
    int call_hello(struct cli_def *cli, char *name, char **argv, int argc) {
        cli_print(cli, "hello world");
        return 0;
    }
    
    int main(void) {
        struct cli_def *cli;
        int sockfd;
        int acceptfd;
        struct sockaddr_in saddr, raddr;
        unsigned int on = 1;
        unsigned int rlen = sizeof(struct sockaddr_in);
        cli = cli_init();
        cli_register_command(cli, NULL, "hello", call_hello,
                             PRIVILEGE_UNPRIVILEGED, MODE_ANY, "runs hello world");
    
        if((sockfd=socket(AF_INET, SOCK_STREAM, 0)) == -1) {
             perror("socket");
             exit(-1);
        }
        saddr.sin_port = htons(12345);
        saddr.sin_family = AF_INET;
        saddr.sin_addr.s_addr = INADDR_ANY;
        memset(&raddr, 0, sizeof(raddr));
        raddr.sin_family=AF_INET;
        if(setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) != 0) {
            perror("setsockopt");
            exit(-1);
        }
        if(bind(sockfd, (struct sockaddr*)&saddr, sizeof(saddr)) == -1) {
             perror("bind");
             exit(-1);
        }
        if(listen(sockfd, 12) != 0) {
             perror("listen");
             exit(-1);
        }
        while((acceptfd=accept(sockfd, (struct sockaddr*)&raddr, &rlen)) > 0) {    
             while(cli_loop(cli, acceptfd) == 0);
        }
        return 0;
    }
    

    【讨论】:

    • 这是我之前看到的!不知何故为“CLI”搜索“库”并没有激发我尝试“libcli”。太棒了!
    【解决方案2】:

    如何添加一个本地 HTTP 服务器,以便您可以通过一个简单的 Web 客户端进行配置?网页非常灵活且易于使用;)例如参见 Poco 的 HTTPServer 类 (http://pocoproject.org/docs/)

    【讨论】:

    • 这可能是我的后备选项,但我们所有人都更喜欢某种 CLI。我将更深入地了解 Poco。谢谢。 :)
    • 添加一个 HTML 文本字段,您可以在其中输入一些 Lua 文本,让 Lua 执行并将结果显示在网页上。不是超级交互,但使用按钮和复选框比 CLI 交互更容易一些管理操作。
    • 关于嵌入式 http 服务器,这可能也很有趣:gnu.org/software/libmicrohttpd@whamma
    【解决方案3】:

    您正在寻找的是实现您自己的 CMD.EXE(或终端仿真器)之类的实用程序,除了内置在您的 GUI 中。我以前是如何完成这样的事情的?我已经阅读了 VT100 终端的手册以及如何模拟它。然后开始在 .NET 中实现一个自定义组件。

    【讨论】:

    • 我并不是真的在寻找花哨的终端仿真或任何东西,像 readline 这样的东西可以处理。我很确定我在 somewhere 看到了一个预装库,它提供了一个很好的 CLI,用于管理我们可以在子线程或类似线程中运行的配置、状态和维护任务。
    猜你喜欢
    • 2023-03-12
    • 1970-01-01
    • 2013-02-07
    • 1970-01-01
    • 2012-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-19
    相关资源
    最近更新 更多