3

C/C++ デーモンに組み込むことができる組み込みシェルを探しています。アイデアは、リッスンされているポートにtelnetで接続し、構成を変更したり、ステータスを表示したりできるということです。

Quagga/Zebra にある CLI (IOS をモデルにしたもの) のようなもの。理想的には、使いやすさのために readline のようなサポートがあり、新しい機能を追加するために簡単に拡張できます。

組み込みの Python や Lua などを使用してその言語でシェルを提供することを考えたことはありますが、実際に他の人がこれを行っているのを見たことがありません。

彼らが以前にこれをどのように達成したかについて、他の誰かが気にしていますか?

4

3 に答える 3

4

libcli はあなたが望むことをします。また、認証機能も備えており、コマンド ラインや telnet で動作し、必要に応じて動作するクライアントを簡単に構築できます。オート コンプリート、サブ コマンドなどと同様に非常に cisco です。ここで見つけることができます: https://github.com/dparrish/libcli

コマンド「hello」を実装し、ポート 12345 で telnet できるようにする小さな例を次に示します。

#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;
}
于 2012-11-22T18:16:26.413 に答える
1

シンプルな Web クライアント経由で構成できるように、ローカル HTTP サーバーを追加するのはどうですか? Web ページは非常に柔軟で使いやすいです ;) たとえば、Poco の HTTPServer クラス (http://pocoproject.org/docs/) を参照してください。

于 2012-11-22T02:29:12.220 に答える
0

あなたが探しているのは、GUIに組み込まれていることを除いて、ユーティリティのような独自のCMD.EXE(または端末エミュレーター)を実装することです。以前にこのようなことをどのように達成したのでしょうか? VT100端末のマニュアルとそれをエミュレートする方法を読みました。次に、同じために .NET でカスタム コンポーネントを実装しました。

于 2012-11-22T01:38:20.053 に答える