
1. 先复现Claude Code 报 EACCES 的真实场景长什么样你正在让 Claude Code 帮你改一个项目里的src/index.js它读完文件准备写回终端突然甩出一行红字Error: EACCES: permission denied, open /app/src/index.js或者更隐蔽一点读文件没问题一到写配置就翻车Error: EACCES: permission denied, open /app/config.json Error: EACCES: permission denied, unlink /app/temp.log Error: EACCES: permission denied, mkdir /app/dist这就是 Claude Code 文件权限错误里最典型的EACCES / Permission denied。它不是什么玄学 bug本质就一句话Claude Code 进程当前使用的用户身份对目标文件或目录没有对应的读/写/执行权限。EACCES 是 POSIX 错误码直译就是“访问被拒绝”跟你的代码逻辑、模型能力都没关系纯粹是操作系统层面的门禁没放行。哪些人最容易撞上我按实际遇到的频率排一下Docker 容器里跑 Claude Code容器默认以 rootUID 0运行但挂载进来的宿主机文件可能属于 UID 1000两边对不上写文件必炸。这是占比最高的一类。文件属于 root之前用sudo npm install或sudo建过目录文件所有者是 root普通用户动不了。目录权限是 700 且你不是所有者连cd进去都做不到更别说读写。npm 全局安装权限不足/usr/local/lib/node_modules归 root装 Claude Code 时就要 sudo。企业服务器 / 多人共享机器ACL 策略或权限隔离把目录锁死了。只读文件系统分区或容器以--read-only挂载任何写操作都直接拒绝。这篇就按“先定位权限链路再改配置入口”的顺序把可复制的 settings 片段和逐条验证动作给你最后重启会话确认文件操作恢复正常。适合正在被 EACCES 卡住、想快速排障的开发者也适合刚把 Claude Code 接进 Docker 工作流的新手。2. 定位根因权限链路 TaoToken 配置入口排 EACCES 之前先把“权限链路”想清楚。Claude Code 执行一次文件操作实际经过这么几层Claude Code 进程以某个 UID 运行 ↓ 检查目标文件/目录的 owner mode 当前 UID 是否匹配 owner / group / other 的权限位 ↓ 不匹配 EACCES: permission denied所以定位动作就三步看进程 UID → 看文件 owner 和 mode → 看目录有没有执行权限。命令很固定id # 当前用户 UID/GID ls -la src/index.js # 文件 owner 和权限位 ls -ld /app # 目录权限重点看有没有 x mount | grep /app # 是否只读挂载如果这几步都正常但 Claude Code 还是报权限错那就要看配置入口了。Claude Code 的行为受settings.json控制里面有几个跟文件操作、权限相关的字段。很多人 EACCES 反复出现是因为 settings 里的路径、工作目录、权限模式没配对导致它去操作一个本来就没权限的目录。这里顺带说下模型接入侧的配置。如果你用的是 TaoToken 这类兼容 Anthropic 协议的网关来驱动 Claude CodeBase URL、Key、Model ID 三件套要写全否则会话起不来你会误以为是权限问题。TaoToken 的 API 地址是https://taotoken.net/api控制台在https://taotoken.net/consoleAPI Key 在https://taotoken.net/api-keys生成。这些属于“前置配置”跟文件权限是两条独立的链路排障时要分开看别混在一起。一个常见的误区看到permission denied就以为是 API Key 没权限。其实 API Key 的 401 报错长这样401 Unauthorized跟EACCES完全不是一回事。EACCES 一定是本地文件系统层面的跟远端网关无关。把这条记牢能省你半小时。再补一个判断技巧如果报错路径是/usr/local/lib/node_modules这种系统目录基本就是 npm 全局权限问题如果是/app/...且你在 Docker 里基本就是 UID 不匹配如果是你自己项目目录但 owner 是 root那就是历史 sudo 操作留下的坑。按路径反推原因比盲目 chmod 高效得多。3. 可复制配置settings.json 与权限修复片段这一节给你能直接抄的配置和命令。先看 Claude Code 的settings.json路径通常在~/.claude/settings.json或项目级.claude/settings.json。下面这份片段把工作目录、权限模式、以及通过 TaoToken 接入的模型配置都写全了{ model: claude-sonnet-4-5, env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_API_KEY: sk-你的TaoToken密钥, ANTHROPIC_MODEL: claude-sonnet-4-5 }, permissions: { allow: [ Read, Write, Edit ], deny: [] }, workingDirectory: /app }注意workingDirectory要指向你真正有权限的目录。如果你在 Docker 里挂载的是/app但容器内该目录 owner 是 root那 Claude Code 以非 root 用户跑就会 EACCES。这时候要么改目录 owner要么让容器用匹配的 UID 启动。修复文件权限的标准动作按顺序来# 1. 把项目目录 owner 改成当前用户 sudo chown -R $(whoami) /app # 2. 给当前用户读写权限 chmod -R urw /app # 3. 目录必须有执行权限才能进入和访问 find /app -type d -exec chmod urx {} \; # 4. 验证 ls -la /app/src/index.jsDocker 场景下最稳的是让容器 UID 跟宿主机对齐docker run --user $(id -u):$(id -g) \ -v $(pwd):/app \ -w /app \ node:22 \ sh -c npm install -g anthropic-ai/claude-code claude或者在 Dockerfile 里建一个匹配 UID 的用户FROM node:22-slim ARG USER_ID1000 ARG GROUP_ID1000 RUN useradd -u ${USER_ID} -g ${GROUP_ID} -m claude-user USER claude-usernpm 全局权限问题改用用户级目录彻底告别 sudomkdir -p ~/.npm-global npm config set prefix ~/.npm-global echo export PATH$HOME/.npm-global/bin:$PATH ~/.zshrc source ~/.zshrc npm install -g anthropic-ai/claude-code which claude claude --version如果你用的是 Codex 或 Cline 这类工具配置入口类似auth.json或 MCP 配置里同样要写全 Base URL、Key、Model ID 三件套。以 Codex 的auth.json为例{ base_url: https://taotoken.net/api, api_key: sk-你的TaoToken密钥, model: claude-sonnet-4-5 }Cline 的 MCP 配置则写在cline_mcp_settings.json里字段名略有差异但三件套逻辑一致。记住配置缺失导致的是会话起不来权限缺失导致的是 EACCES两者报错形态不同别互相甩锅。4. 验证请求重启会话后确认文件操作恢复改完配置和权限别急着继续写代码先做一轮验证。验证分两层先确认 Claude Code 会话能正常起来再确认文件读写真的通了。第一层重启会话并检查模型连通claude --version claude进入交互后随便问一句让它读一个文件读一下 /app/src/index.js 的前 20 行如果它能正常返回内容说明读权限 OK。接着测写在 /app 下新建一个 test-perm.txt写入 hello然后回到终端确认ls -la /app/test-perm.txt cat /app/test-perm.txt文件存在且内容正确说明写权限恢复。再测目录创建# 让 Claude Code 执行 mkdir /app/dist如果dist目录成功创建说明目录执行权限也没问题。第二层验证模型请求本身是否走通。你可以用 curl 直接打一次 TaoToken 的接口确认 Base URL 和 Key 没问题curl https://taotoken.net/api/v1/messages \ -H x-api-key: sk-你的TaoToken密钥 \ -H anthropic-version: 2023-06-01 \ -H content-type: application/json \ -d { model: claude-sonnet-4-5, max_tokens: 64, messages: [{role: user, content: ping}] }返回里有正常的content字段说明网关侧通了。这一步能帮你把“文件权限问题”和“接入配置问题”彻底分开。如果 curl 通但 Claude Code 报错问题在本地 settings如果 curl 就 401问题在 Key 或 Base URL。实测下来Docker UID 不匹配是最容易被忽略的一类。容器里whoami显示 root但挂载目录 owner 是 1000root 反而写不进去取决于挂载权限或者反过来普通用户写不了 root 的文件。用--user $(id -u):$(id -g)对齐后这类报错基本一次消失。验证通过后建议把test-perm.txt删掉保持工作区干净rm /app/test-perm.txt5. 常见报错排查401、local proxy failed、reading choices、OAuth排障时最容易混淆的是把不同链路的报错当成同一个问题。下面按真实报错逐条对照。EACCES: permission denied—— 本文主角本地文件权限问题。按第 3 节的 chown/chmod 处理Docker 场景对齐 UID。401 Unauthorized / invalid api key—— 这是接入配置问题不是文件权限。检查ANTHROPIC_API_KEY是否填对Base URL 是否是https://taotoken.net/api。Key 去https://taotoken.net/api-keys重新生成一个再试。local proxy failed / connection refused—— 通常是本地网络或代理配置问题跟文件权限无关。检查ANTHROPIC_BASE_URL有没有写错或者本地是否有拦截。注意不要配置任何非官方的网络转发工具直接用标准 API 地址即可。Error reading choices / unexpected response shape—— 这类多半是模型返回格式跟客户端预期不一致常见于 Model ID 写错。确认ANTHROPIC_MODEL跟网关支持的模型名一致别自己拼一个不存在的名字。OAuth / authentication failed—— 如果你用的是需要 OAuth 的客户端检查 token 是否过期。TaoToken 走的是 API Key 模式在settings.json里填ANTHROPIC_API_KEY即可不需要额外 OAuth 流程。npm EACCES 装不上 Claude Code—— 回到第 3 节的~/.npm-global方案别用 sudo 硬装。sudo 装完后续 Claude Code 生成的文件会属于 root你普通用户又改不了陷入死循环。只读文件系统 read-only file system—— 检查mount | grep /app如果是 ro重新挂载或去掉容器的--read-only参数。排查清单速查□ id 看当前 UID/GID □ ls -la 看文件 owner 和权限位 □ ls -ld 看目录有没有 x □ mount | grep 看是否只读 □ Docker 用 --user $(id -u):$(id -g) □ npm 用 ~/.npm-global不用 sudo □ settings.json 里 Base URL/Key/Model 三件套写全 □ curl 直连 API 验证网关侧把这张清单过一遍90% 的 EACCES 都能定位到具体那一层。6. 接入与排障入口把配置一次配对文件权限修好之后剩下的就是让 Claude Code 稳定跑起来。如果你还没配好模型接入建议先把三件套一次性写对避免后面反复折腾。模型对话能力可以先在https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentmodel_chat上验证确认模型能正常响应再回到本地配 Claude Code。API Key 在https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentapi_keys生成控制台在https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentconsole。接入文档在https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentdoc里面有各客户端的完整配置示例。如果你是要长期用 Claude Code 做编码和 Agent 任务Coding Plan 会更划算入口在https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentcoding_plan。Claude Code 专属的接入说明在https://taotoken.net/claude-code?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentclaude_codeAnthropic 协议相关的细节在https://taotoken.net/claude-code-anthropic?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentclaude_code_anthropic。最后留一个我踩过的坑改完settings.json后一定要完全退出 Claude Code 再重开热重载不一定生效。有次我改完配置直接在当前会话里测还是报旧错重启后一切正常。权限类问题尤其如此进程启动时就把工作目录和权限上下文定死了不重启等于没改。