核心概念
| 术语 | 全称 | 服务对象 | 交互方式 |
|---|---|---|---|
| GUI | Graphical User Interface | 人(普通用户) | 鼠标、触摸 |
| CLI | Command Line Interface | 人(技术用户) | 键盘输入命令 |
| API | Application Programming Interface | 程序(机器) | 函数调用 / HTTP 请求 |
三者关系
三者本质上都是接口,区别只在于服务的对象不同。正常的软件架构中,API 是地基,CLI 和 GUI 建立在它之上。
graph TD
Core[核心逻辑]
API[API 层(内部接口封装)]
CLI[CLI]
GUI[GUI]
ExtAPI[对外公开 API]
Human1[技术用户]
Human2[普通用户]
Program[第三方程序]
Core --> API
API --> CLI
API --> GUI
API --> ExtAPI
CLI --> Human1
GUI --> Human2
ExtAPI --> Program
API 是核心逻辑的”正式合同”,CLI 和 GUI 是这份合同的两种使用方式,对外公开的 API 是把合同开放给其他程序。
CLI vs GUI
两者调用的底层逻辑完全相同,差异只在于交互形式。
| 维度 | CLI | GUI |
|---|---|---|
| 认知负担 | 需记忆命令语法 | 所见即所得 |
| 表达能力 | 精确,可组合管道 | 受控件设计限制 |
| 自动化 | 天然支持脚本 | 需额外工具模拟 |
| 资源消耗 | 极低 | 较高(渲染引擎) |
| 远程使用 | SSH 低带宽即可 | 需远程桌面协议 |
适用场景
- CLI:服务器运维、批量处理、自动化脚本
- GUI:图像/视频编辑、普通用户日常操作
操作系统层面的例子
终端和文件管理器是操作系统 CLI/GUI 的典型对应:
| 终端命令 | 文件管理器操作 | 底层系统调用 |
|---|---|---|
ls | 打开文件夹 | 读取目录 |
cp | 拖拽复制 | 复制文件 |
rm | 删除键 | 删除文件 |
mkdir | 右键新建文件夹 | 创建目录 |
两条路最终调用同一个内核函数。
终端操作第三方软件的边界
终端(Shell)的权力边界是操作系统赋予的权力,只能直接控制文件系统、进程、网络、系统资源。第三方软件的内部逻辑对终端是黑盒。
graph LR
Terminal[终端]
A[有 CLI / 命令行参数\ne.g. git, ffmpeg]
B[暴露公开 API]
C[什么都没暴露]
Terminal -->|可直接控制| A
Terminal -->|curl 等工具调用| B
Terminal -->|只能绕\n kill进程/看内存| C
未被 API 封装的功能:第三方如何”绕”
当软件没有开放某功能时,第三方只能通过非官方手段访问:
| 方式 | 原理 | 典型风险 |
|---|---|---|
| 读写数据文件 | 直接操作软件的本地存储 | 软件更新改格式即失效 |
| 模拟 GUI 操作 | 模拟鼠标/键盘(Selenium、PyAutoGUI) | 界面变化即失效 |
| Hook 内部函数 | 运行时注入拦截(Frida、DLL注入) | 违反用户协议,不稳定 |
| 逆向网络请求 | 抓包模拟未公开的内部 API | 协议加密或变更即失效 |
这些方式的共同弱点:软件一更新,随时可能失效。这也是为什么开放 API 对开发者生态至关重要。