👤 运维需求
CmdCode-Solo 生产端的所有文件需要同步到开源 source/ 目录,脱敏后发布。
🤖 Hermes Agent

生产端文件全景

CmdCode-Solo 项目共有 7 个核心文件,分布在服务器和本机两个位置:

一、服务器端(HK 站)

#文件实际地址大小需脱敏
1ui.html/www/ui.html86,910 B
2proxy.php/www/cmdcode-minimax-toolset/proxy.php67,813 B✅ ACCESS_TOKEN / MySQL / IP / 口令
3config.enc.php/www/cmdcode-minimax-toolset/config.enc.php2,599 B✅ ENC_PASSPHRASE / 加密密钥
4.htaccess/www/cmdcode-minimax-toolset/.htaccess351 B❌ 纯规则

二、本机脚本

#文件实际地址大小需脱敏
5long-task-cron-worker.sh/root/scripts/long-task-cron-worker.sh11,351 B✅ TOKEN
6cron.d-long-task-worker/etc/cron.d/long-task-worker411 B
7long-task-worker-check.sh/root/.hermes/scripts/long-task-worker-check.sh1,705 B

核心架构

┌─ 生产端(含真实 token)────────────────────────┐ │ │ │ /www/ui.html ← HTTP 公开访问 │ │ /www/cmdcode-minimax-toolset/proxy.php ← 前端调用 │ │ /www/cmdcode-minimax-toolset/config.enc.php │ │ /www/cmdcode-minimax-toolset/.htaccess │ │ /root/scripts/long-task-cron-worker.sh │ │ /etc/cron.d/long-task-worker │ │ /root/.hermes/scripts/long-task-worker-check.sh │ │ │ └──────────────────┬───────────────────────────────┘ │ ① 下载 ▼ ┌─ 脱敏管道 ──────────────────────────────────────┐ │ sed 替换 ACCESS_TOKEN / MySQL / IP / 口令 │ │ → __YOUR_PROXY_ACCESS_TOKEN__ 等占位符 │ │ grep -c 验证原始值清零 │ │ 归一化 diff 验证代码一致性 │ └──────────────────┬───────────────────────────────┘ │ ② 上传 ▼ ┌─ 开源 source/ 目录(仅占位符)──────────────────┐ │ │ │ /www/source/ui.html 86,910 B │ │ /www/source/proxy.php 67,734 B │ │ /www/source/config.enc.php 1,966 B │ │ /www/source/htaccess-example 351 B │ │ /www/source/long-task-cron-worker 11,351 B │ │ /www/source/cron.d-long-task-worker 411 B │ │ /www/source/long-task-worker-check 1,705 B │ │ /www/source/index.html(元数据) │ └──────────────────────────────────────────────────┘

HK 站 proxy.php 三路径架构

/www/source/proxy.php唯一开源脱敏版__YOUR_PROXY_ACCESS_TOKEN__/www/proxy.php生产版(根目录镜像,真实 token) /www/cmdcode-minimax-toolset/proxy.php生产版(前端实际调用,真实 token)

关键原则:脱敏版只上传到 /www/source/proxy.php绝不上传到 /www/proxy.php(那是生产版)。

完整同步流程

Step 1:获取生产文件

mkdir -p /tmp/cmdcode-sync

# 服务器文件(FTP)
lftp -u host0012314959,Xusu8800033 host0012314959.xincache1.cn \
  -e "set xfer:clobber on; \
  get /www/cmdcode-minimax-toolset/proxy.php -o /tmp/cmdcode-sync/proxy.php; \
  get /www/cmdcode-minimax-toolset/config.enc.php -o /tmp/cmdcode-sync/config.enc.php; \
  get /www/cmdcode-minimax-toolset/.htaccess -o /tmp/cmdcode-sync/.htaccess; quit"

# ui.html(HTTP 直下)
curl -sL -o /tmp/cmdcode-sync/ui.html 'https://cmdcode.cn/ui.html'

# 本机脚本
cp /root/scripts/long-task-cron-worker.sh /tmp/cmdcode-sync/
cp /etc/cron.d/long-task-worker /tmp/cmdcode-sync/
cp /root/.hermes/scripts/long-task-worker-check.sh /tmp/cmdcode-sync/

Step 2:扫描并脱敏

# proxy.php:替换 7 类敏感信息
sed -i "s|mysql:host=真实值;dbname=真实值|mysql:host=__YOUR_MYSQL_HOST__;dbname=__YOUR_MYSQL_DB__|g"
sed -i "s|'真实MySQL用户'|'__YOUR_MYSQL_USER__'|g"
sed -i "s|'真实MySQL密码'|'__YOUR_MYSQL_PASS__'|g"
sed -i "s|define('ACCESS_TOKEN', '真实值')|define('ACCESS_TOKEN', '__YOUR_PROXY_ACCESS_TOKEN__')|g"
sed -i "s|echo json_encode(['token' => '真实值'])|echo json_encode(['token' => '__YOUR_PROXY_TOKEN__'])|g"
sed -i "s|'加密口令'|'__YOUR_ENCRYPTION_PASSPHRASE__'|g"
sed -i "s|\['真实IP', '127.0.0.1'\]|['__YOUR_ALLOWED_IP__']|g"

# config.enc.php:替换 PASSPHRASE + 加密密钥
sed -i "s|'真实PASSPHRASE'|'__YOUR_RANDOM_SECRET_HERE__'|g"
sed -i "s|decrypt_key('...')|decrypt_key('__YOUR_ENCRYPTED_KEY_HERE__')|g"

# long-task-cron-worker.sh:替换 TOKEN
sed -i "s|TOKEN=\"真实值\"|TOKEN=\"__YOUR_PROXY_ACCESS_TOKEN__\"|g"

Step 3:验证脱敏完整性

# 原始值必须清零
for val in 'token片段' '密码' 'IP'; do
  grep -c "$val" sanitized.php || echo "OK"
done

# 占位符必须存在
grep -c '__YOUR_' proxy_sanitized.php  # 应为 12
grep -c '__YOUR_' config_sanitized.php  # 应为 5

Step 4:归一化 diff 验证

# 占位符→真实值反替换
cp proxy_sanitized.php normalized.php
sed -i 's|__YOUR_PROXY_ACCESS_TOKEN__|真实值|g' ...

# diff 必须为 0
diff normalized.php proxy.php
echo "exit: $? (0=代码一致)"

Step 5:上传到两站 source/ 目录

# HK 站
echo "open host0012314959.xincache1.cn
user host0012314959 Xusu8800033
set net:timeout 90
set ftp:passive-mode on
set xfer:clobber on
cd /www/source
put ui.html -o ui.html
put proxy_sanitized.php -o proxy.php
put config_sanitized.php -o config.enc.php
put .htaccess -o htaccess-example
put cron_worker_sanitized.sh -o long-task-cron-worker.sh
put cron_d_sanitized -o cron.d-long-task-worker
put check_worker_sanitized.sh -o long-task-worker-check.sh
bye" | lftp

# 全球站(加 GBK charset)
echo "open host9309191354.xincache1.cn
user host9309191354 Xusu8800033
set ftp:charset GBK
...(同上)
bye" | lftp

Step 6:更新 source/index.html 元数据

# 获取文件新大小
for f in ui.html proxy_sanitized.php config_sanitized.php ...; do
  echo "$f: $(wc -c < /tmp/cmdcode-sync/$f) bytes"
done

# patch 修改 meta 行后上传两站

Step 7:验证

# 两站 7 个文件大小一致
# 生产版仍正常运行
curl -sL -X POST 'https://cmdcode.cn/cmdcode-minimax-toolset/...?\
  _action=get_proxy_token'
# → {"token": "a6f167...00bd"}

# source/index.html 元数据显示
curl -sL 'https://cmdcode.cn/source/' | grep -oP '\d+,\d+ bytes'

预期文件大小对照表

source/ 文件名脱敏后大小说明
ui.html86,910 B不变,无敏感信息
proxy.php67,734 B脱敏后略小于生产版
config.enc.php1,966 B脱敏后大幅缩小
htaccess-example351 B不变
long-task-cron-worker.sh11,351 B脱敏后变小
cron.d-long-task-worker411 B不变
long-task-worker-check.sh1,705 B不变

常见陷阱

  • lftp xfer:clobber 默认为 off — 不加会静默跳过下载!
  • 全球站 Windows IIS — 不支持多文件 ls,每个文件单独查;需 set ftp:charset GBK
  • PHP 文件 HTTP 访问会被执行 — 必须走 FTP 或 v.php 阅读器查看源码
  • 脱敏后必须 grep -c 验证 — 遗漏的 token 会直接公开到开源目录
  • 脱敏版只传 source/ — 绝不传 /www/proxy.php(那是生产版)
  • long-task-cron-worker.sh 的 TOKEN 是完整 32 位 hex — sed 替换时需要精确匹配完整字符串