1. 从一次误删说起Claude Code permission 到底在防什么Claude Code 的 permission 机制说白了就是给模型装三道闸门黑名单硬拦截、规则匹配软限制、用户人工审批。它要解决的问题很具体——模型在 agent_loop 里调用 bash 或 write_file 这类工具时怎么保证它不会手滑把工作目录外的文件删了、把系统盘的东西改了。适合谁适合正在手搓 Claude Code、想搞懂权限校验链路怎么落地到本地开发环境的同学。我试过在 macOS 上跑一个只读任务模型老老实实ls、cat三道门一个都没触发。但当我让它“删除当前工作目录下 tmp 文件夹的所有文件”时意外来了我拒绝了审批模型却继续追问最后我同意后它删掉的不是项目里的s03_permission/tmp而是系统盘/private/tmp下的临时数据。虚惊一场但足够后怕。这件事暴露了两个问题一是 permission 的规则匹配本质是软限制模型会“变形”绕过二是拒绝后上下文里塞的Permission denied没让模型停下来它反而像讨好型人格一样反复请求。所以这一章我们不光要实现三道门还要把 TaoToken 统一 Key 接进来让权限校验链路和 API 通道一起跑通顺便看看怎么用配置把风险压到最低。2. TaoToken 前置统一 Key 与 API 通道准备在动手写 permission 之前先把模型调用通道理顺。手搓 Claude Code 时模型请求走的是 Anthropic 兼容接口TaoToken 提供的就是这样一个统一入口你不用在多个 Key 之间来回切换一个 Key 就能覆盖对话、编码、Agent 场景。你需要准备的东西不多一个 TaoToken 账号、一个 API Key、以及本地能跑 Python 的环境。Key 的获取在控制台里完成拿到后不要硬编码进代码放到环境变量里最稳妥。export TAOTOKEN_API_KEYsk-你的key export TAOTOKEN_BASE_URLhttps://taotoken.net/api这里有个细节base_url用https://taotoken.net/api不要带多余的路径后缀Anthropic SDK 会自动拼接/v1/messages。如果你用的是 OpenAI 兼容的客户端那拼接逻辑不同但手搓 Claude Code 走的是 Anthropic 协议按上面写就行。注意Key 只放环境变量别写进settings.json或代码仓库。权限配置文件和密钥文件要分开管理这是后面 permission 规则能安全生效的前提。模型对话的调试入口在 模型对话接入文档在 接入文档Key 管理在 API Keys。先把通道跑通再谈权限顺序不能反。3. 可复制配置settings.json 权限规则骨架Claude Code 的权限配置核心在settings.json它决定了哪些工具调用需要审批、哪些直接放行、哪些直接拒绝。下面这份骨架你可以直接抄改改路径就能用。{ permissions: { deny: [ Bash(rm -rf /), Bash(sudo:*), Bash(shutdown:*), Bash(reboot:*), Bash(mkfs:*), Bash(dd if:*) ], ask: [ Bash(rm:*), Bash(chmod 777:*), Write(//etc/**), Edit(//etc/**) ], allow: [ Bash(ls:*), Bash(cat:*), Bash(find:*), Read(//Users/yourname/project/**) ], defaultMode: ask } }这份配置对应三道门的映射关系deny是第一道硬拦截命中直接阻断不给人工确认机会ask是第二道规则匹配命中后弹窗让你选 allow 还是 denyallow是白名单命中直接放行defaultMode设为ask表示没命中任何规则时默认走人工审批而不是默认放行。参数对照表如下字段作用对应闸门命中后行为deny危险命令黑名单第一道直接阻断打印红色理由ask风险操作规则第二道弹窗人工审批allow安全操作白名单放行直接执行defaultMode未命中默认策略兜底ask 或 allow如果你想让权限规则和 TaoToken 的 Key 一起生效可以在项目根目录放一个.claude/settings.json同时用环境变量注入 Key。这样模型请求走 TaoToken工具调用走本地 permission 校验两条链路互不干扰。# 项目级配置加载顺序全局 - 项目 - 本地 # 本地覆盖文件不要提交到 git echo .claude/settings.local.json .gitignore提示deny列表里的rm -rf /是子串匹配模型只要命令里包含这个片段就会被拦。但这也意味着rm -rf /Users/xxx/tmp会误伤所以实际项目里要把rm整体放进ask让用户自己判断。4. 验证请求一次权限校验的完整动作配置写好了得验证它真的生效。我们用一个最小可跑的 Python 脚本模拟 agent_loop 里的权限检查同时把模型请求打到 TaoToken看看拒绝后模型会不会停下来。先写三道门的核心逻辑from pathlib import Path WORKDIR Path(/Users/yourname/project).resolve() DENY_LIST [rm -rf /, sudo, shutdown, reboot, mkfs, dd if] PERMISSION_RULES [ { tools: [write_file, edit_file], check: lambda args: not (WORKDIR / args.get(path, )).resolve().is_relative_to(WORKDIR), message: Writing outside workspace }, { tools: [bash], check: lambda args: any(kw in args.get(command, ) for kw in [rm , /etc/, chmod 777]), message: Potentially destructive command } ] def check_deny_list(command: str): for pattern in DENY_LIST: if pattern in command: return fBlocked: {pattern} is on the deny list return None def check_rules(tool_name: str, args: dict): for rule in PERMISSION_RULES: if tool_name in rule[tools] and rule[check](args): return rule[message] return None def ask_user(tool_name: str, args: dict, reason: str) - str: print(f\n\033[33m {reason}\033[0m) print(f Tool: {tool_name}({args})) choice input( Allow? [y/N] ).strip().lower() return allow if choice in (y, yes) else deny def check_permission(block) - bool: if block.name bash: reason check_deny_list(block.input.get(command, )) if reason: print(f\n\033[31m⛔ {reason}\033[0m) return False reason check_rules(block.name, block.input) if reason: decision ask_user(block.name, block.input, reason) if decision deny: return False return True然后把它接进 agent_loop位置很关键必须在工具执行之前、模型返回 tool_use 之后。if block.type tool_use: print(f\033[33m$ {block.name}\033[0m) if not check_permission(block): results.append({ type: tool_result, tool_use_id: block.id, content: Permission denied. Stop and ask the user for guidance. }) continue handler TOOL_HANDLERS.get(block.name) output handler(**block.input) if handler else fUnknown: {block.name} print(str(output)[:200])注意这里我把context改成了content并且加了一句“Stop and ask the user for guidance”。原版只写Permission denied模型会理解成“这次不行那我换个方式再试”于是反复请求。加上明确的停止指令后模型拿到拒绝上下文会停下来等你指示。验证动作分三步第一步跑一个只读任务比如ls -la观察三道门是否都没触发直接放行。第二步跑一个删除任务命令里带rm观察第二道门是否弹出审批。你输入n拒绝看模型是否停止而不是继续追问。第三步跑一个带rm -rf /的命令观察第一道门是否直接红色阻断连审批机会都不给。实测下来第三步的阻断最干脆第一道门在check_permission开头就返回 False根本走不到ask_user。第二步的审批弹窗也正常拒绝后模型收到带停止指令的 tool_result不再纠缠。5. 本篇常见错排查报错一Permission denied后模型仍然继续执行原因通常是 tool_result 里只写了拒绝没写停止指令。模型把拒绝理解成“换个命令再试”。解决办法是在 content 里明确写“Stop and ask the user”或者在 system prompt 里加一条“遇到用户拒绝立即停止不要重试”。报错二rm -rf /Users/xxx/tmp被第一道门误伤因为deny是子串匹配rm -rf /会命中任何以rm -rf /开头的命令。解决办法是把rm -rf /改成更精确的匹配或者把rm整体移到ask列表让用户自己判断。报错三相对路径导致权限检查失效WORKDIR / args.get(path)如果 path 是相对路径resolve()会基于当前工作目录解析可能和预期不符。统一用绝对路径或者在检查前先(WORKDIR / path).resolve()再判断is_relative_to(WORKDIR)。报错四TaoToken 请求 401Key 没读到或者 base_url 写错。检查环境变量是否 export 成功base_url是否为https://taotoken.net/api不要多写/v1。Key 管理在 API Keys重新生成一个再试。报错五settings.json 不生效配置加载有优先级全局 项目 本地。如果你在项目里改了但没生效检查是不是被本地覆盖文件盖掉了。另外 JSON 格式错误会导致整个配置被忽略用python -m json.tool settings.json校验一下。6. 把权限链路和统一 Key 一起用起来三道门实现完你会发现 permission 本质是“软硬结合”第一道硬拦截防的是明显危险命令第二道规则匹配防的是潜在风险第三道人工审批是最后兜底。但软限制终究防不住模型变形绕过真要绝对隔离还是得上容器。如果你打算长期跑编码 Agent建议把 TaoToken 的 Coding Plan 用起来Key 统一管理权限配置和 API 通道分开维护项目里放.claude/settings.json本地覆盖放.claude/settings.local.json并加进.gitignore。这样换项目、换机器权限规则跟着仓库走Key 跟着环境走不会乱。长期编码和 Agent 场景可以看 Coding PlanClaude Code 相关的接入细节在 ClaudeCodeAnthropic控制台在 Console。权限配置这块先把deny和ask两个列表调准再谈自动化顺序别反。
企业数字化 ERP 产品动态
相关推荐
keeplived+vip脚本 #!/bin/bash
#
# Keepalived VIP Auto Install Script
# OS: CentOS 7.9
# set -e# 根据主机角色修改
ROLE"MASTER" # MASTER 或 BACKUP
LOCAL_IP"10.10.10.21"
PEER_IP"10.10.10.22"
VIP"10.10.10.100"
NET_IF"… · 2026/9/26 16:09:21
跨境电商浏览器自动化:Claude Code 集成 AdsPower MCP 实战配置指南 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 16:09:21
Kinodynamic RRT* 路径规划:MATLAB 实现与避坑指南 简介:这份资源是论文《Kinodynamic RRT*: Optimal Motion Planning for Systems with Linear Differential Constraints》的 MATLAB 实现代码,面向从事机器人运动规划、最优控制与轨迹优化方向的研究生、科研人员及工程师,用于在带线性微分约… · 2026/9/26 16:46:46
Codex 会话体检与专项修复:Codex Provider Sync 诊断扫描与 Repair 实战教程 Codex 会话体检与专项修复:Codex Provider Sync 诊断扫描与 Repair 实战教程 【免费下载链接】codex-provider-sync Synchronize Codex session provider metadata across rollout files and SQLite state. 项目地址: https://gitcode.com/gh_mirrors/co/codex-pr… · 2026/9/26 16:46:46
高校社区生鲜配送系统:从零搭建可运行的最小闭环 简介:高校社区生鲜配送系统是一套面向大学生与周边社区居民的在线生鲜购物平台源码,适合计算机专业学生、Java Web开发者用于课程设计、毕业设计或企业级项目练手。系统围绕用户管理、商品管理、订单处理、库存控制、配送调度、支付接口、数据分析、客户… · 2026/9/26 16:46:40
微信小程序新闻资讯系统开发实战:从后端设计到答辩要点 做一个完整的新闻资讯类小程序,看起来不算复杂,但真正动手做起来,里面值得抠的细节非常多。这个项目不光是写个列表页、详情页那么简单,它涉及微信生态的登录授权、接口鉴权、内容管理后台、缓存策略、分享链路,甚至还… · 2026/9/26 16:46:34
Ant build.xml 模板:Java 项目构建脚本的复用与避坑指南 简介:这份资源是一套面向Java开发者的Ant构建配置模板,以build.xml为核心,适合刚接触Ant或需要规范化构建流程的初中级开发者参考。模板围绕项目声明、属性设置、任务定义、目标定义与依赖关系等关键元素展开,覆盖javac编译、copy… · 2026/9/26 16:46:34
SpringBoot公务员学习系统开发:从需求拆解到部署避坑全指南 最近接了个毕业设计辅导的活,正好是“SpringBoot公务员学习系统”这一类题目。打开牛客和CSDN一看,好家伙,这类型选题几乎成了计算机毕设的“标配”。公共服务部门的在线培训与考核平台,术语上叫“行政人员数字化教育管理系统”&a… · 2026/9/26 16:46:34
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍 简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践 一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46