cli
版本信息
| 项目 | 内容 |
|---|---|
| 组件版本 | 1.130.13 |
| 首发版本 | 1.130.6 |
| 文档作者 | openUBMC 社区 |
| 最后更新 | 2026-09-13 |
1. 组件概述
1.1 组件简介
cli 组件是 openUBMC 对外的人机交互入口,向上提供命令行界面,向下屏蔽资源协作接口与后端服务差异。由两部分组成:
| 部分 | 语言 | 说明 |
|---|---|---|
| 受限 Shell(CLP) | C(src/clp/) | 登录后进入的命令行环境,仅放行固定命令集 |
ipmcget / ipmcset | Lua(src/lualib/、src/service/) | 将命令解析为 URI,经路由映射器转成后端资源协作接口对象调用 |
1.2 解决什么问题
1、解决服务器底层管理的标准化、自动化与可追溯性问题。
服务器内部硬件组件众多,配置项复杂。如果缺乏统一的接口,运维将面临配置不一致、批量操作困难、接口随意变更导致自动化脚本失效等问题。
2、CLI 的解决方案:
统一配置与接口,屏蔽硬件差异,允许用户通过简单的命令完成所有管理操作。
支持基于 Shell / Python 的自动化运维,使得大规模服务器集群的批量配置、状态监控成为可能。
接口基线与生命周期管控,解决接口变更导致上下游系统兼容性问题,确保自动化流程的稳定性和可维护性。
1.3 核心功能
1. 受限 Shell:登录提示符、命令历史、会话超时(默认 900 秒,notimeout 可取消)、敏感信息遮蔽;命令集含 help、ipmcget、ipmcset、mdbctl、ping、reboot、rollback、passwd、ssh 等。
2. ipmcget / ipmcset:参数化命令 [-l <location>] [-t <target>] -d <dataitem> [-s <systemid>] [-v <value>],支持普通/分页/任务三类执行模式、敏感命令二次确认与鉴权、SOL 会话管理、一键日志收集入口(ipmcget -d diaginfo)。
1.4 关键术语表
| 术语 | 解释 |
|---|---|
| CLP | 受限 Shell 环境,只允许执行预定义命令集。 |
| ipmcget | 查询类 CLI 命令。 |
| ipmcset | 配置类 CLI 命令。 |
| URI | CLI 命令映射到后端资源协作接口的路由标识。 |
| interface_filter.json | 根据资源树条件隐藏部分 CLI 命令的产品定制配置。 |
1.5 外部交互边界图
只有Release包才会默认使用clp_commands。本组件不持有数据,所有查询/配置最终通过 D-Bus 用户会话总线(
sd_bus)访问资源协作接口对象(path+interface)与后端服务(账号、重启、SOL、任务服务等)。
2. API 使用说明与示例
运行help指令可以查看clp_commands下所有可用指令
2.1 ipmcget / ipmcset 命令
功能说明
ipmcget 查询 BMC 状态、配置、日志等信息;ipmcset 下发配置与控制命令。
参数说明
命令语法:
ipmcget/ipmcset [-l <location>] [-t <target>] -d <dataitem> [-s <systemid>] [-v <value>]| 参数 | 必选 | 说明 |
|---|---|---|
-l <location> | 否 | 机框/位置(仅当构建开启 cli_l_supported 时可用,默认关闭) |
-t <target> | 否 | 目标资源类型,缺省为 _(通配) |
-d <dataitem> | 是 | 数据项,如 version、sensor、sel |
-s <systemid> | 否 | 多机形态下的系统 ID |
-v <value> | 否 | 附加参数/配置值 |
返回值与异常
可能抛出的异常及触发条件如下。错误通过 pcall 捕获并打印到标准输出,不向调用方抛出堆栈:
| 输出 | 触发条件 |
|---|---|
Invalid Command | 路由映射器响应异常,或命令执行类型未注册 |
Request failed. | 后端服务返回错误(errs 非空) |
Request failed, the echo profile does not exist. | 回显模板文件缺失 |
Invalid input | 鉴权提示后,密码输入失败 |
| 内部错误消息 | Lua 执行抛出未预期异常 |
参数不完整/非法时打印对应层级的帮助信息(Usage/参数列表/Example),不算异常。
应用场景
- 日常巡检:查询版本、传感器、SEL、日志等信息。
- 配置下发:通过
ipmcset修改 BMC 配置。 - 会话管理:管理 SOL 会话和用户口令。
限制条件
- 写操作需要对应权限。
- 部分命令需要二次确认或密码鉴权。
调试示例
以下命令与在受限 Shell 内执行等价:
# 查询版本
ipmcget -d version
# 设置 SOL 超时时间
ipmcset -t sol -d timeout -v 15
# 期望输出:Set SOL timeout period successfully.对于非 Release 构建,ipmcget/ipmcset 命令支持 --verbose=<level> 调整运行日志级别。
调试日志示例
# 设置日志级别为debug,查看详细调试信息
ipmcget --verbose=debug -d version<level> | 说明 |
|---|---|
| error | 仅错误信息 |
| warning | 警告及以上 |
| notice | 重要通知及以上 |
| info | 一般信息(默认) |
| debug | 详细调试信息 |
| mass | 大量日志(最高级别) |
2.2 受限 Shell 命令
功能说明
列出受限 Shell 中可直接使用的内置命令。
参数说明
各命令参数以 help 输出为准;ping、top、route 等命令只接受受限参数。
返回值与异常
命令成功时输出查询结果或成功提示;未注册、未使能或越权时输出错误信息。
应用场景
用于登录后的现场巡检、网络检查、资源调试和 BMC 重启操作。
限制条件
仅 Release 包默认进入受限 Shell;可用命令受产品配置和 interface_filter.json 控制。
调试示例
| 命令 | 作用 |
|---|---|
help | 打印命令帮助 |
exit | 中止CLP会话 |
ping | 测试IPv4网络状态 |
ping6 | 测试IPv6网络状态 |
ifconfig | 查看网络设备信息 |
notimeout | 取消登录会话超时 |
free | 检测内存状态 |
top | 检查系统资源使用情况。不接受参数 |
df | 检查磁盘使用情况 |
netstat | 用于检查端口状态 |
route | 用于检查路由信息。不接受参数 |
reboot [-f] [-r] [-R] | 重启 BMC(-f 强制、-r 进入恢复模式、-R 重启并回滚) |
rollback | 强制重启并回滚 |
mdbctl | 在线调试命令(实现位于 mdbctl 组件) |
3. 组件扩展案例
3.1 扩展能力概述
本组件支持声明式配置 + 模板扩展命令(主要在rackmount仓的interface_config/cli/目录下),无需改动核心代码。
3.2 扩展点说明
| 扩展点 | 位置 | 作用 |
|---|---|---|
| 接口配置 JSON(rackmount仓) | interface_config/{ipmcget,ipmcset}/*.json | URI → 后端调用映射、参数校验、回显引用 |
| 回显模板(rackmount仓) | interface_config/echoes/** | 自定义输出格式(Lua 模板引擎) |
| 客户/产品定制(rackmount仓) | interface_config/customer/**interface_config/<platform_board>/ | 按客户/产品替换配置与模板 |
| 自定义路由脚本(cli组件仓) | src/lualib/route/** | 复杂命令定制逻辑(如 SOL activate) |
| 命令隐藏过滤(cli组件仓) | interface_config/interface_filter.json | 按资源树条件隐藏指定 CLI 命令(见 3.5) |
3.3 二次开发指导
openUBMC社区的CLI接口采用接口映射配置方案实现,需要将命令配置到json文件中。CLI命令的接口映射配置文件位于 rackmount 代码仓的 interface_config/cli 路径下。参考社区文档:
3.4 案例:新增一条配置命令(以 sol/timeout 为例,取自单元测试数据)
Step 1:接口配置 interface_config/cli/ipmcset/sol.json,Uri 对应 /cli/v1/sol/timeout:
{
"Resources": [{
"Uri": "/cli/v1/sol/timeout",
"Interfaces": [{
"Type": "Patch",
"Usage": "ipmcset -t sol -d timeout -v <value>",
"ReqBody": {
"Type": "object",
"Required": true,
"Properties": {
"Value": { "Required": true, "Type": "integer", "Validator": [{ "Type": "Range", "Formula": [0, 480] }] }
}
},
"ProcessingFlow": [{
"Type": "Method",
"Path": "sol/SetTimeout",
"Interface": "interface",
"Name": "SetTimeout",
"Params": ["${ReqBody/Value}"],
"Destination": { "Result": "Result" }
}],
"Echoes": ["ipmcset/sol_timeout", ""]
}]
}]
}Step 2:回显模板 interface_config/cli/echoes/ipmcset/sol_timeout:
Set SOL timeout period {* Result == 0 and 'successfully' or 'failed' *}.Step 3:验证
ipmcset -t sol -d timeout -v 15
# Set SOL timeout period successfully.模板标记(src/lualib/template/parser.lua):{* expr *} 原样输出、{{ expr }} 输出expr的结果(一些特殊符号将会被转义)、{% lua %} 语句、{( view, ctx )} 引入模板、{# comment #} 注释。
参考文档:产品多层级接口定制
3.5 产品定制命令隐藏(interface_filter.json)
产品可通过 interface_config/interface_filter.json按资源树条件隐藏部分 CLI 命令。被隐藏的命令执行时按“命令不存在”处理,且不会出现在 -t/-d/-l 提示列表中。
配置结构:
{
"Conditions": {
"ServiceEnabled": {
"Path": "/bmc/kepler/EventService",
"Interface": "bmc.kepler.EventService",
"Property": "ServiceEnabled",
"Value": true,
"Description": "资源树匹配示例"
}
},
"CLIFilter": [
{
"Conditions": ["ServiceEnabled"],
"ErrorMessage": "该命令在当前产品下不可用",
"Get": [
{ "ParentUri": "/cli/v1/sol", "Command": "*" },
{ "ParentUri": "/cli/v1/shelf/_", "Command": "chassisid", "LocationCommand": true }
],
"Set": [
{ "ParentUri": "/cli/v1/shelf/_", "Command": "*", "LocationCommand": true }
]
}
]
}| 字段 | 说明 |
|---|---|
Conditions | 资源树条件定义:Path/Interface/Property/Value,条件全部满足时对应过滤条目才生效 |
CLIFilter[].Conditions | 引用的条件名列表,全部满足则该条目的 Get/Set 生效 |
CLIFilter[].ErrorMessage | 可选;命令被隐藏时向用户打印的错误信息 |
CLIFilter[].Get / .Set | 要隐藏的命令列表(Get 对应 ipmcget,Set 对应 ipmcset) |
命令条目字段:
| 字段 | 说明 |
|---|---|
ParentUri | 命令路径 /cli/v1/<target>,段可用 _ 占位 |
Command | 命令名,或 *(隐藏 ParentUri 下的全部命令,含 ParentUri 本身) |
LocationCommand | true 表示当前命令包含-l(location)场景 |
(条目级)ErrorMessage | 命中隐藏时打印的错误信息,无则不打印 |
参考:示例配置见 example/interface_filter.json;实现位于 src/lualib/interface_filter.lua。
4. 日志说明
4.1 一键日志收集
CLI 通过 ipmcget -d diaginfo 触发一键日志收集,默认生成 /tmp/dump_info.tar.gz,也可通过 -v <path> 指定输出路径。收集内容由诊断信息框架和各组件注册项共同决定。
4.2 关键日志信息
| 日志片段 | 日志级别 | 含义解读 | 建议处理动作 |
|---|---|---|---|
Invalid command type | ERROR | 命令类型未注册或接口配置中的执行类型非法。 | 检查 interface_config 中的 URI 和命令类型。 |
Request failed. | ERROR | 后端资源协作接口返回错误。 | 根据请求 URI 检查后端组件日志和参数。 |
echo profile does not exist | ERROR | 回显模板缺失。 | 检查 interface_config/echoes 下的模板文件。 |
COMMAND NOT SUPPORTED | ERROR | 命令未在受限 Shell 注册或功能未使能。 | 检查 help 输出和产品使能开关。 |
get task failed | ERROR | 命令对应的异步任务查询失败。 | 检查 TaskService 和任务对象状态。 |
5. 问题定界指南
5.1 典型问题定界
快速定位:提示不完整/Usage 异常 → 参数解析层(ipmc.lua);Invalid Command/类型未注册 → 命令执行层;输出格式不符/模板缺失 → 回显层;登录提示符/超时/COMMAND NOT SUPPORTED → 受限 Shell 层(src/clp/)。
典型问题:
| 现象 | 可能原因 | 定位 |
|---|---|---|
Invalid Command | 接口配置缺 URI 或命令类型未注册 | 运行日志搜 Invalid command type |
Request failed. | 后端服务返回错误 | 查后端服务日志 |
COMMAND NOT SUPPORTED | verb 未注册或功能未使能(如 passwd) | 检查 help 输出与 Enabled 开关 |
| 任务命令卡在进度 | 任务对象异常 | 运行日志搜 get task failed |
5.2 最小化复现与证据收集
- 使用
ipmcget --verbose=debug -d <dataitem>或ipmcset --verbose=debug ...开启调试日志并复现问题。 - 核对
interface_config中对应的 URI、参数校验和回显模板。 - 使用
busctl或mdbctl直接访问后端对象,判断问题位于 CLI 层还是后端资源层。 - 保留完整命令、标准输出、错误码、
/var/log/app.log和ipmcget -d diaginfo收集结果。
5.3 调试方法
- 参数提示或 Usage 异常:检查参数解析和命令帮助配置。
Invalid Command或命令类型错误:检查路由映射和命令注册。- 回显格式错误:检查
echoes模板和模板变量。 - 受限 Shell 命令缺失:检查 Release/Debug 构建类型、命令注册和
interface_filter.json。
5.4 错误码速查表
| 错误码 | 名称 | 含义 | 排查建议 |
|---|---|---|---|
241 | FUNCTION_NOT_SUPPORTED | 功能未实现或不支持。 | 检查当前产品是否使能该功能。 |
245 | REQUIRED_OPTION_MISSING | 缺少必选参数。 | 按 help 或 Usage 补齐参数。 |
253 | COMMAND_NOT_RECOGNIZED | 命令无法识别。 | 检查 -t/-d 与接口配置。 |
254 | COMMAND_NOT_SUPPORTED | 命令不支持。 | 检查命令注册和产品过滤条件。 |
255 | COMMAND_ERROR_UNSPECIFIED | 未分类命令错误。 | 收集 CLI 和后端日志进一步定位。 |
0x83 | 用户锁定 | 账号处于锁定状态。 | 检查账号锁定状态和管理策略。 |
0x96 | 初始口令需重置 | 用户必须先修改初始口令。 | 修改口令后重试。 |
6. 常见问题解答
Q1:ipmcget 或 ipmcset 报 Invalid Command,如何处理?
- 问题描述:命令未执行,输出
Invalid Command。 - 一句话答案:命令未命中合法接口配置,或命令执行类型未注册。
- 根因说明:路由映射器响应异常,或
interface_config中缺少对应 URI/命令类型。 - 解决方案:检查
interface_config的 URI、-t/-d参数和命令类型;在运行日志中检索Invalid command type。 - 规避方案:新增命令后先在测试环境执行
help和只读命令验证,再纳入产品配置。 - 适用版本:1.130.13。
Q2:配置命令返回 Request failed.,如何定位?
- 问题描述:命令已被 CLI 接收,但后端返回失败。
- 一句话答案:CLI 已完成后端调用,需要结合请求 URI 检查后端组件。
- 根因说明:后端服务返回非空错误列表,或参数未通过后端校验。
- 解决方案:从调试日志获取请求对象和接口,检查对应微组件日志、权限和参数。
- 规避方案:生产变更前在维护窗口验证参数,并保存原值和回显结果。
- 适用版本:1.130.13。
Q3:一键日志包在哪里?
- 问题描述:需要收集 CLI 和系统诊断信息。
- 一句话答案:执行
ipmcget -d diaginfo,默认生成/tmp/dump_info.tar.gz。 - 根因说明:诊断信息由系统框架统一收集,CLI 通过
diaginfo数据项触发。 - 解决方案:使用
ipmcget -d diaginfo -v <path>指定输出路径,生成后确认文件存在。 - 规避方案:不要在空间不足或业务高峰时执行,避免影响现场维护。
- 适用版本:1.130.13。