#!/bin/bash # AgentOS pre-commit 防泄露钩子 # # 作用:提交前扫描暂存区内容,命中疑似 API Key 模式则阻止提交。 # 安装:随机组部署自动安装(见 00_bootstrap/deploy.sh),或手动: # cp 00_bootstrap/hooks/pre-commit .git/hooks/pre-commit && chmod +x .git/hooks/pre-commit # # 背景:公开仓库一旦提交密钥即永久泄露(git 历史无法简单抹除), # 故用钩子在任何提交前拦截。密钥应放 agent-local/(不被 git 跟踪)或环境变量。 PATTERNS="sk-[A-Za-z0-9]{20,}|sk-ws-[A-Za-z0-9._-]{20,}|api-key-kling-[A-Za-z0-9_-]{10,}|AKLT[A-Za-z0-9]{12,}|LTAI[A-Za-z0-9]{12,}|sk-ant-[A-Za-z0-9_-]{20,}|ark-[a-f0-9]{8}-[a-f0-9-]{20,}" hits="" for f in $(git diff --cached --name-only --diff-filter=ACM); do case "$f" in *.png|*.jpg|*.jpeg|*.gif|*.webp|*.db|*.sqlite|*.sqlite3|*.zip|*.gz|*.mp4|*.mov|*.woff*|*.ttf) continue ;; esac m=$(git show ":$f" 2>/dev/null | grep -E -o "$PATTERNS" | sort -u | head -3) if [ -n "$m" ]; then hits="${hits}\n ${f}:\n$(echo "$m" | sed -E 's/([A-Za-z0-9_-]{6})[A-Za-z0-9_-]{8,}/\1…(已脱敏)/g' | sed 's/^/ /')" fi done if [ -n "$hits" ]; then echo "❌ 检测到疑似 API Key,提交已阻止:" echo -e "$hits" echo "" echo "👉 密钥请放 agent-local/(不被 git 跟踪)或使用环境变量;" echo " 配置界面:Dashboard → 服务 → 🔑 API 配置" echo " 如确认是误报(示例/占位文本),可用:git commit --no-verify" exit 1 fi exit 0