odboy b4590bbffd feat: 新增 svc.list/log.list 命令
svc.list 列出所有服务(systemctl/launchctl/sc)
log.list 列出可用日志来源(journalctl/日志目录/wevtutil)
2026-11-03 21:12:47 +08:00
2026-11-01 08:55:54 +08:00
2026-11-03 20:15:27 +08:00
2026-11-03 20:15:27 +08:00

kopsc

跨平台命令助手。用一条平台无关的意图命令,在受支持的平台上执行对应的底层命令:

$ kopsc docker clearsafe --dry-run
[dry-run] 未执行任何命令
将执行: docker system prune -f
平台:   linux/amd64, distro=centos, runtimes=docker
方式:   直接执行
命中:   变体 #1(2 分)Linux 上的 Docker 运行时
依据:   匹配 os=linux, runtime=docker (+2)

在 Linux 上它执行 docker system prune -f,macOS / Windows 上使用 Docker Desktop 的同一命令。 你只记住一个意图,kopsc 负责挑出当前平台可用的那条命令。

构建

本机构建:

go build -o bin/kopsc ./cmd/kopsc

跨平台编译脚本

scripts/build 是纯 Go 编写的构建脚本,用 go run 运行,不依赖 make / bash,在 Windows、macOS、Linux 上行为一致:

go run ./scripts/build                       # 默认编译全部 6 个目标到 dist/
go run ./scripts/build -host                 # 只编译当前 OS/ARCH
go run ./scripts/build -targets linux/amd64,windows/arm64
go run ./scripts/build -version 1.2.3        # 指定版本(默认 git describe --tags --always --dirty)
go run ./scripts/build -out bin -no-strip    # 自定义输出目录、保留符号表

默认目标矩阵:linux/{amd64,arm64}、darwin/{amd64,arm64}、windows/{amd64,arm64}。 脚本统一设置 CGO_ENABLED=0(纯 Go 静态产物)与 -trimpath,产物命名为 kopsc-<version>-<os>-<arch>[.exe],任一目标失败即以非零码退出。

等价的单条命令写法:

GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -trimpath \
  -ldflags "-s -w -X main.version=1.0.0" -o dist/kopsc-linux-amd64 ./cmd/kopsc

用法

kopsc docker ps                   # 列出运行中的容器
kopsc docker ps --filter name=web # 过滤:只看名字含 web 的容器
kopsc docker psall                # 含已停止的容器
kopsc docker images               # 列出本地镜像(不知道有什么镜像时先看这个)
kopsc docker inspect web          # 查看容器完整配置(JSON)
kopsc docker pull nginx:1.25      # 拉取镜像
kopsc docker tag web myorg/web:1.0  # 给镜像打一个可读的标签
kopsc docker cp web:/etc/nginx nginx.bak   # 把容器内目录复制到主机
kopsc docker logs -f web          # 查看日志(容器名必填,选项可透传)
kopsc docker exec web sh          # 进入容器(默认就是交互模式,无需 -it)
kopsc docker compose up           # 启动 Compose 服务
kopsc docker clearsafe            # 日常清理:停掉的容器、未用网络、悬空镜像(推荐)
kopsc docker pruneimages          # 只清悬空镜像
kopsc docker prunecontainers      # 只清已停止的容器
kopsc docker clearall --yes       # 深度清理(破坏性命令,必须显式 --yes)
kopsc docker save alpine:3.20     # 自动保存为 alpine_3.20.tar(传镜像 ID 会先解析出名称)
kopsc docker load alpine_3.20.tar # 等价 docker load < alpine_3.20.tar

kopsc docker clearsafe            # 直接执行当前平台对应的清理命令
kopsc docker clearsafe --dry-run  # 只打印将执行的命令与判定依据
kopsc docker clearsafe -h         # 该意图的说明、当前平台命中结果与选项
kopsc docker clearsafe -- --filter until=24h   # -- 之后的参数原样透传给底层命令

kopsc pkg refreshindex             # 刷新包管理器索引(dnf/apt/apk/brew/winget,按平台自动选)

kopsc diagnose web                 # 自动识别 Docker 容器或 K8s Pod,给出根因
kopsc diagnose api-0 -n prod       # K8s:本命令里 -n 表示 namespace
kopsc diagnose api-0 --kind k8s --context staging
kopsc diagnose web --lines 200 --no-events
# 目标名写错时不用自己查:kopsc 会提示「你可能要找的是: web-1, web-2」

kopsc net pids 8080                  # 等价 lsof -ti:8080,输出占用端口的 PID
kopsc net ports                      # 列出监听中的端口(统一表格,--raw 看原始输出)

kopsc disk usage                     # 当前目录的占用排行(路径可省略)
kopsc disk usage /var --depth 2      # 下钻一层(du -x --max-depth=2 -h | sort -hr 的跨平台版)
kopsc disk usage --path /var         # 同上,用命名参数指定路径
kopsc disk usage /var --dry-run      # 预览(内置命令同样支持)
kopsc proc nohup ./server            # 后台运行命令,输出写日志(等价 nohup ./server > server.out 2>&1 &)
kopsc proc wait nginx                # 每秒检查一次,等 nginx 退出后再继续
kopsc proc wait java app.jar --timeout 60   # 多个关键字逻辑与;最多等 60 秒

kopsc java run app.jar                     # 按 JDK 版本自动套调优参数并运行
kopsc java run app.jar -- --spring.profiles.active=prod
kopsc java run --jdk 17 --print-flags app.jar   # 只看最终 java 命令行

kopsc git retime 2026-10-01 2026-10-15           # 预览:把该范围提交时间改到 21:00-23:00
kopsc git retime 2026-10-01 2026-10-15 --yes     # 确认后改写并强推(会改写历史!)
kopsc git retime 2026-10-01 2026-10-15 --start-date 2026-11-01 --end-date 2026-11-15   # 重排到该区间

kopsc list                        # 全部命令及当前平台可用性
kopsc explain docker.clearsafe    # 匹配过程、全部候选及各自被选中/拒绝的原因
kopsc explain docker clearsafe    # 同上,空格写法也支持
kopsc explain net                 # 只看分组:列出该组每条命令在本平台的匹配结果
kopsc platform                    # 探测到的 OS/ARCH/发行版/运行时
kopsc version                     # 版本与平台

选项解析规则

叶子命令禁用了 cobra 的 flag 解析,自行处理:

参数 行为
-n, --dry-run, --dry-run=true 置为预览模式,不执行。例外:kopsc diagnose 中 -n 表示 namespace,预览请用 --dry-run
--dry-run=false 关闭预览模式
-y, --yes 确认执行破坏性命令;未提供时只打印影响范围并以退出码 2 结束
-h, --help 打印该命令的帮助
-- 其后的所有参数原样透传给底层命令(并全部计入位置参数)
其它任何参数 原样透传给底层命令(包括未知 flag)

例外(这些命令会对参数做额外解析,写错会报错而不是透传):

命令 例外
docker exec 容器名之后的参数一律作为容器内命令;显式写 -i/-t/-it 会报错(已默认交互)
docker rm / docker rmi 不接受 -f/--force,强删请用 --yes
docker logs --since/--grep/--save 是 kopsc 选项,须写在容器名之前
docker save / docker rmi 目标除了名称,还接受 ID、sha256:ID 或唯一 ID 前缀
proc nohup kopsc 选项(-o/-C/-E/-q/-w)须写在要运行的命令之前
disk usage --path/--depth 为 kopsc 选项,不是 du 的参数

因此底层命令的 flag 不会与 kopsc 自身的选项冲突。

需要容器名/镜像名的命令会做必填校验(例如 kopsc docker logs 缺容器名时直接报错, 并给出 kopsc docker logs <容器> 的用法),避免把参数错误留给底层命令才发现。

命令一览

kopsc 的命令按用途分组,每组的完整说明(命令表、选项、示例)在单独的文档里:

分组 用途 文档
docker 容器与镜像:查看、启停、日志、清理、导出/导入、Compose README.docker.md
net 网络与端口:端口被谁占用、监听端口、ping、DNS、路由追踪、HTTP 诊断、网卡信息、连接统计、网速测试 README.net.md
disk 磁盘与文件占用:哪个目录、哪个文件最占空间 README.disk.md
diagnose 容器 / Pod 状态根因诊断(自动识别 Docker 与 K8s) README.diagnose.md
proc 本机进程:后台运行、等待退出、按资源排序、按名称终止、进程树 README.proc.md
java Java 应用:按 JDK 版本套用调优参数并运行 jar README.java.md
git Git 历史:按日期范围调整提交时间并强推 README.git.md
pkg 系统软件包:刷新包管理器索引 README.pkg.md
user 用户管理:授予或移除用户的 root/sudo 权限、查看用户信息 README.user.md
file 文件查找:按大小、修改时间、名称查找文件、查找空文件/空目录 README.file.md
svc 服务管理:查看状态、启用/禁用、查看日志 README.svc.md
archive 压缩文件:自动识别格式并解压 README.archive.md
sys 系统信息:OS、运行时间、CPU、内存、磁盘一览 README.sys.md
log 系统日志:搜索关键字、查看最近日志 README.log.md
fw 防火墙:查看状态、开放/关闭端口 README.fw.md

辅助命令(不涉及具体资源,直接用即可):

命令 用法
kopsc list 列出全部命令及在当前平台实际会执行什么
kopsc explain <命令> 解释为什么选中某条底层命令,列出全部候选与被排除的原因;支持 docker.clearsafe 与 docker clearsafe 两种写法,也支持分组名(kopsc explain docker)
kopsc platform 显示探测到的 OS/ARCH/发行版/运行时
kopsc version kopsc 自身版本与平台
kopsc completion <shell> 生成 shell 补全脚本(bash/zsh/fish/powershell),详见 README.completion.md
kopsc <命令> -h 任意命令的说明、当前平台命中结果与选项

各模块入口速查

想要 命令
看容器/镜像 kopsc docker psall、kopsc docker images、kopsc docker logs -f web
进容器 / 跑命令 kopsc docker exec web sh
清理磁盘 kopsc docker df → kopsc docker clearsafe
搬镜像 kopsc docker save alpine:3.20 / kopsc docker load alpine_3.20.tar
查端口 kopsc net pids 8080、kopsc net ports
查磁盘占用 kopsc disk usage、kopsc disk usage /var --depth 2
排障 kopsc diagnose web
后台跑服务 kopsc proc nohup ./server
等进程退出 kopsc proc wait nginx、kopsc proc wait --pid 1234 --timeout 30
看进程资源排行 kopsc proc topmem、kopsc proc topcpu
按名字杀进程 kopsc proc killname nginx --yes
跑 Java 应用 kopsc java run app.jar、kopsc java run --jdk 17 --print-flags app.jar
调整提交时间 kopsc git retime 2026-10-01 2026-10-15(加 --yes 才执行)
刷新软件源 kopsc pkg refreshindex
授予用户 root 权限 kopsc user grant alice --yes
移除用户 root 权限 kopsc user revoke alice --yes
找大文件 kopsc file findbig /var --threshold 500M
找最近修改的文件 kopsc file findrecent /home --days 3
按名字找文件 kopsc file findname "*.log" /var
看服务状态 kopsc svc status nginx
启用/禁用服务 kopsc svc enable nginx --yes / kopsc svc disable nginx --yes
看服务日志 kopsc svc logs nginx -f
解压文件 kopsc archive extract app.tar.gz
看系统信息 kopsc sysinfo
测试连通性 kopsc net ping example.com
路由追踪 kopsc net trace example.com
DNS 查询 kopsc net dns example.com -t MX
HTTP 诊断 kopsc net curl https://example.com -L
搜索系统日志 kopsc log search "error" --since 1h
看最近日志 kopsc log last 100
看防火墙状态 kopsc fw status
开放/关闭端口 kopsc fw allow 8080/tcp --yes / kopsc fw deny 8080/tcp --yes
看网卡和 IP kopsc net iface
看 TCP 连接统计 kopsc net conn
测网速 kopsc net speed
看进程树 kopsc proc tree
找空文件/空目录 kopsc file empty /var
看用户信息 kopsc user info

平台识别

kopsc platform 展示探测结果,来源:

  • OS/ARCH:编译目标 runtime.GOOS / runtime.GOARCH
  • Linux 发行版:/etc/os-release 的 ID 与 ID_LIKE(文件缺失时视为未知,不报错)
  • 容器运行时:exec.LookPath 探测 docker

匹配规则

每个命令由若干变体组成,变体声明它适用的环境约束(OS、Arch、Distro、 DistroLike、Runtime,留空表示不限制)。

  1. 变体声明的每一个约束都必须满足,否则该变体被排除。
  2. 满足的变体按特异性打分:Distro 精确命中 +3,ID_LIKE 命中 +2,Runtime 命中 +2,无约束的通用变体 0 分。
  3. 取最高分。并列时先按运行时偏好(有运行时约束者优先,且 docker 在前),再按声明约束的数量(更具体者优先)。
  4. 仍并列则报歧义错误;无任何变体匹配则报无匹配错误,并提示 kopsc explain <命令>。
  5. 取 --dry-run 或 explain 可看到每个候选的得分与被拒原因。

例如 CentOS 上执行 kopsc explain docker.clearsafe:

✓ #0 2 分  匹配 os=linux, runtime=docker (+2) -> docker system prune -f
✗ #1 0 分  os=darwin 不匹配(当前 linux)      -> docker system prune -f
✗ #2 0 分  os=windows 不匹配(当前 linux)     -> docker system prune -f

新增命令或平台变体

内置映射位于 internal/registry/builtin.go(纯 Go 注册表,无外部配置文件)。 新增一个变体即向对应 Command.Variants 追加一项:

{
    Match: Match{OS: "linux", Distro: "rocky", Runtime: "docker"},
    Argv:  []string{"docker", "system", "prune", "-f"},
    Note:  "Rocky Linux 上的 Docker",
},
  • Argv[0] 是程序,其余是参数;需要 shell 语义时设 Shell: true(Linux/macOS 用 sh -c,Windows 用 cmd /c)。
  • 当平台没有可移植的系统命令时,用 Builtin 代替 Argv(二者互斥): Builtin: "disk.usage" 指向 internal/executor 中注册的实现, 这样三平台共用同一份逻辑。新增内置动作需在 executor.builtins 中注册。
  • 新增命令时给 Command 填 ID(点号分隔,决定 CLI 层级)、Summary、Action,别名不得重复。
  • 提交前跑 go test ./...:registry.Validate() 与快照测试会拦截重复 ID/别名、空变体、空 argv。

文档要写在哪

文档按命令分组拆分,新增命令时按分组补充:

分组 文档
docker README.docker.md
net README.net.md
disk README.disk.md
diagnose README.diagnose.md
proc README.proc.md
pkg README.pkg.md
java README.java.md
git README.git.md
user README.user.md
file README.file.md
svc README.svc.md
archive README.archive.md
sys README.sys.md
log README.log.md
fw README.fw.md
completion README.completion.md

新分组需要新建 README.<分组>.md,并在本文件「命令一览」的表格里加一行链接。 每条命令至少要写清:作用、实际执行什么、示例;有独有选项时补选项表。

许可证

本项目基于 Apache License 2.0 发布。

Copyright 2026 Odboy

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

开发

gofmt -l .        # 应无输出
go vet ./...
go test ./...

包结构:

cmd/kopsc            入口,注入版本号
internal/platform    环境探测(可注入,便于测试)
internal/registry    命令模型、校验、内置注册表
internal/resolve     变体打分与选择
internal/executor    进程执行、内置动作、dry-run、退出码透传
internal/diagnose    Docker 与 Kubernetes 的状态根因诊断(内置动作)
internal/cli         cobra 命令树与辅助命令
scripts/build        跨平台构建脚本(go run ./scripts/build)
S
Description
linux命令助手,记忆解放
Readme Apache-2.0
774 KiB
Languages
Go 100%