SP1R4/CMDR
GitHub: SP1R4/CMDR
CMDR 是一个为 CTF 选手和开发者设计的命令行管理器,支持参数化命令、工作区隔离、链式执行、加密保护和报告生成。
Stars: 0 | Forks: 0
# CMDR v3.1
[](https://github.com/SP1R4/CMDR/actions/workflows/ci.yml)   
**专为 CTF 选手和开发者打造的命令管理器**
通过工作区、主机、环境变量、playbook、输出捕获、发现结果以及可扩展的命令包来存储、组织和运行 shell 命令。
[功能](#features) · [安装说明](#installation) · [快速开始](#quick-start) · [CTF 工作流](#ctf-workflow) · [开发工作流](#dev-workflow) · [命令参考](#command-reference)
## 功能
| 功能 | 描述 |
|---------|-------------|
| **命令管理** | 存储、打标签、搜索、设置别名并即时运行命令 |
| **参数化命令** | `nmap {TARGET} -sV`;支持 `{VAR:=default}` 和 `{VAR:?}` (必填) 形式 |
| **主机/目标模型** | 清单管理主机;`@name` / `--on` / `--all-hosts` 会填充 `{TARGET}` 等 |
| **输出捕获 → 链式执行** | `--capture VAR[:regex]` 将命令的 stdout 传递到环境变量中 |
| **远程执行** | `--on
` 通过 SSH 运行已存储的命令 |
| **发现与报告** | 结构化的发现结果 + Markdown 评估报告 (`--report`) |
| **运行历史** | 记录运行历史;`--history`;使用 `-r last` 重新运行 |
| **加密工作区** | 将工作区在静态下锁定为加密的 blob (age/gpg) |
| **危险标志** | `--danger` 命令在运行前总是会要求确认,即使使用了 `-y` |
| **模糊选择器** | `--pick` (或直接使用 `cmdr`) 通过 fzf 模糊查找命令 |
| **工作区** | 为每个项目或测试任务隔离命令存储 |
| **环境变量** | 设置一次 `TARGET=10.10.10.1`,即可在处处使用 `{TARGET}` |
| **Playbook** | 将命令串联为命名的、可复用的序列 |
| **输出捕获** | 保存带有时间戳的命令输出 (`--save`) |
| **命令包** | 为 CTF 和开发预构建的命令集 |
| **项目级本地命令** | 每个仓库的 `.cmdr.json`,通过 `--local` 使用 (需通过信任验证) |
| **笔记** | 为命令附加带有时间戳的笔记 |
| **剪贴板复制** | 将解析后的命令复制到剪贴板 (`-c`) |
| **Tab 补全** | 支持 Bash 和 Zsh |
| **试运行 / 撤销** | 预览 (`-n`) 和单层撤销 (`-u`) |
## 安装说明
```
git clone https://github.com/SP1R4/CMDR.git
cd CMDR
./install.sh
```
安装程序将会:
- 如果缺失则安装 `jq` (支持 apt, dnf, yum, pacman, brew)
- 设置文件权限
- 提供别名或 `~/.local/bin` 符号链接安装选项
- 启用 Tab 补全
安装完成后:
```
cmdr -h
```
## 快速开始
```
# 添加命令
cmdr -a serve 'python3 -m http.server 8080' dev --desc 'Quick HTTP server'
# 使用 alias 添加
cmdr -a scan 'nmap {TARGET} -sV' security --desc 'Service scan' --alias s
# 设置 env 变量
cmdr --env TARGET=10.10.10.1
# 运行它(TARGET 从 env 自动填充)
cmdr -r scan
# 或直接传递 args
cmdr -r scan 192.168.1.1
# Dry-run 以预览
cmdr -n -r scan
# 复制到剪贴板而不是运行
cmdr -c scan
# 显示所有命令
cmdr -s
# 搜索
cmdr -f nmap
```
## CTF 工作流
```
# 1. 为 engagement 创建一个 workspace
cmdr -w htb-box
# 2. 加载 CTF command packs
cmdr --pack load ctf-network
cmdr --pack load ctf-web
cmdr --pack load ctf-privesc
# 3. 清点 targets(填充 {TARGET}/{OS}/{RUSER}/{RPORT})
cmdr --host add 10.10.10.50 --name box1 --os linux
cmdr --host add 10.10.10.51 --name box2 --os windows --user administrator
cmdr --env LPORT=4444
# 4. 对 host 进行 Recon
cmdr -r quick-scan @box1 --save
cmdr -r dirfuzz @box1 --save
# 5. 串联 auth flow:捕获 token,在下游重用它
cmdr -r login @box1 --capture 'TOKEN:eyJ[A-Za-z0-9._-]+'
cmdr -r list-users @box1 # uses {TOKEN}
# 6. 记录结构化 findings(稍后用于填充报告)
cmdr --finding high box1 "Unauth API at /admin" --evidence outputs/dirfuzz_*.log
cmdr --finding medium box1 "Tomcat 9.0 — CVE candidate"
# 7. 可复用的 recon playbook,然后扇出到每个 host
cmdr --playbook recon quick-scan dirfuzz nikto-scan
cmdr -r quick-scan --all-hosts --save
# 8. 拥有 creds 后远程运行 privesc
cmdr -r linpeas --on box2
# 9. 审查并生成交付物
cmdr --findings
cmdr --history
cmdr --report engagement.md
# 10. 锁定静态的 engagement workspace,切换回默认值
cmdr --lock-workspace htb-box
cmdr -w default
```
## 开发工作流
```
# 1. 全局加载 dev packs(在默认 workspace 中)
cmdr --pack load dev-python
cmdr --pack load dev-docker
cmdr --pack load dev-git
# 2. 添加 project-local 命令
cmdr --local -a build 'make -j$(nproc)' dev --desc 'Build project'
cmdr --local -a test 'python3 -m pytest -v tests/' dev --desc 'Run tests'
cmdr --local -a lint 'flake8 . && mypy .' dev --desc 'Lint check'
# 3. 创建 CI 风格的 chain
cmdr --playbook ci lint test build
# 4. 运行它
cmdr -p ci
# 5. 快速的 git workflow
cmdr -r glog # Pretty git log
cmdr -r git-branch-clean # Clean merged branches
```
## 工作区
工作区用于隔离命令、环境变量、笔记、playbook 和输出。
```
cmdr -w myproject # Switch to workspace
cmdr -w # Show active workspace
cmdr -W # List all workspaces
cmdr -w default # Return to default workspace
```
## 环境变量
针对特定工作区的变量,在运行时自动替换 `{KEY}` 占位符。
```
cmdr --env TARGET=10.10.10.1 # Set
cmdr --env PORT=8080 # Set another
cmdr --env # Show all
cmdr --env-clear PORT # Remove one
```
解析顺序:首先替换环境变量,然后剩余的 `{placeholders}` 将通过位置参数填充或以交互方式提示输入。
## Playbook 与链式执行
```
# 创建命名的 playbook
cmdr --playbook recon quick-scan dirfuzz nikto-scan
# 运行它
cmdr -p recon
# 列出所有 playbooks
cmdr --playbooks
# 一次性 chain(不保存)
cmdr --chain cmd1 cmd2 cmd3
# Dry-run 一个 playbook
cmdr -n -p recon
```
Playbook 和链式执行在首次失败(非零退出)时即停止。
## 命令包
`packs/` 目录下预构建的命令集。
```
cmdr --pack list # See available packs
cmdr --pack load ctf-web # Load a pack
```
| 包 | 命令 | 分类 |
|------|----------|----------|
| `starter` | 实用的系统管理员/网络/开发/安全单行命令 | mixed |
| `ctf-network` | nmap 扫描, enum4linux, netcat, DNS | ctf-recon, ctf-enum, ctf-exploit |
| `ctf-web` | ffuf, gobuster, sqlmap, nikto, wfuzz | ctf-web |
| `ctf-privesc` | SUID, capabilities, cron, sudo, linpeas | ctf-privesc |
| `dev-python` | venv, pytest, flake8, http.server | dev-python |
| `dev-docker` | build, run, compose, prune, exec | dev-docker |
| `dev-git` | log, undo, amend, stash, branch cleanup | dev-git |
## 笔记与输出捕获
```
# 将 finding 附加到命令
cmdr --note scan "Found port 8080, Apache Tomcat 9.0"
# 查看笔记
cmdr --notes scan # For one command
cmdr --notes # All notes
# 保存命令输出
cmdr -r scan --save
# 查看已保存的输出
cmdr --outputs # All
cmdr --outputs scan # Filtered
```
## 项目级本地命令
在任何目录下放置一个 `.cmdr.json`。CMDR 会将其与你的全局/工作区命令合并,以便其标签能从该目录下使用。本地条目具有优先权(深合并:你在本地省略的字段将回退使用相同标签的全局条目)。
```
# 添加到本地文件
cmdr --local -a build 'make -j4' dev
# 显示在 "Project-Local" 部分下
cmdr -s
# 正常运行(优先从本地解析)
cmdr -r build
```
### 信任模型(重要)
`.cmdr.json` 包含 CMDR 将要执行的 shell 命令。为了避免运行
来自你刚 `cd` 进入的目录(例如刚克隆的、不受信任的
仓库)中的命令,**本地文件会被忽略,直到你明确信任它们**:
```
cmdr --trust # approve the current dir's .cmdr.json after reviewing it
cmdr --untrust # revoke trust
```
- 使用 `cmdr --local -a ...` 编写本地文件时会自动对其建立信任。
- 信任是基于文件的**内容哈希**锁定的 —— 如果文件发生改变,信任将被
撤销,直到你重新运行 `cmdr --trust`。在重新信任之前请审查 diff。
- 信任记录会在 `.cmdr_trusted.json` 中全局保存,以绝对路径为键。
## 主机与目标定位
构建针对特定工作区的主机清单,然后针对主机执行命令。选择一个
主机会填充 `{TARGET}`/`{RHOST}` (ip 或 hostname), `{RHOSTNAME}`, `{OS}`,
`{RUSER}`, `{RPORT}`。
```
cmdr --host add 10.10.10.5 --name dc01 --os windows --user admin --port 5985
cmdr --host list
cmdr --host rm dc01
cmdr -r smbscan @dc01 # fill host vars for one host
cmdr -r nmap --all-hosts # run once per defined host
cmdr -r linpeas --on dc01 # execute over SSH (uses user/port from the host)
```
## 输出捕获 → 链式执行
将命令的 stdout 传递到工作区环境变量中,然后在下一条命令中使用它 ——
非常适合用于 token、会话 ID 以及多步骤的渗透利用。
```
cmdr -r login --capture TOKEN # whole (trimmed) stdout -> {TOKEN}
cmdr -r login --capture 'TOKEN:eyJ[A-Za-z0-9._-]+' # first regex match -> {TOKEN}
cmdr -r get-users # command references {TOKEN}
```
## 占位符形式
```
{VAR} env var, else next positional arg, else interactive prompt
{VAR:=default} env var, else next positional arg, else 'default' (no prompt)
{VAR:?} env var, else next positional arg, else hard error (required)
```
## 发现与报告
```
cmdr --finding high dc01 "Unauth WinRM" --evidence outputs/winrm_x.log
cmdr --finding low - "Verbose banner" # '-' = no specific host
cmdr --findings # list, ordered by severity
cmdr --report engagement.md # markdown report (hosts/findings/notes/history)
```
## 运行历史
```
cmdr --history # recent runs (exit codes, host, command)
cmdr --history 50 # last 50
cmdr -r last # re-run the most recent command (alias: cmdr -r !)
```
## 危险命令
标记破坏性命令,使它们总是提示确认 —— 即使在 `-y` 下或
在 playbook 内部。它们在 `cmdr -s` 中会显示红色的 `[!]`。
```
cmdr -a wipe 'rm -rf {DIR}' ops --danger
cmdr -r wipe /data # prompts "Run this command marked dangerous? (y/N)"
```
## 加密工作区
将命名的工作区在静态下加密为单个 blob (使用 `age`,回退使用
`gpg`)。锁定时会移除明文目录,并在解锁时恢复。
```
cmdr -w client-x # work in a named workspace
cmdr --lock-workspace client-x # -> workspaces/client-x.cmdrlock, prompts passphrase
cmdr --unlock-workspace client-x # decrypt and restore
```
## 模糊选择器
```
cmdr --pick # fuzzy-find a command with fzf and run it
cmdr # bare invocation on a TTY also opens the picker (falls back to -m)
```
## 命令参考
### 核心命令
| 标志 | 用法 | 描述 |
|------|-------|-------------|
| `-a` | `cmdr -a [cat] [--desc ..] [--alias ..] [--danger]` | 添加命令 |
| `-e` | `cmdr -e [cmd] [cat] [--desc ..] [--alias ..] [--danger]` | 编辑命令 |
| `-d` | `cmdr -d [-y]` | 删除(带确认) |
| `-s` | `cmdr -s` | 显示所有命令 |
| `-r` | `cmdr -r [args..] [@host] [--save] [--capture VAR] [--on host] [--all-hosts]` | 运行命令 |
| `-f` | `cmdr -f ` | 搜索命令 |
| `-c` | `cmdr -c [args..]` | 复制到剪贴板 |
| `--pick` | `cmdr --pick` | 模糊选择命令 (fzf) |
### 工作区与环境
| 标志 | 用法 | 描述 |
|------|-------|-------------|
| `-w` | `cmdr -w ` | 切换工作区 |
| `-w` | `cmdr -w` | 显示当前工作区 |
| `-W` | `cmdr -W` | 列出所有工作区 |
| `--env` | `cmdr --env KEY=VALUE` | 设置环境变量 |
| `--env` | `cmdr --env` | 显示环境变量 |
| `--env-clear` | `cmdr --env-clear KEY` | 清除环境变量 |
| `--local` | `cmdr --local -a ...` | 使用项目本地的 `.cmdr.json` |
| `--trust` | `cmdr --trust` | 信任当前目录的 `.cmdr.json` |
| `--untrust` | `cmdr --untrust` | 撤销对当前目录 `.cmdr.json` 的信任 |
| `--lock-workspace` | `cmdr --lock-workspace [name]` | 在静态下加密命名工作区 |
| `--unlock-workspace` | `cmdr --unlock-workspace ` | 解锁已锁定的工作区 |
### 主机
| 标志 | 用法 | 描述 |
|------|-------|-------------|
| `--host add` | `cmdr --host add --name [--hostname h] [--os o] [--user u] [--port p]` | 添加/更新主机 |
| `--host list` | `cmdr --host list` | 列出主机 |
| `--host rm` | `cmdr --host rm ` | 移除主机 |
### 发现与历史
| 标志 | 用法 | 描述 |
|------|-------|-------------|
| `--finding` | `cmdr --finding "title" [--evidence path]` | 记录一项发现 |
| `--findings` | `cmdr --findings` | 列出发现 |
| `--report` | `cmdr --report [file]` | 渲染 Markdown 报告 |
| `--history` | `cmdr --history [n]` | 显示最近的运行历史 |
### Playbook 与链式执行
| 标志 | 用法 | 描述 |
|------|-------|-------------|
| `--playbook` | `cmdr --playbook ` | 创建 playbook |
| `-p` | `cmdr -p ` | 运行 playbook |
| `--playbooks` | `cmdr --playbooks` | 列出 playbook |
| `--chain` | `cmdr --chain ` | 按顺序运行命令 |
### 笔记、输出与包
| 标志 | 用法 | 描述 |
|------|-------|-------------|
| `--note` | `cmdr --note "text"` | 添加笔记 |
| `--notes` | `cmdr --notes [tag]` | 显示笔记 |
| `--outputs` | `cmdr --outputs [tag]` | 显示已保存的输出 |
| `--pack` | `cmdr --pack list` | 列出包 |
| `--pack` | `cmdr --pack load ` | 加载包 |
### 通用
| 标志 | 用法 | 描述 |
|------|-------|-------------|
| `-x` | `cmdr -x ` | 将命令导出为 JSON |
| `-l` | `cmdr -l ` | 导出日志 |
| `-i` | `cmdr -i ` | 导入命令 (合并) |
| `-m` | `cmdr -m` | 交互模式 |
| `-u` | `cmdr -u` | 撤销上次更改 |
| `-n` | `cmdr -n` | 试运行模式 |
| `-v` | `cmdr -v` | 调试日志 |
| `-V` | `cmdr -V` | 显示版本 |
| `-h` | `cmdr -h` | 显示帮助 |
## 开发与测试
CMDR 是纯 Bash + `jq`,没有构建步骤。在提交更改之前进行 Lint 和测试:
```
shellcheck -x -S warning cmdr.sh cmdr_functions.sh install.sh tests/run.sh
bash tests/run.sh
```
CI 会在每次推送时运行这两者。请参阅 [CONTRIBUTING](CONTRIBUTING.md) 获取指南,
并参阅 [CHANGELOG.md](CHANGELOG.md) 获取发布说明。
## 许可证
[MIT](LICENSE) © SP1R4标签:PE 加载器, 内存分配, 工作流, 应用安全, 效率工具, 网络调试, 自动化