

我平时让 AI 助手在电脑上批量干活:跑脚本、起进程、管文件。提示词里写过无数遍"这个别删、那个别动",但用久了发现一个扎心的事实:提示词管不住高压下的 AI。任务一急、重试一多,它该犯的还是犯——不是它"叛逆",而是长对话里规矩会被冲淡、会在几十轮工具调用之后被忘掉。吃过几次亏之后我下定决心:不能只靠"嘱咐",得装一个物理刹车。
我的 AI 工具链支持 PreToolUse hook:每次 AI 要执行 Bash 或 PowerShell 命令之前,系统先把命令原文喂给我指定的脚本,脚本退出码 0 就放行,退出码 2 就直接拦截,命令根本不会执行。这等于在 AI 的手和电脑之间加了一道闸:规则从"它记得的事"变成了"程序判定的事"。
我先拿最小可用版练手:拦截递归删除命令;另一类高危操作需要"用户当日授权"才放行——本地放一个授权文件,首行等于今天的日期才有效,过期作废。写好配置挂上 hook,拿五类用例实测:普通命令放行、递归删除拦截、未授权启动拦截、写入当日授权文件后放行、把授权文件改成昨天的日期再跑又拦截。五发五中,刹车装好了。
第一版规则图省事,看到关键字就拦。结果正常的文件查看命令也被拦了——参数里恰好包含被拉黑的词。教训:拦截必须区分操作类型,同一个词出现在"删除"和"查看"里风险完全不同。规则要对准真正危险的命令形态(递归删除、强制覆盖这类组合),只读操作一律放行,否则 AI 干活处处碰壁,最后被叫停的反而是刹车本身。
第二版上线后测危险命令,照样跑过去了。排查发现是配置里的 matcher 只写了 Bash 一个工具名,AI 换了个 shell 工具执行同样的命令就绕过去了。教训:matcher 必须覆盖所有能执行命令的工具,而且上线前要把"同类命令换不同工具执行"作为标准测试用例——不实测等于没装。
受控操作总得有个放行通道,否则用户亲自要求的操作也会被卡死。我最初图方便做成了"文件存在就放行",几天后发现这个文件忘了删,刹车对这类操作等于永久失效。改成首行必须是当天日期之后,授权天然只管 24 小时,第二天自动重新锁上。逃生门一定要带时效,这是整套装甲里最容易漏的一环。
这套机械刹车跑下来,我的感受可以归成三句话:
最后附上本次实测用到的关键配置和测试命令,可直接复制:
:: settings.json 里挂载 PreToolUse hook(匹配所有命令类工具)
{ "hooks": { "PreToolUse": [ { "matcher": "Bash|PowerShell",
"hooks": [ { "type": "command", "command": "python gate_demo.py" } ] } ] } }
:: 闸门脚本约定: stdin 收 JSON, 退出码 0=放行, 2=拦截
:: 模拟一次调用(危险命令应被拦)
echo {"tool":"Bash","command":"rm -rf ./build"} | python gate_demo.py
echo 退出码 %ERRORLEVEL% :: 输出 2 = 已拦截
:: 逃生门: 授权文件首行必须是今天, 过期自动失效
powershell -NoProfile -Command "Set-Content unlock.txt -Value (Get-Date -Format yyyy-MM-dd)"把"下不为例"变成"跑不过去",AI 自动的安全感才算真正落地。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。