核心概念

术语全称服务对象交互方式
GUIGraphical User Interface人(普通用户)鼠标、触摸
CLICommand Line Interface人(技术用户)键盘输入命令
APIApplication 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

两者调用的底层逻辑完全相同,差异只在于交互形式。

维度CLIGUI
认知负担需记忆命令语法所见即所得
表达能力精确,可组合管道受控件设计限制
自动化天然支持脚本需额外工具模拟
资源消耗极低较高(渲染引擎)
远程使用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 对开发者生态至关重要。