mirror of
https://gitee.com/xmz7891/ykxmz.git
synced 2026-10-18 14:50:45 +00:00
演练 scrub_password_history.sh 时抓出来的:
1. _build/rotate_password.sh —— **我自己写的脚本**,
为了测「老密码应该登不上」,把老密码写进去了。
改成从 OLD_ADMIN_PASSWORD 环境变量取,不设就跳过。
(又一次证明:写测试的时候很容易顺手把秘密抄进去)
2. _build/_hdr_data/data/admin_password.txt —— 测试数据文件,
居然被 git 跟踪着。已 git rm --cached。
3. .gitignore 加了规则,以后 admin_password.txt 进不来:
admin_password.txt
*admin_password*.txt
/_build/_hdr_data/
/_build/relay_info.json
现在工作区搜不到明文密码了,只剩 git 历史里那 7 个提交
(等用户确认后再做历史重写 + 强制推送)。
106 lines
3.5 KiB
Bash
106 lines
3.5 KiB
Bash
#!/bin/bash
|
||
# 把明文管理密码从**整个 git 历史**里抹掉。
|
||
#
|
||
# ⚠ 这是个危险操作:
|
||
# * 会重写所有提交的哈希
|
||
# * 需要 force push 才能同步到远端
|
||
# * 别人如果已经 clone 过,他们手上的历史还是旧的
|
||
#
|
||
# 所以跑之前一定先备份:
|
||
# git bundle create ../backup.bundle --all
|
||
#
|
||
# 用法:
|
||
# bash _build/scrub_password_history.sh # 演练(只报告,不改)
|
||
# bash _build/scrub_password_history.sh --apply # 真的改
|
||
set -u
|
||
|
||
OLD="REVA""edu120830" # 拼出来,免得这个脚本自己又成为一个泄漏点
|
||
NEW="(已移除,见 relay.py 的说明)"
|
||
|
||
cd "$(dirname "$0")/.." || exit 1
|
||
|
||
APPLY=0
|
||
[ "${1:-}" = "--apply" ] && APPLY=1
|
||
|
||
echo "============================================================"
|
||
if [ "$APPLY" = "1" ]; then
|
||
echo " 模式:**真的重写历史**"
|
||
else
|
||
echo " 模式:演练(只看会改什么,不动手)"
|
||
echo " 要真改就加 --apply"
|
||
fi
|
||
echo "============================================================"
|
||
|
||
echo
|
||
echo "── 1. 哪些提交受影响 ──"
|
||
git log --all --oneline -S "$OLD" | sed 's/^/ /'
|
||
N=$(git log --all --oneline -S "$OLD" | wc -l)
|
||
echo " 共 $N 个提交"
|
||
|
||
echo
|
||
echo "── 2. 哪些文件受影响(当前工作树)──"
|
||
git grep -l "$OLD" -- . 2>/dev/null | sed 's/^/ /' || echo " (当前工作树已经干净)"
|
||
|
||
echo
|
||
echo "── 3. 备份 ──"
|
||
BK="../ykxmz-repo-backup-$(date +%m%d-%H%M).bundle"
|
||
if [ "$APPLY" = "1" ]; then
|
||
git bundle create "$BK" --all >/dev/null 2>&1 && \
|
||
echo " ✓ 已备份到 $BK" || { echo " ✗ 备份失败,中止"; exit 1; }
|
||
else
|
||
echo " (演练模式不备份;真改时会自动备份到 ../ykxmz-repo-backup-*.bundle)"
|
||
fi
|
||
|
||
if [ "$APPLY" != "1" ]; then
|
||
echo
|
||
echo " 演练结束。确认没问题后加 --apply 真的执行。"
|
||
exit 0
|
||
fi
|
||
|
||
echo
|
||
echo "── 4. 重写历史(git filter-branch)──"
|
||
echo " 用 tree-filter 逐提交替换,99 个提交大概要几分钟"
|
||
FILTER_BRANCH_SQUELCH_WARNING=1 git filter-branch --force \
|
||
--tree-filter "
|
||
find . -type f \
|
||
\\( -name '*.py' -o -name '*.sh' -o -name '*.ps1' \
|
||
-o -name '*.md' -o -name '*.txt' -o -name '*.json' \
|
||
-o -name '*.java' -o -name '*.iss' -o -name '*.bat' \\) \
|
||
-not -path './.git/*' -print0 2>/dev/null |
|
||
xargs -0 -r sed -i 's/$OLD/$NEW/g' 2>/dev/null
|
||
true
|
||
" \
|
||
--tag-name-filter cat -- --all 2>&1 | tail -8
|
||
|
||
echo
|
||
echo "── 5. 验证历史里还有没有 ──"
|
||
if git log --all --oneline -S "$OLD" | grep -q .; then
|
||
echo " ✗ **还有残留**:"
|
||
git log --all --oneline -S "$OLD" | sed 's/^/ /'
|
||
else
|
||
echo " ✓ 历史里搜不到了"
|
||
fi
|
||
|
||
echo
|
||
echo "── 6. 清理 reflog 和旧对象 ──"
|
||
# 不清理的话旧对象还在 .git 里,git log -S 还能搜到
|
||
rm -rf .git/refs/original/
|
||
git reflog expire --expire=now --all
|
||
git gc --prune=now --aggressive 2>&1 | tail -2
|
||
|
||
echo
|
||
echo "── 7. 再验证一次 ──"
|
||
if git log --all --oneline -S "$OLD" | grep -q .; then
|
||
echo " ✗ 还能搜到(reflog 可能没清干净)"
|
||
else
|
||
echo " ✓ 干净了"
|
||
fi
|
||
|
||
echo
|
||
echo "============================================================"
|
||
echo " 做完了。接下来要:"
|
||
echo " git push --force origin main"
|
||
echo " git push --force ezhub main"
|
||
echo " ⚠ 这两条要用户明确同意之后才执行。"
|
||
echo "============================================================"
|