醒刻 Logo
← 返回文章列表

Claude Code 完全上手指南:从“只会聊天”到真正干活

为什么 Claude Code 总说自己不能操作文件?权限怎么配?CLAUDE.md 和 Hooks 有什么用?这篇文章把新手最常踩的坑一次讲清楚。

2026年3月18日 · 2070 · 更新于 2026年3月18日

为什么我的 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.jsonenv 块,那样是无效的

推荐方式:单独文件管理

  1. 创建专用配置文件
    把 API 相关配置单独存放,以后换 Key 只改这一个文件,不用动 ~/.bashrc

  2. 写入配置
    填入你的 API Key,如果使用第三方中转服务还需要填写 Base URL。

  3. ~/.bashrc 里引用
    这样每次打开终端都自动加载,永久生效。

  4. 验证生效
    运行 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工具完成后自动格式化、记录日志
NotificationClaude 需要你注意时桌面通知
StopClaude 完成回复时“任务完成”通知

第一步:创建脚本目录并安装依赖

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_envAPI Key 和 Base URL,单独管理方便替换
logger.sh~/.claude/hooks/logger.sh记录所有文件操作和命令执行
security.sh~/.claude/hooks/security.sh拦截危险命令,exit 2 真正阻止

配置完成后你能做到的事

  • Claude Code 直接读取项目文件,不再让你手动复制粘贴
  • 它了解你的习惯和偏好,回复方式符合你的期望
  • API Key 单独管理,更换时只改一个文件
  • 所有文件操作自动记录日志,随时可以审计
  • 危险命令在执行前被拦截,误操作风险大幅降低
  • 任务完成时桌面弹通知,不用一直盯着终端

评论区