SSD Nodes Learn Hosting plans →
指南 Matt Connor作者: Matt Connor · 更新于 2026-08-13

如何在服务器上安全运行Claude Code

Claude Code 可执行您用户权限内的任意命令。了解跳过权限标志改变了什么,以及如何用沙箱、容器或一次性VPS限制错误操作的影响范围。

在服务器上安全运行 Claude Code 的含义

要在服务器上安全运行 Claude Code,应保留权限提示,让它以专用非特权用户运行,并为无人值守运行提供实际隔离边界,而不是依赖信任:可以使用内置沙箱、容器,或不保存重要数据的一次性 VPS。--dangerously-skip-permissions 标志会移除模型与 shell 之间的审批步骤。对于无人值守任务,这种取舍可以接受,但前提是运行环境处于隔离边界内,以限制错误命令可能访问的范围。本指南将说明该标志实际改变的内容,以及如何逐步构建隔离性不断增强的边界。

Claude Code 在您的服务器上可以做什么

Claude Code 是在终端中运行的编码代理。它会以启动它的用户身份读取文件、写入文件并运行 shell 命令。这就是该工具的全部价值:它可以克隆代码仓库、编辑代码、运行测试、读取失败信息,然后循环修复代码,无需您逐条输入命令。如果您还没有在服务器上完成配置,使用 tmux 在 VPS 上运行 Claude Code介绍了安装和会话管理方法。本页介绍 Claude Code 运行后您授予它的权限。

风险就在这句话本身。以您的用户身份运行 shell 命令的进程,可以执行您的用户能够执行的任何操作。它可以读取 ~/.ssh/id_ed25519~/.aws/credentials 以及您的用户能够打开的所有 .env 文件。它可以运行 curl,并向服务器能够访问的任何主机发送数据。它可以运行 git push --force。代理本身没有动机。真正的风险在于任务执行错误,或者它在工作过程中读取的文本包含他人写入的指令,例如它抓取的网页,或要求它修复的问题中的评论。后一种情况称为提示注入,这也是为什么“模型通常能够正确判断”不能作为安全方案。指令也可能来自更近的位置,因为同一台服务器上的两个 Claude Code 会话可以相互发送文本,而来自同级会话的消息对接收方代理来说也只是它读取的更多文本。您应针对最坏的执行结果进行规划,而不是只按平均情况规划。

用通俗语言理解权限系统

Claude Code 开箱即用时,会在执行操作前询问您。在项目内读取文件不会显示提示,但编辑文件或运行 shell 命令时,会先显示确切的编辑内容或命令,并等待您确认。您可以批准单个操作,也可以批准同类操作在本次会话中继续执行。这些批准仅对当前会话有效:退出 CLI 后,下次会话会重新采用谨慎模式。对于需要长期保留的规则,设置文件包含持久化的允许、询问和拒绝列表。例如:允许 git status,对 git push 进行询问,拒绝读取 .env。拒绝规则始终优先。这个默认基础也在变化,因为 auto 模式将在 14 August 2026 成为默认模式。因此,在决定一台您无法持续监控的服务器应运行哪种模式前,最好先了解每种权限模式实际允许执行哪些操作

这种设计假定有人正在观察终端,而在笔记本电脑上通常确实如此。但在服务器上,很多时候恰恰没有人监控。您在 tmux 中启动一项长时间任务后去睡觉,代理如果在凌晨 2 点暂停并等待回答,就会一直停滞到早上。暂停不仅浪费时间,也会增加成本,因为闲置的 Claude Code 会话会失去其热提示缓存,下一轮需要付费重新构建缓存。这就是人们在服务器上使用 skip 标志的真实原因,它解决的问题也确实存在。本指南的其余部分将介绍如何解决这个问题,同时不放弃所有防护措施。

--dangerously-skip-permissions 的作用

claude --dangerously-skip-permissions 会关闭审批步骤。编辑操作无需提示即可执行。Shell 命令无需提示即可运行。通常用于保护敏感位置的受保护路径检查也会被跳过。您明确配置的拒绝规则仍然生效,少数极端操作仍会暂停并请求确认,但总体上可以这样理解:模型决定运行什么,就会运行什么。

在服务器上使用此标志时,有两点需要注意。第一,在 Linux 和 macOS 上,如果 Claude Code 以 root 身份运行,或通过 sudo 运行,该标志会被禁止,因为无需提示的 root 权限可以修改机器上的任何文件或服务。无论如何,代理都应使用自己的非特权账户运行,而该标志会强制执行这一要求。第二,该标志不会以任何方式改变模型的行为。它只会让人工退出执行流程,不会改变其他内容。因此,原本会被提示拦截的每个错误,现在都会直接执行。

因此,实际的判断方式很明确。如果跳过权限检查,安全问题就会从“代理是否会执行有害操作”变成“一次错误操作可能造成多大损害”。您不再试图控制每个决策,而是开始控制影响范围。答案是进行隔离,而隔离可以分为多个级别。

内置的 Claude Code 沙箱

在介绍这些阶梯之前,请先了解:Claude Code 现在为其运行的命令提供操作系统级沙箱,这消除了用户使用 skip flag 的大部分原因。在 Linux 上,它使用 bubblewrap 隔离文件系统,并通过 socat 将网络流量转发到代理。沙箱内的命令只能写入项目目录和会话临时目录,并且只能通过代理访问网络;代理会将每个域名与允许列表进行比对。命令首次访问新域名时,Claude Code 会询问您。

在会话中运行 /sandbox 命令即可启用。Ubuntu 和 Debian 需要先安装它依赖的两个软件包:

sudo apt install bubblewrap socat

在 Ubuntu 24.04 及更高版本中,默认的 AppArmor 策略会阻止 bubblewrap 创建所需的用户命名空间。沙箱面板会提示缺少的组件,Claude Code 沙箱文档中也提供了解决此问题所需的简短 AppArmor 配置文件。

沙箱支持自动允许模式:沙箱内的命令无需提示即可运行,因为强制执行的边界现在承担了原先由提示承担的控制作用。无法在沙箱内运行的命令会回退到常规权限流程,因此真正不常见的操作仍会要求确认。对于大多数服务器工作流,这是替代 skip flag 的正确方式,因为在操作系统强制执行的边界下,您会遇到少得多的询问,而不是完全没有限制。

请明确了解它的限制。默认情况下,沙箱内的命令仍可读取文件系统中的大多数内容,包括凭据文件,除非您拒绝访问这些路径;sandbox.credentials 设置正是用于此目的。网络代理会检查域名,但不会检查流量本身,因此像 github.com 这样的宽泛允许规则仍可能让数据被传出。Docker 无法在沙箱内运行。沙箱显著提高了最低安全水平,但不是完整的隔离边界。因此,下面的阶梯仍然重要。

隔离梯度

共3级,隔离程度依次提高。根据服务器上还运行着哪些内容,选择满足需求的最低级别。

第1级:专用非特权用户。 为代理创建独立账户、独立主目录和独立项目目录,并且不授予 sudo 权限:

sudo adduser --disabled-password --gecos "" agent

账户边界可防止代理访问您的文件,包括 SSH 密钥和服务器上的其他项目。它还使跳过标志具备实际可用性,因为该标志拒绝以 root 身份运行。这与让每个服务都以非特权用户运行遵循相同原则,只是应用对象变成了代理。第1级无法隔离网络,也无法隔离服务器上所有对全局可读的内容。

第2级:容器。 Anthropic 发布了一个参考 devcontainer。它以非 root 用户运行 Claude Code,并通过防火墙规则限制代理可以访问的主机。自行构建的容器也可以实现相同效果。文件系统范围缩小为您挂载的卷,出站流量范围缩小为容器规则允许的内容。当服务器还承载其他重要服务时,这是合适的中间级别。它的限制在于,容器与主机共享内核;一次不慎的挂载就会破坏隔离边界。将 /var/run/docker.sock 交给容器后,它就可以访问整个主机。

第3级:专用 VPS。 最高级别也是最直接的做法:为代理提供一台完整的机器,里面不存放任何重要内容。小型 VPS 每月只需几美元。按照新 VPS 上线后的前10分钟操作手册完成配置,保存干净状态的快照,然后让代理开始工作。服务器上不运行其他内容。不放个人 SSH 密钥,只放一个权限限定到单个仓库的部署密钥。不放云凭据,也不放生产数据。运行出错时,或者您只是想恢复干净环境时,可以在几分钟内恢复快照,或销毁并重新构建服务器。影响范围就是 VPS 的租金成本。在这种配置下,--dangerously-skip-permissions 不再令人担忧,因为最坏的实际结果只是重建服务器并撤销一个令牌。

这些级别可以叠加。在一次性 VPS 上运行代理,让它使用沙箱并以非特权用户身份运行,几乎不会增加成本,还能让故障处理变得简单。目标就是让故障处理变得简单。

保护凭据

这条规则优先级最高:代理的用户不得读取属于其他任何对象的机密。

只将 API key 提供给代理,不要提供给其他对象。将其放入由代理用户拥有且权限为 600 的文件中,并在 shell 启动时加载:

install -m 600 /dev/null /home/agent/claude.env
echo 'export ANTHROPIC_API_KEY=your-key-here' >> /home/agent/claude.env
echo 'source ~/claude.env' >> /home/agent/.bashrc

然后限制反方向的访问。在 Debian 和 Ubuntu 上,主目录通常会默认允许主机上的所有用户读取,因此请收紧您自己的主目录权限:chmod 750 /home/youruser。使用 ls -ld /home/* 检查,并修复代理账户能够列出的所有内容。

为每个令牌限定范围。将细粒度 GitHub token 限制为一个仓库,或使用每个仓库专用的 deploy key。这样即使凭据泄露,也只会影响一个项目,而不会影响整个账户。如果使用 sandbox,请添加其凭据设置,确保即使是读取操作也会拒绝 ~/.ssh~/.aws。生产凭据应始终保留在其他位置,因为从未存放在主机上的机密不可能被代理泄露。如果这些机密存储在自托管密码管理器中,请将其部署在与代理不同的主机上,并单独进行安全审查,因为 Vaultwarden 的薄弱点在于 admin token 和备份文件,而不是加密后的密码库本身。

Git 是安全网

代理执行的每项更改都应可供审查和回滚。如果代理在分支上工作,git 可以免费提供这两项能力:

git switch -c agent/refactor-auth

执行完成后,使用 git diff main...agent/refactor-auth 检查运行结果,合并有价值的更改;如果这次运行没有产生有用结果,则删除该分支。只修改了三个文件的运行结果,远比重写半个模块的结果更容易在早餐时快速审阅。这也是 要求代理只执行能够解决问题的最小更改的技能 的实际价值所在。在代码托管平台一侧保护主分支,确保代理使用的令牌无法推送到主分支,也无法执行强制推送。提交历史还可作为审计日志,记录您休息期间发生的更改,其价值超过终端滚动输出的任何数量。

网络属于爆炸半径的一部分

代理可以运行 curl。这句话概括了整个出站流量问题:代理能够读取的任何内容,也能够发送到其他位置;受到提示注入的代理可能会这样做。普通非特权用户完全无法限制这一点,因为任何用户都能访问服务器能够访问的所有资源。沙箱通过代理按域名限制访问范围。容器可以通过自身的防火墙规则限制访问范围。专用 VPS 会从源头限制可泄露的数据,这是三种方案中最稳健的做法。

不要只依赖 ufw 解决出站流量问题。ufw 默认允许所有出站流量,而编写同时允许 apt、npm、git 和 Claude API 的出站规则很繁琐,也可能在不易察觉的情况下失效。应在沙箱、容器或机器层面选择边界,在这些层面通过域名允许列表或使用一台独立机器即可清晰地实现相同目标。

如果您是通过 API 构建自己的代理,而不是运行 Claude Code,适用的思路完全相同。在 VPS 上使用 Claude 构建 AI 代理介绍了这条路径;该代理同样应使用专用用户、范围受限的令牌和可随时丢弃的机器。

先加固服务器

无论选择哪一档,在 agent 部署到服务器之前,机器本身仍需完成基础加固:仅允许使用 SSH 密钥登录、禁止 root 登录、配置默认拒绝的防火墙,并启用自动安全更新。请在此生成检查清单,然后逐项执行一次:

ToolHarden the box before the agent moves in

FAQ

在服务器上使用 --dangerously-skip-permissions 安全吗?

不能仅凭该选项保证安全。此标志会取消所有审批提示,因此模型生成第一个危险命令后,它会立即执行。只有在严格控制影响范围时,这才是可以权衡的方案:至少使用专用的非特权用户;对于真正无人值守的任务,则使用只承载一个项目和一个限定权限令牌的容器或一次性 VPS。绝不要在存有生产凭据或不可丢失数据的机器上使用它。

Claude Code 是否提供沙箱?

是。Claude Code 内置了用于 shell 命令的沙箱,可通过 /sandbox 命令启用。Linux 上使用 bubblewrap,macOS 上使用 Seatbelt;它将写入范围限制在项目目录内,并通过仅允许访问已批准域名的代理转发网络访问。其自动允许模式会在不提示的情况下运行沙箱内的命令,因此在保留操作系统强制隔离边界的同时,能够像跳过权限标志一样减少中断。它不是完整的隔离边界,因此对于无人值守运行,应结合使用专用用户或专用机器。

为什么跳过权限标志拒绝以 root 身份运行?

因为在没有权限提示的情况下,root 可以修改系统上的任意文件和服务,所以 Claude Code 在 Linux 和 macOS 上以 root 身份或通过 sudo 运行时会阻止 --dangerously-skip-permissions。正确做法不是绕过检查。为代理创建一个非特权用户,并以该用户运行;用户边界是第一层、成本最低的隔离措施。

Claude Code 能读取我的 SSH 密钥和 .env 文件吗?

它可以读取运行用户有权限读取的所有内容;即使是沙箱的默认策略,在你明确拒绝之前,也允许读取凭据路径。因此,应让代理以独立用户运行,将你自己的主目录权限设为 750 或更严格,在沙箱设置中拒绝凭据路径,并完全避免在该机器上存放生产密钥。机器从未持有的密钥就无法被读取或泄露。

无人值守运行 Claude Code 的最安全方式是什么?

使用一台仅用于代理任务的低成本专用 VPS:在十分钟内完成加固,创建干净快照;以非特权用户运行启用沙箱的 Claude Code;使用权限为 600 的文件保存 API 密钥;为每个代码仓库使用独立的部署密钥;所有更改都在合并前由你审核。如果运行出错,只需撤销一个令牌并恢复快照,不会影响你拥有的其他资源。