为什么我的 Claude Code 总是说自己不能操作文件?权限怎么配?CLAUDE.md 是什么?Hooks 有什么用?
这篇文章把新手最常踩的坑一次讲清楚。
目录
- 为什么 Claude Code 总说“我不能操作文件”?
- 配置
settings.json:开放权限 - 配置
CLAUDE.md:教它了解你 - 配置环境变量:API Key 和 Base URL
- Hooks:自动化你的工作流
- Claude Code 里的斜杠命令
- 完整配置清单
1. 为什么 Claude Code 总说“我不能操作文件”?
很多人刚开始用 Claude Code,会发现它有时候帮你写了代码、生成了文件,有时候又反复说 “我无法直接访问你的文件系统”,让你手动复制粘贴内容给它。
这让人非常困惑。
其实原因很简单:不是能力问题,是权限确认机制。
Claude Code 默认在每次读文件、写文件、执行命令前都需要你的确认。 如果它没有收到明确指令,就会选择保守策略,让你把内容手动贴过来,而不是主动去读。 这不是 bug,是设计如此。配置好就解决了。
还有一种情况是模型本身产生了幻觉,错误认为自己没有文件访问能力。
遇到这种情况,明确告诉它 用 Read 工具读取 xxx 文件 通常能直接解决。
2. 配置 settings.json:开放权限
Claude Code 的全局配置文件在 ~/.claude/settings.json。
如果这个文件不存在,Claude Code 会用最保守的默认权限运行,基本上每个操作都要问你。
创建配置文件
mkdir -p ~/.claude
nano ~/.claude/settings.json
推荐配置内容
{
"model": "claude-sonnet-4-5",
"permissions": {
"allow": [
"Read(**)",
"Write(**)",
"Edit(**)",
"Bash(git *)",
"Bash(npm *)",
"Bash(node *)",
"Bash(python *)",
"Bash(pip *)",
"Bash(ls *)",
"Bash(cat *)",
"Bash(mkdir *)",
"Bash(cp *)",
"Bash(mv *)"
],
"deny": [
"Bash(rm -rf /)",
"Read(.env)"
]
}
}
模型名称注意
常见错误:把模型名写成
claude-opus-4-6,这个模型名不存在,会导致报错。 请使用claude-sonnet-4-5(速度快、性价比高,新手首选)或claude-opus-4-5(更强但更贵)。
临时跳过所有权限确认
如果你需要在某个项目里完全不被打断,可以用:
claude --dangerously-skip-permissions只在你完全信任的项目目录里使用。
3. 配置 CLAUDE.md:教它了解你
CLAUDE.md 是 Claude Code 每次启动时都会读取的说明文件。
你在这里写的内容,相当于给 Claude Code 的“长期记忆”告诉它你是谁、你的习惯、你希望它怎么工作。
CLAUDE.md 有两个位置:
~/.claude/CLAUDE.md:全局,对所有项目生效项目目录/.claude/CLAUDE.md:项目级,优先级更高
新手推荐模板(全局)
## 关于我
- 使用 WSL2 + Ubuntu 开发环境
- 编辑器:VS Code
- 编程新手,正在学习中
## 技术栈
- 语言:[填你常用的语言]
- 框架:[填你使用的框架]
- 数据库:[填你使用的数据库]
## 行为要求
- 每次回复用"伙计"开头
- 需求模糊时先提问澄清,再写代码
- 写代码/架构方案:先描述思路,等我确认再动手
- 文件读写等机械操作:直接执行,不用问我
- 遇到错误先自己修复,不要只报告问题
- 不写兼容性代码,除非我主动要求
- 优先用中文回复
## 代码规范
- 注释要详细,用中文写,新手也能看懂
- 代码保持简单,不要过度封装
- 用最主流的方案,方便我搜索学习
## 工作流程
- 每次修改代码后,告诉我改了什么、为什么这样改
- 遇到我可能不懂的概念,顺带简单解释一下
- git 操作前告诉我你要做什么
新手专属技巧
加入“用最主流的方案”这条很重要。没有这条,Claude Code 可能会用冷门库, 你遇到问题时网上找不到资料。主流方案的好处是遇到问题能搜到很多解答。
4. 配置环境变量:API Key 和 Base URL
Claude Code 通过环境变量读取 API Key 和请求地址,不是通过 settings.json。
很多人会把 ANTHROPIC_API_KEY 写进 settings.json 的 env 块,那样是无效的。
推荐方式:单独文件管理
-
创建专用配置文件
把 API 相关配置单独存放,以后换 Key 只改这一个文件,不用动~/.bashrc。 -
写入配置
填入你的 API Key,如果使用第三方中转服务还需要填写 Base URL。 -
在
~/.bashrc里引用
这样每次打开终端都自动加载,永久生效。 -
验证生效
运行echo $ANTHROPIC_API_KEY,输出你的 Key 就代表配置成功。
# 第一步:创建配置文件
nano ~/.claude_env
# 写入以下内容(官方直连不需要 BASE_URL):
export ANTHROPIC_API_KEY="sk-ant-你的key"
export ANTHROPIC_BASE_URL="https://你的中转地址" # 可选
# 第二步:在 ~/.bashrc 里引用它
echo 'source ~/.claude_env' >> ~/.bashrc
source ~/.bashrc
# 第三步:验证
echo $ANTHROPIC_API_KEY
以后换 Key 怎么办
# 直接编辑这一个文件就够了
nano ~/.claude_env
source ~/.claude_env # 让修改立即生效
5. Hooks:自动化你的工作流
Hooks 是在 Claude Code 执行特定操作的前后,自动触发你写的脚本。
核心思路是:CLAUDE.md 里写的是“建议”,Hooks 里写的是“必须执行的规则”。
| 触发时机 | 说明 | 典型用途 |
|---|---|---|
PreToolUse | 工具运行前 | 安全拦截危险命令 |
PostToolUse | 工具完成后 | 自动格式化、记录日志 |
Notification | Claude 需要你注意时 | 桌面通知 |
Stop | Claude 完成回复时 | “任务完成”通知 |
第一步:创建脚本目录并安装依赖
mkdir -p ~/.claude/hooks
sudo apt install jq libnotify-bin -y
日志记录脚本
文件:~/.claude/hooks/logger.sh
#!/bin/bash
INPUT=$(cat)
TOOL=$(echo "$INPUT" | jq -r '.tool_name')
FILE=$(echo "$INPUT" | jq -r '.tool_input.file_path // empty')
CMD=$(echo "$INPUT" | jq -r '.tool_input.command // empty')
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
LOG_DIR="$HOME/.claude/logs"
mkdir -p "$LOG_DIR"
[ -n "$FILE" ] && echo "[$TIMESTAMP] $TOOL → $FILE" >> "$LOG_DIR/file-changes.log"
[ -n "$CMD" ] && echo "[$TIMESTAMP] Bash → $CMD" >> "$LOG_DIR/commands.log"
exit 0
安全拦截脚本
文件:~/.claude/hooks/security.sh
#!/bin/bash
COMMAND=$(cat | jq -r '.tool_input.command // empty')
DANGEROUS=("rm -rf /" "rm -rf ~" "DROP TABLE" "> /dev/sda")
for pattern in "${DANGEROUS[@]}"; do
if echo "$COMMAND" | grep -q "$pattern"; then
echo "已阻止危险操作: $pattern" >&2
exit 2 # exit 2 才能真正阻止,exit 1 只是警告!
fi
done
exit 0
关键:exit 2 vs exit 1
安全拦截 hook 必须用
exit 2才能真正阻止命令执行。 如果用exit 1,只是打印一条警告,危险命令仍然会继续运行。
在 settings.json 里注册 Hooks
{
"model": "claude-sonnet-4-5",
"permissions": { /* ... 同前 ... */ },
"hooks": {
"PostToolUse": [{
"matcher": "Write|Edit",
"hooks": [{ "type": "command", "command": "~/.claude/hooks/logger.sh" }]
}],
"PreToolUse": [{
"matcher": "Bash",
"hooks": [
{ "type": "command", "command": "~/.claude/hooks/security.sh" },
{ "type": "command", "command": "~/.claude/hooks/logger.sh" }
]
}],
"Stop": [{
"matcher": "",
"hooks": [{ "type": "command", "command": "notify-send 'Claude Code' '任务完成'" }]
}]
}
}
6. Claude Code 里的斜杠命令
在 Claude Code 的对话框里,以 / 开头的是内置功能命令,不是发给 Claude 的对话。
| 命令 | 用途 | 建议频率 |
|---|---|---|
/doctor | 检查环境配置是否正常 | 每次配置后必用 |
/help | 查看所有可用命令 | 忘记命令时 |
/clear | 清空当前对话上下文 | 开始新任务时 |
/compact | 压缩对话历史,节省 token | 对话很长时 |
/cost | 查看本次对话花了多少钱 | 想了解消耗时 |
/hooks | 查看当前 hooks 配置 | 调试 hooks 时 |
/model | 临时切换模型 | 需要更强模型时 |
7. 完整配置清单
按下面的顺序操作一遍,你的 Claude Code 就能从“只会聊天”变成真正干活的状态。
| 文件 | 位置 | 作用 |
|---|---|---|
settings.json | ~/.claude/settings.json | 权限配置、模型选择、Hooks 注册 |
CLAUDE.md | ~/.claude/CLAUDE.md | 全局行为指令,每次启动自动读取 |
.claude_env | ~/.claude_env | API Key 和 Base URL,单独管理方便替换 |
logger.sh | ~/.claude/hooks/logger.sh | 记录所有文件操作和命令执行 |
security.sh | ~/.claude/hooks/security.sh | 拦截危险命令,exit 2 真正阻止 |
配置完成后你能做到的事
- Claude Code 直接读取项目文件,不再让你手动复制粘贴
- 它了解你的习惯和偏好,回复方式符合你的期望
- API Key 单独管理,更换时只改一个文件
- 所有文件操作自动记录日志,随时可以审计
- 危险命令在执行前被拦截,误操作风险大幅降低
- 任务完成时桌面弹通知,不用一直盯着终端