Claude AI CLI

Claude 产品矩阵全景

产品形态 适用场景 适合你的工作
Claude.ai (Web/App) 通用对话、方案设计、知识问答 架构设计讨论、概念学习、文档撰写
Claude Code (CLI) 终端内代理式编程 核心推荐:代码编写、调试、远程运维
Claude API 集成到自有系统/脚本 自动化运维、自定义 Bot、CI/CD 集成
Claude in Chrome 浏览器自动化代理 AWS Console 操作、Web 控制台批量操作
Desktop App + MCP 桌面端 + 工具扩展 本地文件操作、多工具协同

Claude Code 与 IDE 集成的完整图谱

┌─────────────────────────────────────────────────────────────────────┐
│ Claude Code 使用形态对比 │
├──────────────────┬──────────────────┬──────────────────────────────┤
│ 形态 │ 适用场景 │ 代表工具 │
├──────────────────┼──────────────────┼──────────────────────────────┤
│ 纯终端 CLI │ SSH 远程服务器 │ iTerm / Windows Terminal │
│ │ 自动化脚本任务 │ + claude 命令 │
├──────────────────┼──────────────────┼──────────────────────────────┤
│ IDE 插件深度集成 │ 日常本地编码 │ VS Code / Cursor / Windsurf │
│ (推荐主战场) │ 代码 Review │ JetBrains 系列 │
├──────────────────┼──────────────────┼──────────────────────────────┤
│ IDE 内嵌终端 CLI │ 混合工作流 │ 任意 IDE 的 Terminal 面板 │
└──────────────────┴──────────────────┴──────────────────────────────┘

官方支持的 IDE 一览

官方插件主要支持两大阵营: VS Code 扩展 (最完善,同样适用于 Cursor IDE,需要 VS Code 1.98.0+)和 JetBrains 插件 (IntelliJ IDEA、PyCharm、WebStorm、GoLand 等)。

编辑器/IDE 集成方式 推荐度 适合人群
VS Code 官方扩展(最完善) ⭐⭐⭐⭐⭐ DevOps 工程师首选
Cursor 官方扩展(同 VS Code) ⭐⭐⭐⭐⭐ 喜欢 AI 原生体验
JetBrains 系列 官方插件 ⭐⭐⭐⭐ Python/Java 开发者
Neovim / Vim 内嵌终端运行 CLI ⭐⭐⭐ 服务器/极客工作流
Sublime / Emacs 内嵌终端运行 CLI ⭐⭐⭐ 老牌编辑器用户
┌────────────────────────────────────────────────────────────────────┐
│ 不同场景下的工具选择决策树 │
└────────────────────────────────────────────────────────────────────┘

你在做什么?

├─ 本地代码开发/重构 ────────► VS Code + Claude Code 扩展 ✅

├─ 远程服务器排障 ──────────► SSH + Claude Code CLI(终端)

├─ 大型架构设计讨论 ─────────► claude.ai 网页版 + 多轮对话

├─ 简单脚本快速写 ──────────► Claude Code CLI(任意目录起手)

├─ 阅读理解大型代码库 ───────► VS Code + Claude Code(@-mention)

└─ CI/CD 中自动化运行 ──────► Claude Code Headless 模式

使用 Claude 高效编码的 10 条铁律

# 铁律 说明
1 先 Plan 后 Code 让 Claude 先输出实施计划再写代码
2 善用 @ 引用 精确传递上下文,避免泛泛而谈
3 多用选区上下文 选中代码再唤起 Claude,无需复述
4 写好 CLAUDE.md 项目”入职文档”是最重要的投资
5 小步快跑 一次只让 Claude 改一件事,及时 Review
6 保持 git 干净 每次 AI 改动前 commit,方便回滚
7 诊断信息驱动 让 lint/test 错误驱动 Claude 修复
8 善用 Checkpoint 改坏了用 IDE 的 checkpoint 回滚 |
9 /clear 重置上下文 长对话变慢就清空重开
10 关键命令进 deny 危险命令必须在 settings 中禁止

安装 Claude Code

# 前提:Node.js 18+ (建议用 nvm 管理)
# 检查 Node 版本
node --version

# 全局安装 Claude Code
npm install -g @anthropic-ai/claude-code

# 验证安装
claude --version

# 首次启动,按提示进行 OAuth 登录
cd ~/your-project
claude

首次运行会通过浏览器 OAuth 完成 API 鉴权,无需手动配置 API Key

Claude 相关的项目配置

强制建议在每个项目根目录创建一个 CLAUDE.md 文件,作为给 Claude 的 上下文(Context)说明书 ,用于介绍项目背景、技术栈、代码规范等。

必须建立的项目配置

your-project/
├── CLAUDE.md # 项目级 Claude 上下文(必须),用于介绍项目背景、技术栈、代码规范等。
├── .claude/
│ ├── settings.json # 项目级 Claude 设置
│ └── commands/ # 自定义 slash 命令,创建 Markdown 文件,就能定义你自己的命令
│ ├── deploy.md
│ └── rollback.md
├── .vscode/
│ ├── settings.json # VS Code 工作区设置
│ └── extensions.json # 推荐扩展列表
└── .gitignore

CLAUDE.md 示例:

CLAUDE.md
# 项目说明:生产环境 EKS 集群运维

## 技术栈
- AWS EKS 1.30, Kubernetes
- Terraform 1.9+ (后端 S3 + DynamoDB)
- Helm 3.15, ArgoCD 2.12
- 操作系统:Amazon Linux 2023 (workstation), Bottlerocket (nodes)

## 目录结构
- `terraform/` - IaC 代码,按环境分目录 (dev/staging/prod)
- `helm-charts/` - 自定义 Helm chart
- `argocd/` - ArgoCD Application 定义
- `scripts/` - Python/Bash 自动化脚本

## 编码规范
- Terraform: 使用 `terraform fmt`,模块化设计
- Python: 遵循 PEP 8,使用 type hints,必须有 docstring
- Shell: 使用 `set -euo pipefail`,避免 bashism

## 安全约束
- 禁止在代码中硬编码任何 secrets
- 所有 AWS 凭证通过 IAM Role + IRSA
- 修改 prod 环境前必须先在 staging 验证

## 常用命令
- 部署到 dev: `make deploy ENV=dev`
- 查看 EKS 集群: `aws eks update-kubeconfig --name prod-cluster --region ap-southeast-1`

.claude/settings.json 内容示例:

.claude/settings.json
{
"model": "claude-sonnet-4-5",
"permissions": { # 不在 allow 和 deny 列表中的命令,默认会请求你授权
"allow": [ # 列表中的命令 Claude 可以自动执行无需确认(安全的只读/格式化操作)
"Bash(terraform fmt:*)",
"Bash(terraform validate)",
"Bash(terraform plan)",
"Bash(kubectl get:*)",
"Bash(kubectl describe:*)",
"Bash(helm lint:*)"
],
"deny": [ # deny 列表中的命令 Claude 绝对不能执行(破坏性操作)
"Bash(terraform apply:*)",
"Bash(kubectl delete:*)",
"Bash(rm -rf:*)"
]
}
}

一定要注意: settings.json 是”软约束”,不是”硬隔离”。settings.jsonpermissions 是”权限提示层”,它能拦截 Claude 主动发起的危险命令, 但无法防御 命令变形绕过(rm 写成 /bin/rm、用变量拼接)、通过脚本间接执行(写个 .sh 再跑)、通过已 allow 的工具造成的间接破坏

Claude 在生产环境中的配置参考

在生产环境中的服务器上使用 Claude,既要能让 Claude 充分发挥其能力,又要对其做出合理的限制,防止误操作或者权限溢出而对生产环境造成事故。

参考文件结构如下

~/projects/prod-ops/                    # 本地项目目录(VS Code 打开这里)
├── CLAUDE.md # 行为引导
├── .claude/
│ ├── settings.json # 项目级权限(提交到 git)
│ ├── settings.local.json # 个人临时覆盖(不提交 git)
│ └── hooks/
│ └── pretooluse-guard.sh # 执行前拦截脚本
├── ansible/
├── terraform/
└── scripts/

CLAUDE.md

这是第一道防线,也是最容易被忽视的一道。它的作用是从源头降低 Claude 尝试危险操作的概率。

参考 claude_rules.md 文件获取详细的行为规范和使用指南。

.claude/settings.json

这是第二道防线,提交到 git 仓库,团队共享。

{
"permissions": {
"defaultMode": "default",

"deny": [
"Bash(rm:*)",
"Bash(rmdir:*)",
"Bash(mv:*)",
"Bash(dd:*)",
"Bash(mkfs:*)",
"Bash(shred:*)",
"Bash(truncate:*)",
"Bash(sudo:*)",
"Bash(su:*)",
"Bash(doas:*)",
"Bash(chmod:*)",
"Bash(chown:*)",
"Bash(chgrp:*)",
"Bash(passwd:*)",
"Bash(useradd:*)",
"Bash(userdel:*)",
"Bash(usermod:*)",
"Bash(systemctl stop:*)",
"Bash(systemctl restart:*)",
"Bash(systemctl disable:*)",
"Bash(systemctl mask:*)",
"Bash(service:*)",
"Bash(kill:*)",
"Bash(killall:*)",
"Bash(pkill:*)",
"Bash(reboot:*)",
"Bash(shutdown:*)",
"Bash(halt:*)",
"Bash(poweroff:*)",
"Bash(init:*)",
"Bash(iptables:*)",
"Bash(nft:*)",
"Bash(ufw:*)",
"Bash(firewall-cmd:*)",
"Bash(crontab:*)",
"Bash(at:*)",
"Bash(mount:*)",
"Bash(umount:*)",
"Bash(fdisk:*)",
"Bash(parted:*)",
"Bash(lvremove:*)",
"Bash(vgremove:*)",
"Bash(docker rm:*)",
"Bash(docker rmi:*)",
"Bash(docker stop:*)",
"Bash(docker kill:*)",
"Bash(docker system prune:*)",
"Bash(docker volume rm:*)",
"Bash(docker-compose down:*)",
"Bash(kubectl delete:*)",
"Bash(kubectl drain:*)",
"Bash(kubectl cordon:*)",
"Bash(kubectl scale:*)",
"Bash(kubectl apply:*)",
"Bash(kubectl edit:*)",
"Bash(kubectl patch:*)",
"Bash(kubectl replace:*)",
"Bash(kubectl rollout:*)",
"Bash(helm install:*)",
"Bash(helm upgrade:*)",
"Bash(helm uninstall:*)",
"Bash(helm rollback:*)",
"Bash(helm delete:*)",
"Bash(terraform apply:*)",
"Bash(terraform destroy:*)",
"Bash(terraform import:*)",
"Bash(terraform state rm:*)",
"Bash(terraform state mv:*)",
"Bash(aws ec2 terminate-instances:*)",
"Bash(aws ec2 stop-instances:*)",
"Bash(aws rds delete:*)",
"Bash(aws s3 rb:*)",
"Bash(aws s3 rm:*)",
"Bash(mysql:*)",
"Bash(psql:*)",
"Bash(mongo:*)",
"Bash(redis-cli:*)",
"Read(**/secrets/**)",
"Read(**/*.pem)",
"Read(**/*.key)",
"Read(**/id_rsa)",
"Read(**/id_ed25519)",
"Read(**/.aws/credentials)",
"Read(**/.ssh/**)",
"Read(**/kubeconfig)",
"Write(/etc/**)",
"Write(/usr/**)",
"Write(/bin/**)",
"Write(/sbin/**)",
"Write(/var/**)",
"Write(/boot/**)",
"Write(/root/**)",
"Edit(/etc/**)",
"Edit(/usr/**)",
"Edit(/var/**)",
"WebFetch"
],

"ask": [
"Bash(git push:*)",
"Bash(git reset:*)",
"Bash(git checkout:*)",
"Bash(git clean:*)",
"Bash(docker exec:*)",
"Bash(docker run:*)",
"Bash(kubectl exec:*)",
"Bash(kubectl cp:*)",
"Bash(kubectl port-forward:*)",
"Bash(scp:*)",
"Bash(rsync:*)",
"Bash(curl:*)",
"Bash(wget:*)",
"Bash(tee:*)",
"Bash(ansible:*)",
"Bash(ansible-playbook:*)",
"Bash(terraform plan:*)",
"Bash(npm install:*)",
"Bash(pip install:*)",
"Write(*)",
"Edit(*)"
],

"allow": [
"Bash(ls:*)",
"Bash(pwd)",
"Bash(cd:*)",
"Bash(cat:*)",
"Bash(head:*)",
"Bash(tail:*)",
"Bash(less:*)",
"Bash(more:*)",
"Bash(grep:*)",
"Bash(egrep:*)",
"Bash(rg:*)",
"Bash(find:*)",
"Bash(awk:*)",
"Bash(sed:-n*)",
"Bash(wc:*)",
"Bash(sort:*)",
"Bash(uniq:*)",
"Bash(diff:*)",
"Bash(file:*)",
"Bash(stat:*)",
"Bash(tree:*)",
"Bash(echo:*)",
"Bash(date:*)",
"Bash(whoami)",
"Bash(hostname)",
"Bash(uname:*)",
"Bash(uptime)",
"Bash(id)",
"Bash(env)",
"Bash(ps:*)",
"Bash(top:-b*)",
"Bash(htop:*)",
"Bash(free:*)",
"Bash(df:*)",
"Bash(du:*)",
"Bash(vmstat:*)",
"Bash(iostat:*)",
"Bash(mpstat:*)",
"Bash(sar:*)",
"Bash(lsof:*)",
"Bash(ss:*)",
"Bash(netstat:*)",
"Bash(ip:*)",
"Bash(ping:-c*)",
"Bash(dig:*)",
"Bash(nslookup:*)",
"Bash(host:*)",
"Bash(traceroute:*)",
"Bash(journalctl:*)",
"Bash(dmesg:*)",
"Bash(systemctl status:*)",
"Bash(systemctl list-units:*)",
"Bash(systemctl list-unit-files:*)",
"Bash(systemctl is-active:*)",
"Bash(systemctl is-enabled:*)",
"Bash(systemctl cat:*)",
"Bash(systemctl show:*)",
"Bash(docker ps:*)",
"Bash(docker logs:*)",
"Bash(docker inspect:*)",
"Bash(docker stats:*)",
"Bash(docker images:*)",
"Bash(docker version)",
"Bash(docker info)",
"Bash(docker network ls)",
"Bash(docker volume ls)",
"Bash(kubectl get:*)",
"Bash(kubectl describe:*)",
"Bash(kubectl logs:*)",
"Bash(kubectl top:*)",
"Bash(kubectl version:*)",
"Bash(kubectl config view:*)",
"Bash(kubectl config get-contexts:*)",
"Bash(kubectl api-resources:*)",
"Bash(kubectl explain:*)",
"Bash(kubectl cluster-info)",
"Bash(helm list:*)",
"Bash(helm status:*)",
"Bash(helm get:*)",
"Bash(helm history:*)",
"Bash(helm show:*)",
"Bash(helm lint:*)",
"Bash(helm template:*)",
"Bash(terraform fmt:*)",
"Bash(terraform validate)",
"Bash(terraform version)",
"Bash(terraform show:*)",
"Bash(terraform output:*)",
"Bash(terraform state list)",
"Bash(terraform state show:*)",
"Bash(tflint:*)",
"Bash(ansible --version)",
"Bash(ansible-playbook --check:*)",
"Bash(ansible-playbook --syntax-check:*)",
"Bash(ansible-lint:*)",
"Bash(ansible-inventory:*)",
"Bash(aws sts get-caller-identity)",
"Bash(aws ec2 describe-instances:*)",
"Bash(aws s3 ls:*)",
"Bash(aws eks describe-cluster:*)",
"Bash(aws eks list-clusters:*)",
"Bash(aws cloudwatch describe-alarms:*)",
"Bash(git status)",
"Bash(git log:*)",
"Bash(git diff:*)",
"Bash(git show:*)",
"Bash(git branch)",
"Bash(git remote:-v)",
"Bash(nginx -t)",
"Bash(nginx -T)",
"Read(*)"
],

"additionalDirectories": [],

"disableBypassPermissionsMode": "disable"
},

"model": "claude-sonnet-4-5",

"env": {
"CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC": "1"
}
}
  • defaultMode: "default" : 未匹配任何规则的操作 → 询问用户
  • deny : 硬拦截所有破坏性命令。deny 优先级最高,任何层级都无法覆盖
  • ask : 半危险操作(写文件、curl、git push)→ 弹窗确认
  • allow : 所有只读、诊断类命令 → 自动执行. 充分发挥能力的关键,让 Claude 流畅排查
  • disableBypassPermissionsMode: "disable" : 禁止 --dangerously-skip-permissions ,禁止跳过所有权限检查的 bypass 模式
  • CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC : 关闭非必要网络流量, 生产环境降噪

规则支持精确匹配、前缀通配符(prefix:)和模式通配符()。ToolName 是首字母大写的工具名(如 Bash、Write、Read),括号内是可选的内容模式。

Bash(rm:*)           → 拦截所有以 rm 开头的命令
Bash(kubectl get:*) → 允许所有 kubectl get 子命令
Read(**/.env) → 拦截读取任意路径下的 .env 文件
Write(/etc/**) → 拦截写入 /etc 下任意文件

.claude/settings.local.json

个人临时覆盖(不提交 git)。临时需要某个权限时,在这里加,不污染团队共享的 settings.json 。记得加进 .gitignore

{
"permissions": {
"ask": [
"Bash(terraform plan:*)"
]
}
}

注意: settings.jsondeny 有个致命弱点: 命令变形可以绕过 ,比如:

# settings.json deny 了 "Bash(rm:*)",但这些可能绕过:
/bin/rm -rf /data # 用绝对路径
R=rm; $R -rf /data # 用变量拼接
echo "rm -rf /data" | bash # 通过管道执行

Hooks 让你能在 Claude 执行工具前后触发自己的 shell 脚本,实现更深的自动化和护栏。这是 真正能防住命令变形 的一层。

.claude/hooks/pretooluse-guard.sh

#!/usr/bin/env bash
# PreToolUse Hook —— 在 Claude 执行 Bash 命令前做深度安全校验
# 退出码 2 = 阻止执行;退出码 0 = 放行

set -euo pipefail

# Claude Code 通过 stdin 传入 JSON,包含工具调用信息
INPUT=$(cat)

# 提取实际要执行的命令(需要 jq)
COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command // empty')

# 如果不是 Bash 命令,直接放行
if [[ -z "$COMMAND" ]]; then
exit 0
fi

# ── 危险模式黑名单(正则)──────────────────────────────
# 这里检测的是"语义",能抓住变形后的命令
DANGEROUS_PATTERNS=(
'\brm\s+.*-[rf]' # rm -rf / rm -f(任意位置)
'/bin/rm' # 绝对路径调用 rm
'\bdd\s+' # dd 命令
'\bmkfs' # 格式化
'>\s*/(etc|usr|var|boot|bin|sbin)' # 重定向覆盖系统目录
'\bsudo\b' # 提权
'\bsu\s' # 切换用户
':\(\)\s*\{.*\|.*&\s*\}' # fork bomb
'\bchmod\s+.*777' # 危险权限
'\bsystemctl\s+(stop|restart|disable|mask)'
'\b(kill|pkill|killall)\b'
'\b(reboot|shutdown|halt|poweroff)\b'
'\bkubectl\s+(delete|drain|apply|patch|scale|edit)'
'\bhelm\s+(install|upgrade|uninstall|rollback|delete)'
'\bterraform\s+(apply|destroy|import)'
'\bdocker\s+(rm|rmi|stop|kill|prune)'
'\b(mysql|psql|mongo|redis-cli)\b' # 直连数据库
'curl.*\|\s*(bash|sh)' # curl | bash 远程执行
'wget.*\|\s*(bash|sh)'
'eval\s' # eval 动态执行
)

for pattern in "${DANGEROUS_PATTERNS[@]}"; do
if echo "$COMMAND" | grep -qE "$pattern"; then
# 输出到 stderr,Claude 会看到这个原因
echo "🚫 安全拦截:命令匹配危险模式 [$pattern]" >&2
echo "被拦截的命令:$COMMAND" >&2
echo "如确需执行,请人工在终端手动操作。" >&2
exit 2 # 退出码 2 = 阻止执行
fi
done

# ── 生产环境主机名二次确认 ──────────────────────────
# 如果命令里包含生产环境标识,记录审计日志
if echo "$COMMAND" | grep -qiE 'prod|production'; then
echo "$(date '+%Y-%m-%d %H:%M:%S') [PROD-CMD] $COMMAND" \
>> ~/.claude/audit-prod.log
fi

# ── 全量审计日志 ────────────────────────────────────
echo "$(date '+%Y-%m-%d %H:%M:%S') $COMMAND" >> ~/.claude/audit-all.log

exit 0

添加可执行权限

chmod +x ~/projects/prod-ops/.claude/hooks/pretooluse-guard.sh

在前面的 settings.json 里追加 hooks 配置块

{
"permissions": {
"...": "(前面的权限配置不变)"
},
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "$CLAUDE_PROJECT_DIR/.claude/hooks/pretooluse-guard.sh"
}
]
}
]
}
}

Hook 的价值

  • settings.jsondeny 是字面匹配, hook 是语义/正则匹配
  • Hook 能做上下文感知判断(比如检测主机名、时间窗口)
  • Hook 顺便实现了全量审计日志——这在事故复盘时极其宝贵