библиотека для упаковки командной строки
https://happyoj.com/telnet Нажмите connect, затем введите имя пользователя test и пароль Root@123 ! Введите описание изображения
libcli — это библиотека для упаковки командной строки, которая может использоваться для управления командной строкой в встраиваемых операционных системах, подобно технологии управления командной строкой в коммутаторах Cisco и H3C.
# Пример использования
system>
system>sy
system>system-view
system]dis
system]display ?
device Device
user-name User Name
system]display device ?
slot Slot
<cr>
system]display device slot 2
Выполните команду display device slot 2.
system]dis
system]display ?
device Device
user-name User Name
system]display user-name ?
STRING<1-32> User Name, length range from 1 to 32.
system]display user-name jungle ?
<cr>
system]display user-name jungle
Выполните команду display user-name jungle.
system]dia
system-diagnose]?
display Display
quit Quit from current view
system-diagnose]q
system]q
system>
system]display current-configuration
#version 0.0.1
sysname system
#
return
#
``` system]sys
system]sysname Cisco
Cisco]dis cu
Cisco]dis current-configuration
#version 0.0.1
sysname Cisco
#
return
#
Cisco]
Компиляция
cmake . .
cmake --build . .
Компиляция демонстрационного примера
cmake -D BUILD_DEMO=1 . .
cmake --build . .
link_directories("${CMAKE_CURRENT_SOURCE_DIR}/lib") # путь к libcli.a
add_executable(cli_tester demo/main.cpp)
target_link_libraries(cli_tester cli) # подключение библиотеки libcli
include(FetchContent)
set(LIB_CLI_NAME libcli)
set(LIB_CLI_GIT_TAG v0.0.3)
set(LIB_CLI_GIT_URL https://gitee.com/jungle/${LIB_CLI_NAME}.git)
FetchContent_Declare(
${LIB_CLI_NAME}
GIT_REPOSITORY ${LIB_CLI_GIT_URL}
GIT_TAG ${LIB_CLI_GIT_TAG}
)
FetchContent_MakeAvailable(${LIB_CLI_NAME})
add_executable(cli_tester demo/main.cpp)
target_link_libraries(cli_tester cli) # Связываем библиотеку libcli
```### Инициализация и запуск библиотеки libcli
1. Сначала вызывается `cmd_init()` для инициализации библиотеки CLI. <br>
2. Затем запускается основной поток библиотеки `cmd_main_entry()`. <br>```cpp
int main()
{
/* Инициализация */
cmd_init(0);
/* Регистрация командной строки */
reg_cmd();
reg_cmd2();
/* Регистрация обратного вызова обработки командной строки */
(void)cmd_regcallback(MID_TEST, cmd_callback);
/* Создание основного потока */
_beginthreadex(NULL, 0, cmd_main_entry, NULL, NULL, NULL);
for (;;)
{
Sleep(1);
}
return 0;
}
#define MID_TEST 1
enum CMO_TBLID_EM {
CMO_TBL_SHOW = 0,
CMO_TBL_CFG,
};
enum CMO_SHOW_ID_EM {
CMO_SHOW_SHOW_DEVICE = CMD_ELEMID_DEF(MID_TEST, CMO_TBL_SHOW, 0),
CMO_SHOW_SHOW_SLOTID,
CMO_SHOW_SHOW_NAME,
};
ULONG reg_cmd()
{
CMD_VECTOR_S * vec = NULL;
/* Четыре этапа регистрации командной строки 1: Запрос вектора команд */
CMD_VECTOR_NEW(vec);
/* Четыре этапа регистрации командной строки 2: Определение командного символа */
/* 1 display */
cmd_regelement_new(CMD_ELEMID_NULL, CMD_ELEM_TYPE_KEY, "display", "Display", vec);
/* 2 device */
cmd_regelement_new(CMO_SHOW_SHOW_DEVICE, CMD_ELEM_TYPE_KEY, "device", "Device", vec);
/* 3 slot */
cmd_regelement_new(CMD_ELEMID_NULL, CMD_ELEM_TYPE_KEY, "slot", "Slot", vec);
/* 4 slot-id */
cmd_regelement_new(CMO_SHOW_SHOW_SLOTID, CMD_ELEM_TYPE_INTEGER, "INTEGER<0-8>", "Slot ID", vec);
/* 5 user-name */
cmd_regelement_new(CMD_ELEMID_NULL, CMD_ELEM_TYPE_KEY, "user-name", "User Name", vec);
/* 6 user-name-value */
cmd_regelement_new(CMO_SHOW_SHOW_NAME, CMD_ELEM_TYPE_STRING, "STRING<1-32>", "User Name, length range from 1 to 32.", vec);
/* Четыре этапа регистрации командной строки 3: Регистрация командной строки */
cmd_install_command(MID_TEST, VIEW_GLOBAL, " 1 2 ", vec); /* display device */
cmd_install_command(MID_TEST, VIEW_GLOBAL, " 1 2 3 4 ", vec); /* display device slot <slot-id> */
cmd_install_command(MID_TEST, VIEW_GLOBAL, " 1 5 6 ", vec); /* display user-name <user-name-value> */
```### Командная строка: освобождение вектора командной строки 4```c
CMD_VECTOR_FREE(vec);
return 0;
Здесь следует отметить, что при регистрации команды командной строки с помощью cmd_install_command
, третий параметр представляет собой выражение, состоящее из чисел, которые представляют элементы команд, определенные ранее с помощью cmd_regelement_new
, и составляют полную команду.
ULONG show_callback(VOID *pRcvMsg)
{
ULONG iLoop = 0;
ULONG iElemNum = 0;
ULONG iElemID = 0;
VOID *pElem = NULL;
ULONG vtyId = 0;
ULONG SlotId = 0xFFFFFFFF;
ULONG isDevice = 0;
ULONG isUsername = 0;
CHAR szName[32] = {0};
vtyId = cmd_get_vty_id(pRcvMsg);
iElemNum = cmd_get_elem_num(pRcvMsg);
for (iLoop = 0; iLoop < iElemNum; iLoop++)
{
pElem = cmd_get_elem_by_index(pRcvMsg, iLoop);
iElemID = cmd_get_elemid(pElem);
switch (iElemID)
{
case CMO_SHOW_SHOW_DEVICE:
isDevice = 1;
break;
case CMO_SHOW_SHOW_SLOTID:
SlotId = cmd_get_ulong_param(pElem);
break;
case CMO_SHOW_SHOW_NAME:
isUsername = 1;
cmd_copy_string_param(pElem, szName);
break;
default:
break;
}
}
if (SlotId != 0xFFFFFFFF)
{
vty_printf(vtyId, "Выполняется команда отображения устройства слота %u.\r\n", SlotId);
return 0;
}
if (isDevice)
{
vty_printf(vtyId, "Выполняется команда отображения устройства.\r\n");
return 0;
}
if (isUsername)
{
vty_printf(vtyId, "Выполняется команда отображения имени пользователя %s.\r\n", szName);
return 0;
}
return 0;
}
ULONG cmd_callback(VOID *pRcvMsg)
{
ULONG iRet = 0;
ULONG iTBLID = 0;
/* Получение tblid командной строки для обработки команд различных подмодулей */
iTBLID = cmd_get_first_elem_tblid(pRcvMsg);
switch (iTBLID)
{
case CMO_TBL_SHOW:
iRet = show_callback(pRcvMsg);
break;
case CMO_TBL_CFG:
iRet = cfg_callback(pRcvMsg);
break;
default:
break;
}
}
``````markdown
return iRet;
}
(void)cmd_regcallback(MID_TEST, cmd_callback);
Шаги обработки командной строки в функции show_callback
являются фиксированными.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )