当Claude Code在Linux多用户环境报EACCES权限错误时,chmod 777是下下策。一位工程师花了半天排查,最终用一组精密的权限架构解决了问题——这套方案现在可以直接抄作业。
用户jeremy启动Claude Code时遭遇经典报错:
EACCES: permission denied, open
syscall: "open", errno: -13, code: "EACCES"
表面看是权限不足,实际却是文件所有权混乱的连锁反应。jeremy的主目录下,.claude/debug/目录的属主是admincostplus,jeremy自己反而没有写入权限。问题的根源在于:之前有人用admincostplus身份运行过Claude Code,在共享位置创建了文件,留下了"权限地雷"。
第一层:用户组隔离,而非777裸奔
解决方案的核心是创建一个专用用户组claudeusers,把jeremy和admincostplus都塞进去。这比开放所有权限安全得多——组内成员协作,组外人员隔离。
脚本自动完成用户组创建和成员添加:
getent group "$GROUP" >/dev/null || groupadd "$GROUP"
usermod -a -G "$GROUP" "$MASTER_USER"
usermod -a -G "$GROUP" "$ADMIN_USER"
这里的关键细节是-a参数,表示追加到附加组而非替换主组。如果漏掉这个字母,可能把用户踢出原有组,引发更大的权限灾难。
第二层:setgid位,让权限自动遗传
共享目录/opt/claude-shared的权限被设为2775,那个开头的2就是setgid位(设置组ID位)。这个老派但实用的Linux特性,确保目录下所有新建文件自动继承父目录的组所有权,而不是创建者的主组。
chmod 2775 "$SHARED"
换句话说,无论jeremy还是admincostplus在共享目录创建文件,文件的属组都是claudeusers,双方自然都能读写。这比事后手动chown省心,也避免了权限漂移。
第三层:符号链接,把分散目录收拢
Claude Code的配置散落在多个位置:~/.claude、~/.claude-code、~/.config/claude-code、~/.local/share/claude-code。脚本先把master用户(jeremy)的这些目录同步到共享位置,再把admin用户的同名目录替换为指向共享位置的符号链接。
rsync -a --delete "$src"/ "$dst"/
--delete参数确保同步时删除目标端多余文件,保持两边严格一致。如果admin用户之前有自己的配置,脚本会先备份再迁移,避免数据丢失。
最终效果:两个用户看到的是同一套配置,写入的是同一组文件,但各自保持独立的系统身份。没有777的裸奔风险,也没有手动协调的繁琐。
这套方案最聪明的地方在于利用了Linux已有的权限机制,而非造新轮子。setgid位诞生于Unix早期,符号链接更是基础中的基础,但组合起来恰好解决现代AI工具的协作痛点。
工程师在文末留下了一个未解的问题:如果未来要加入第三个用户,这套脚本能否无缝扩展?还是需要重新设计架构?
热门跟贴