2012-11-19 30 views
3

我正在尋找某種嵌入式shell,我們可以將它們放在C/C++守護進程中。我們的想法是,我們可以遠程登錄到正在監聽的端口,並更改配置/查看狀態等。是否有任何庫爲C/C++守護程序提供管理CLI?

類似於Quagga/Zebra所具有的(類似IOS的)或類似的CLI。理想情況下,具有類似readline的支持以便於使用,並且可以輕鬆擴展,以便我們爲其添加新功能。

我想過使用類似嵌入式Python或Lua的東西來提供該語言的shell,但我從來沒有見過其他人這樣做。

任何人都會介意他們之前的成就嗎?

回答

4

libcli會做你想做的。它還具有身份驗證功能,通過命令行,telnet工作,您可以輕鬆構建客戶端以進行工作,但是您也需要它。非常思科像自動完成,子命令等,您可以在這裏找到: https://github.com/dparrish/libcli

這裏有一個小例子執行命令「你好」,讓您遠程登錄到它的端口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; 
} 
+0

這就是我之前看到的!以某種方式爲「CLI」搜索「庫」並不能激發我嘗試「libcli」。真棒! – whamma

0

你正在尋找的是實現你自己的CMD.EXE(或終端模擬器)像實用程序,除了內置於您的GUI。我以前是如何完成這樣的事情的?我已閱讀VT100終端的手冊以及如何模擬該手冊。然後去執行一個自定義組件在.NET中的相同

+0

我我並不是真的在尋找奇特的終端模擬或任何東西,就像readline可以處理的那樣。我很確定我看到*某處*一個預覽的庫,它提供了一個很好的CLI,用於管理可以在子線程或類似環境中運行的配置,狀態和維護任務。 – whamma

1

如何添加本地HTTP服務器,以便您可以通過簡單的Web客戶端進行配置?網頁非常靈活且易於使用;)例如看看Poco的HTTPServer類(http://pocoproject.org/docs/)

+0

這可能是我的後備選擇,但我們所有人都確實喜歡某種CLI。我會更深入地觀察波科。謝謝。 :) – whamma

+0

添加一個HTML文本字段,您可以在其中輸入一些Lua文本,讓Lua執行並將結果顯示在網頁上。不是超級交互式的,但是與CLI交互相比,按鈕和複選框會讓一些管理員的事情變得容易得多。 –

+0

關於嵌入式http服務器,這也可能是有趣的:http://www.gnu.org/software/libmicrohttpd/ @whamma – alk

相關問題