TwKit
正在载入
TwKit

建议收藏,用到时照着做。做完你能得到一道“刹车”:AI 想执行 rm -rf 这种危险命令,会被你的脚本当场拦下。 这是通义千问 Qwen Code 官方文… · @swordBluesy · TwKit

@swordBluesy

建议收藏,用到时照着做。做完你能得到一道“刹车”:AI 想执行 rm -rf 这种危险命令,会被你的脚本当场拦下。 这是通义千问 Qwen Code 官方文档 Hooks 一页,页面标注最后更新 2026 年 10 月 28 日。先说结论:想让 AI 守规矩,别只靠在提示词里叮嘱它,官方给了更硬的办法,在它动手前后插一段你自己的脚本,脚本说不行就不行。 官方说钩子默认是开启的,想全部临时关掉,在设置文件顶层写 disableAllHooks 为 true,配置不用删。 先说清词。 钩子(Hook),是你写好的脚本或程序,Qwen Code 走到某个固定时刻会自动运行它,比如工具执行前、执行后、会话开始、会话结束。 事件(Event),就是那个固定时刻,官方表格列了 22 种,最常用的是 PreToolUse(工具执行前)和 PostToolUse(工具执行后)。 匹配器(matcher),是用来挑“哪个工具触发”的正则表达式,比如只盯 run_shell_command 这个运行命令的工具。 先把话说全: 官方说项目里的 .qwen/settings.json 里的钩子,只有在受信任的文件夹里才会加载;你自己用户级的钩子不受这个限制。 官方说钩子默认并行执行,要排先后顺序,在钩子定义里写 sequential 为 true。 官方说异步钩子目前不能做拦截决定,它的输出也还不会显示出来,所以想拦截就别用 async。 官方提醒,钩子是用你的用户权限在你的电脑上跑的,所以别随手抄陌生人的钩子脚本。 一、第一步:知道有哪几类钩子 官方说 Qwen Code 支持四种:command 执行一条命令;http 把内容 POST 到一个网址;function 只给内部技能系统用,普通用户用不上;prompt 让大模型来判断放行还是拦截。新手先用 command 就够了。 二、第二步:挑一个时刻 想拦危险命令,就选 PreToolUse,它在工具执行之前触发。想事后记录,选 PostToolUse。想在 AI 说完话之前检查它做完没有,选 Stop。官方表格里写了,PreToolUse 的匹配对象是工具名,比如 write_file、read_file、run_shell_command。 三、第三步:把配置写进设置文件 文件放在项目的 .qwen/settings.json。官方示例的结构是:hooks 下面写事件名,里面放 matcher 和 hooks 数组,数组里每个钩子写 type 为 command、command 写脚本路径、name 起个名字、timeout 写超时秒数。官方特别提醒,钩子要写 name,不写名字就没法在运行时单独开关。 四、第四步:写拦截脚本 脚本从标准输入读到一段 JSON,里面有 tool_name 和 tool_input。官方示例用 jq 把它们取出来,用 grep 判断命令里有没有 rm 加 -rf、mv 加斜杠、chmod 加 777 这类写法。命中就输出一段 JSON,其中 permissionDecision 填 deny,permissionDecisionReason 写原因。官方说这两个字段都是必填。没命中就输出 allow。完整可复制的脚本在赠品里。 五、第五步:认清三种返回 官方写了退出码规则:退出码 0 表示成功,如果输出是 JSON,就按 JSON 里的决定办;退出码 2 是阻断错误,这时 stdout 会被忽略,stderr 的内容当作错误反馈给模型;其他退出码是非阻断错误,只在调试模式下才看得到,流程继续。也就是说,脚本崩了默认是放行的,不是拦截。 六、第六步:用 /hooks 检查 在 Qwen Code 里输入 /hooks,会打开一个只读的浏览器,从事件到匹配器再到具体钩子,能看到每个钩子的类型、来源、是否启用、命令和超时。官方说它不会改你的配置,改配置要去编辑 settings.json;而打开这个菜单时会重新读取钩子定义,所以改完不用重启。 七、第七步:钩子没触发怎么查 官方排查清单有五条:事件名要拼对,大小写也要对;matcher 要对上工具名;项目钩子要文件夹受信任;确认没有开 disableAllHooks、--safe-mode 或 --bare;用 --debug 启动,或设 QWEN_DEBUG_LOG_FILE 为 1,去 ~/.qwen/debug/latest 读日志。 八、第八步:进阶玩法 官方还给了几种用法:用 prompt 钩子在 Stop 时让模型判断任务是不是真做完了,没做完就把原因塞回去让它继续干;用 http 钩子把每次工具执行记录发到你自己的审计服务;用 UserPromptSubmit 在你提交的提示词里含密码、token 时直接拦下。官方提醒,prompt 钩子会把内容发给模型服务商,http 钩子会把内容发给你配置的网址,涉密内容要先想清楚。 常见坑 3 条 一,脚本没加执行权限,钩子悄悄失效,用 chmod 加上。二,matcher 写成了显示名而不是工具 id,官方推荐用 run_shell_command 这种运行时 id,并加 ^ 和 $ 锚定。三,用 async 想拦截,拦不住,它不能做决定。 收藏版:5 步速查 一,hooks 下选 PreToolUse 二,matcher 写 ^run_shell_command$ 三,脚本读 stdin,命中就输出 deny 四,给钩子起 name,设 timeout 五,输入 /hooks 检查是否生效 参考:通义千问 Qwen Code 官方文档 Hooks(S1哥 整理) S1哥观点 这篇文档最值得看的,是一句很容易略过的话:钩子脚本崩了,默认是放行。很多人以为装了“保安”就安全了,其实保安睡着了,门是开着的。 真正的信号是,管住 AI 不能只靠它自觉。提示词是劝,钩子是锁。给弱者设计的流程,强者穿上就是紧身衣,但对会动你硬盘的 AI,紧一点是保险。 就像家里装了智能门锁,你得时不时试一下它真能锁住。评论区说一下,你最想让钩子拦住 AI 的哪一个操作?你卡在第几步?同系列前几篇在我主页。

曝光 212 · 评论 7 · 点赞 4 · 书签 0

查看原帖