c - 是否有任何库为 C/C++ 守护程序提供管理 CLI?

标签 c admin command-line-interface daemon

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

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

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

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

最佳答案

libcli 会做你想做的事。它还具有身份验证、通过命令行、telnet 工作的功能,并且您可以轻松构建客户端以按您希望的方式工作。非常思科喜欢自动完成,子命令等。你可以在这里找到它: 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;
}

关于c - 是否有任何库为 C/C++ 守护程序提供管理 CLI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13458369/

相关文章:

python - docker 。无此文件或目录

go - 全局变量不会从 CLI 命令中保留下来

c - 如果功能为真,如何保留值(value)?

python - 在 Django Admin 中保存 M2M "Through"内联

c - 为什么需要保存集用户 ID?

tomcat - 如何轮转tomcat localhost日志?

google-app-engine - 谷歌应用引擎 : who is an admin?

node.js - 如何全局安装支持 es6 导入的 node-cli 工具?

将 char *arr[] 作为 const char **arr 传递给函数时出现 c 编译器警告

python - 以附加模式打开文件并寻求开始