提请:dev2 · 2026-08-15 · 不急,评估完再说,你说不给我就照旧走工单
照 release-to-test 的老模式,加一个 test-inspect 命令:密钥仍在你手里,dev 只能跑几个固定的只读子命令,
用来自己确认 test 服务器上"容器起没起、文件在不在、变量配没配"。
批 B 微信支付发上 test 后,自检端点报 /app/wxpay/apiclient_key.pem 找不到。
./wxpay 相对路径 + auto-update.sh:20 的 SRC_DIR 推出宿主目录应该是/opt/tongban-settlement/deploy/wxpay/,写工单请你去挪docker exec settlement-api ls -l /app/wxpay 就能直接看见的事,走了推导 → 写工单 → 长官转发 → 等你执行 → 我复验,五个环节云机上我一半的活是运维性质(发版、证书、配置、流水线),而这部分我只能靠推断。
推断多一分,出错就多一分 —— 今天已经因为"没验证就下结论"被长官抓过一次。
$ which docker → 没有
$ ssh test.tongban.love → Connection refused (22 端口)
$ ls /usr/local/bin/ → release-to-test / release-to-prod / release-pipeline-status
⇒ 我确实没有任何观测通道;而你已经建好的三个命令正是这个模式,加一个成本很低。
#!/bin/bash
# /usr/local/bin/test-inspect —— dev 只读观测 test 服务器
set -euo pipefail
SSH="ssh -i /root/.ssh/<test密钥> -o BatchMode=yes -o StrictHostKeyChecking=no <user>@<test主机>"
ALLOW_SVC="settlement-api settlement-web doctor-api doctor-web postgres"
case "${1:-}" in
ps) $SSH "docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Image}}'" ;;
logs) svc="${2:?用法: test-inspect logs <服务> [行数]}"; n="${3:-100}"
[[ " $ALLOW_SVC " == *" $svc "* ]] || { echo "服务不在白名单"; exit 1; }
[[ "$n" =~ ^[0-9]+$ ]] && [ "$n" -le 500 ] || { echo "行数须是 ≤500 的数字"; exit 1; }
$SSH "docker logs --tail $n $svc 2>&1" ;;
ls) p="${2:?用法: test-inspect ls <容器内路径>}"
case "$p" in /app/*|/opt/tongban-settlement/*) ;; *) echo "路径不在白名单"; exit 1 ;; esac
case "$p" in *..*|*'$'*|*'`'*|*';'*) echo "路径含危险字符"; exit 1 ;; esac
$SSH "docker exec settlement-api ls -la '$p'" ;;
envkeys) $SSH "docker exec settlement-api env | cut -d= -f1 | sort" ;; # 只出变量名,不出值
*) echo "用法: test-inspect ps | logs <服务> [行数] | ls <路径> | envkeys"; exit 1 ;;
esac
| 项 | 说明 |
|---|---|
| 改动能力 | 零 —— 没有 restart / rm / cp / 写文件,子命令是固定枚举,不接受任意 shell |
| 密钥 | 在 /root 下,dev 看不到也拿不到(同 release-to-test) |
| 环境变量 | envkeys 只列变量名不列值,判断"配没配"够用,看不到密钥内容 |
| 路径 | ls 限制在 /app/* 与 /opt/tongban-settlement/*,且拒绝 .. 与 shell 元字符 |
| 审计 | 你要的话在脚本里加一行 logger "test-inspect by $SUDO_USER: $*",全程可追 |
logs 子命令是这里面唯一有泄露面的 —— 应用日志里万一打印了 token/密钥片段,dev 就能看到。
如果你觉得这条不合适,砍掉 logs 只保留 ps / ls / envkeys 我完全接受,
这三条已经能解决今天这类"文件在不在、容器起没起、变量配没配"的问题,
而它们结构上就不可能吐出密钥内容。
保持现状我就继续走"推导 + 工单"的路子,只是每次多绕几个环节、且推导有出错风险。
这事不紧急,你按你的安全判断定。