Skip to content

命令行接口

目的与范围

本文档描述 eCapture 的命令行接口(CLI),包括根命令、全局标志、模块特定的子命令及其相应的配置选项。CLI 基于 Cobra 框架构建,是用户发起捕获操作的主要交互层。

有关 CLI 命令如何转换为模块执行和 eBPF 附加的信息,请参见模块系统与生命周期。有关每个模块使用的配置结构的详细信息,请参见配置系统


CLI 架构概览

eCapture CLI 遵循分层命令结构,包含一个根命令(ecapture)和多个模块特定的子命令。每个子命令对应一个捕获模块,并接受全局标志(从根命令继承)和模块特定标志。

命令层次结构

来源: cli/cmd/tls.go:29-48, cli/cmd/gotls.go:29-40, cli/cmd/gnutls.go:32-45, cli/cmd/nspr.go:30-41, cli/cmd/bash.go:27-33, cli/cmd/zsh.go:30-36, cli/cmd/mysqld.go:30-37, cli/cmd/postgres.go:30-34

入口点流程

来源: main.go:9-11


全局标志

虽然提供的文件中未显示,但在 cli/cmd/root.go 中的根命令(rootCmd)定义了所有子命令继承的全局标志。基于 README 示例和架构,这些标志包括:

标志类型描述
--pidint要捕获的目标进程 ID
--uidint要捕获的目标用户 ID
--hexbool以十六进制格式输出捕获的数据
-l, --logfilestring捕获事件日志文件的路径
--mapsizeinteBPF 映射大小(KB)(默认:5120)

全局标志适用于所有模块,可以与模块特定标志组合使用。

来源: README.md:72-149


模块子命令

TLS/OpenSSL 模块

命令: ecapture tls(别名:openssl

TLS 模块从 OpenSSL/BoringSSL 加密连接捕获明文。它支持三种捕获模式,可以针对所有 OpenSSL 版本 1.0.x、1.1.x 和 3.x。

标志

标志简写类型默认值描述
--libsslstring(自动检测)libssl.so 文件路径
--cgroup_pathstring/sys/fs/cgroup用于进程过滤的 cgroup 路径
-m, --modelstringtext捕获模式:textpcap/pcapngkey/keylog
-k, --keylogfilestringecapture_openssl_key.log保存 TLS 主密钥的路径
-w, --pcapfilestringsave.pcapng以 pcapng 格式保存数据包的路径
-i, --ifnamestring网络接口名称(pcap 模式必需)
--ssl_versionstring(自动检测)OpenSSL/BoringSSL 版本字符串

捕获模式

来源: cli/cmd/tls.go:26-67

使用示例

bash
# Text 模式 - 捕获所有 OpenSSL 流量
sudo ecapture tls

# PCAP 模式 - 使用过滤器保存到文件
sudo ecapture tls -m pcap -i eth0 -w output.pcapng tcp port 443

# Keylog 模式 - 提取主密钥
sudo ecapture tls -m keylog -k keys.log

# 针对特定库版本
sudo ecapture tls --libssl=/lib/x86_64-linux-gnu/libssl.so.3 --ssl_version="openssl 3.0.5"

来源: cli/cmd/tls.go:33-46, README.md:72-149

配置结构

OpensslConfig 结构(user/config/openssl.go)在 cli/cmd/tls.go:26 初始化:

go
var oc = config.NewOpensslConfig()

配置通过 cli/cmd/tls.go:66runModule(module.ModuleNameOpenssl, oc) 传递给 OpenSSL 模块。

PCAP 过滤器支持

TLS 和 GoTLS 模块在 pcap 模式下支持 pcap 过滤器表达式。过滤器作为尾随参数传递:

bash
sudo ecapture tls -m pcap -i eth0 host 192.168.1.1 and tcp port 443

过滤器在 cli/cmd/tls.go:63-65 提取并存储在 oc.PcapFilter 中。

来源: cli/cmd/tls.go:62-67


GoTLS 模块

命令: ecapture gotls(别名:tlsgo

从使用原生 crypto/tls 库的 Go 程序捕获明文。需要指定目标 Go 二进制文件路径。

标志

标志简写类型默认值描述
-e, --elfpathstring(必需)使用 Go 工具链构建的 Go 二进制文件路径
-w, --pcapfilestringecapture_gotls.pcapng以 pcapng 格式保存数据包的路径
-m, --modelstringtext捕获模式:textpcap/pcapngkey/keylog
-k, --keylogfilestringecapture_gotls_key.log保存 TLS 密钥的路径
-i, --ifnamestring网络接口名称(pcap 模式必需)

来源: cli/cmd/gotls.go:26-59

使用示例

bash
# 捕获特定 Go 二进制文件
sudo ecapture gotls --elfpath=/usr/bin/my-go-app

# 带过滤器的 PCAP 模式
sudo ecapture gotls -m pcap -e /usr/bin/my-go-app -i eth0 -w output.pcapng tcp port 8443

# Keylog 模式
sudo ecapture gotls -m keylog -k gotls_keys.log --elfpath=/usr/bin/my-go-app

来源: cli/cmd/gotls.go:34-38, README.md:256-276

配置结构

GoTLSConfig 结构在 cli/cmd/gotls.go:26 初始化,并在 cli/cmd/gotls.go:57 传递给模块。


GnuTLS 模块

命令: ecapture gnutls(别名:gnu

从使用 GnuTLS 库的应用程序(例如 wget)捕获明文。

标志

标志简写类型默认值描述
--gnutlsstring(自动检测)libgnutls.so 文件路径
-m, --modelstringtext捕获模式:textpcap/pcapngkey/keylog
-k, --keylogfilestringecapture_gnutls_key.log保存 TLS 密钥的路径
-w, --pcapfilestringsave.pcapng以 pcapng 格式保存数据包的路径
-i, --ifnamestring网络接口名称
--ssl_versionstring(自动检测)GnuTLS 版本字符串(例如:"3.7.9")

来源: cli/cmd/gnutls.go:29-64

使用示例

bash
# 自动检测 GnuTLS 库
sudo ecapture gnutls

# 指定库路径
sudo ecapture gnutls --gnutls=/lib/x86_64-linux-gnu/libgnutls.so

# 带版本的 Keylog 模式
sudo ecapture gnutls -m keylog -k keys.log --ssl_version="3.7.9"

来源: cli/cmd/gnutls.go:37-43


NSS/NSPR 模块

命令: ecapture nspr(别名:nss

从使用 Mozilla 的 NSS/NSPR 库的应用程序(例如 Firefox)捕获明文。

标志

标志类型默认值描述
--nsprstring(自动检测)libnspr44.so 文件路径

来源: cli/cmd/nspr.go:27-51

使用示例

bash
# 自动检测 NSPR 库
sudo ecapture nspr

# 指定库路径
sudo ecapture nspr --nspr=/lib/x86_64-linux-gnu/libnspr44.so

来源: cli/cmd/nspr.go:35-39


Bash 审计模块

命令: ecapture bash

通过挂钩 readline 库捕获 bash 命令输入/输出,用于安全审计目的。

标志

标志简写类型默认值描述
--bashstring$SHELLbash 二进制文件路径
--readlinesostring(自动检测)readline.so 库路径
-e, --errnumberintmodule.BashErrnoDefault按退出状态过滤命令

来源: cli/cmd/bash.go:24-55

使用示例

bash
# 捕获所有 bash 命令
sudo ecapture bash

# 按特定错误代码过滤
sudo ecapture bash -e 127

# 指定 bash 路径
sudo ecapture bash --bash=/bin/bash

来源: cli/cmd/bash.go:30-32

配置结构

BashConfig 结构在 cli/cmd/bash.go:24 初始化,包含用于按退出状态过滤命令结果的 ErrNo 字段(cli/cmd/bash.go:38)。


Zsh 审计模块

命令: ecapture zsh

捕获 zsh 命令输入/输出以用于安全审计目的,类似于 bash 模块。

标志

标志简写类型默认值描述
--zshstring$SHELLzsh 二进制文件路径
-e, --errnumberintmodule.ZshErrnoDefault按退出状态过滤命令

来源: cli/cmd/zsh.go:27-57

使用示例

bash
# 捕获所有 zsh 命令
sudo ecapture zsh

# 指定 zsh 路径
sudo ecapture zsh --zsh=/bin/zsh

来源: cli/cmd/zsh.go:33-34


MySQL 审计模块

命令: ecapture mysqld

从 MySQL/MariaDB 服务器(版本 5.6、5.7、8.0 和 MariaDB 10.5+)捕获 SQL 查询。

标志

标志简写类型默认值描述
-m, --mysqldstring/usr/sbin/mariadbdmysqld 二进制文件路径
--offsetuint640用于手动挂钩的函数偏移量
-f, --funcnamestring要挂钩的函数名称

来源: cli/cmd/mysqld.go:27-49

使用示例

bash
# 自动检测 MySQL 二进制文件
sudo ecapture mysqld

# 指定 MySQL 路径
sudo ecapture mysqld -m /usr/sbin/mysqld

来源: cli/cmd/mysqld.go:33-35


PostgreSQL 审计模块

命令: ecapture postgres

从 PostgreSQL 服务器(版本 10 及以上)捕获 SQL 查询。

标志

标志简写类型默认值描述
-m, --postgresstring/usr/bin/postgrespostgres 二进制文件路径
-f, --funcnamestring要挂钩的函数名称

来源: cli/cmd/postgres.go:27-45

使用示例

bash
# 自动检测 PostgreSQL 二进制文件
sudo ecapture postgres

# 指定 PostgreSQL 路径
sudo ecapture postgres -m /usr/bin/postgres

来源: cli/cmd/postgres.go:32-33


常见模式与约定

捕获模式模式

几个模块(TLS、GoTLS、GnuTLS)共享一个通用的 -m, --model 标志模式,具有三个标准值:

模式目的
Texttext直接明文输出到控制台/文件
PCAPpcappcapng以 PCAP-NG 格式保存数据包
Keylogkeykeylog提取并保存 TLS 主密钥

来源: cli/cmd/tls.go:53, cli/cmd/gotls.go:45, cli/cmd/gnutls.go:50

库路径检测

所有与 TLS 相关的模块都支持自动库检测,但允许手动覆盖:

命令执行流程

来源: cli/cmd/tls.go:62-67, cli/cmd/gotls.go:52-58

配置结构到模块映射

每个子命令维护一个包级配置变量并将其传递给 runModule()

子命令配置变量模块名称来源
tlsocOpensslConfigModuleNameOpensslcli/cmd/tls.go:26,66
gotlsgocGoTLSConfigModuleNameGotlscli/cmd/gotls.go:26,57
gnutlsgcGnutlsConfigModuleNameGnutlscli/cmd/gnutls.go:29,63
nsprncNsprConfigModuleNameNsprcli/cmd/nspr.go:27,50
bashbcBashConfigModuleNameBashcli/cmd/bash.go:24,54
zshzcZshConfigModuleNameZshcli/cmd/zsh.go:27,56
mysqldmycMysqldConfigModuleNameMysqldcli/cmd/mysqld.go:27,48
postgrespgcPostgresConfigModuleNamePostgrescli/cmd/postgres.go:27,44

命令到代码实体映射

下图显示了 CLI 命令如何映射到代码库中的具体 Go 类型和函数:

来源: cli/cmd/tls.go:62-67, cli/cmd/gotls.go:52-58, cli/cmd/bash.go:53-55


平台特定行为

某些模块根据构建标签进行条件编译:

Android GKI 排除项

从 Android GKI 构建中排除的模块(//go:build !androidgki):

由于平台限制或缺少库依赖项,在为 Android 环境构建时这些模块不可用。

来源: cli/cmd/gnutls.go:1-2, cli/cmd/mysqld.go:1-2, cli/cmd/postgres.go:1-2, cli/cmd/nspr.go:1-2, cli/cmd/zsh.go:1-2


汇总表:所有子命令

命令别名目标主要标志输出模式
tlsopensslOpenSSL/BoringSSL--libssl-m-itext、pcap、keylog
gotlstlsgoGo crypto/tls--elfpath-m-itext、pcap、keylog
gnutlsgnuGnuTLS--gnutls-m-itext、pcap、keylog
nsprnssNSS/NSPR--nsprtext
bashBash shell--bash-etext
zshZsh shell--zsh-etext
mysqldMySQL/MariaDB-m--offsettext
postgresPostgreSQL-m-ftext

来源: 所有 cli/cmd/*.go 文件

命令行接口 has loaded