SSD Nodes Learn Hosting plans →
指南 Matt Connor作者: Matt Connor · 更新于 2026-10-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 命令时,会先显示确切的编辑内容或命令,然后等待您确认。您可以只批准当前操作,也可以让它不再询问。对于文件编辑,后一种选择只持续到会话结束;但对于 shell 命令,该选择会永久保存到对应的代码仓库和命令中,因此您在服务器上快速确认一次后,即使会话结束,该设置仍然有效。对于希望明确保留的规则,设置文件包含持久的允许、询问和拒绝列表。例如:允许 git status,对 git push 询问,拒绝读取 .env。拒绝规则始终优先。这个默认行为也发生了变化。自动模式由分类器代替您审查操作。对于 Pro、Max 和 Team 计划,自动模式于 2026 年 8 月 14 日成为新会话的默认模式;从 Claude Code v2.1.283 开始,除非您固定了默认模式,它还成为所有计划的交互式终端和 VS Code 会话的内置起始模式。因此,在决定服务器应运行哪种模式之前,最好先了解每种权限模式实际允许执行的操作。

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

--dangerously-skip-permissions 的作用

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

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

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

Claude Code 内置沙箱

在开始设置权限阶梯前,请先了解:Claude Code 现在为其运行的命令提供 OS 级沙箱,因此过去使用 skip 标志的大多数理由已经不复存在。在 Linux 上,它使用 bubblewrap 隔离文件系统,并使用 socat 通过代理转发网络流量。在沙箱内,命令只能写入项目目录和会话临时目录,并且只能通过代理访问网络;代理会将每个域名与允许列表进行比对。命令首次访问新域名时,Claude Code 会询问您;在自动模式下,分类器会改为审核新的主机。

在会话中使用 /sandbox 命令启用它。在 Ubuntu 和 Debian 上,请先安装所需的两个软件包:

sudo apt install bubblewrap socat

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

沙箱提供自动允许模式:沙箱内的命令无需提示即可运行,因为现在由强制边界完成原先由提示完成的工作。无法在沙箱内运行的命令会回退到正常的权限流程,因此真正异常的操作仍会询问。对于大多数服务器工作流,这正是 skip 标志的正确替代方案,因为您可以在 OS 强制边界的保护下大幅减少询问,而不是完全取消询问。

请正确认识它的限制。默认情况下,沙箱内的命令仍可读取大多数文件系统内容,包括凭据文件,除非您拒绝访问这些路径;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 上运行代理,让它使用沙箱并以非特权用户身份运行,几乎不会增加成本,还能让故障处理变得简单。目标就是让故障处理变得简单。

保护凭据

这条规则可以避免其他问题:agent 的用户不得读取属于其他对象的机密。

只将 API key 提供给 agent,不要提供给其他对象。将它放在由 agent 用户拥有且权限为 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/* 检查,并修复 agent 账户可以列出的任何内容。

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

Git 是安全网

代理提交的每项更改都可以审查和回滚。如果代理在分支上工作,并在执行过程中持续提交,Git 会免费提供这两项能力:

git switch -c agent/refactor-auth

代理从未提交的工作没有这种保护:git reset --hard 会丢弃对已跟踪文件的未提交更改,而 Git 完全不会覆盖仓库之外的任何内容。运行结束后,使用 git diff main...agent/refactor-auth 查看它提交了什么,然后在该分支上使用 git status 和 git diff HEAD 查看它留下的未提交内容。保留有价值的更改;如果这次运行没有产生有用结果,则删除该分支。只修改了三个文件的运行结果,远比重写模块一半的结果更容易在早餐时阅读;实际操作中,要求代理采用能够解决问题的最小更改正是如此。应在代码托管平台一侧保护主分支,确保代理的令牌无法向其推送,也无法在任何位置强制推送。提交历史还可作为你休息期间发生了什么的审计日志,其价值超过终端滚动输出的任何数量。

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

代理可以运行 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 密钥;为每个代码仓库使用独立的部署密钥;所有更改都在合并前由你审核。如果运行出错,只需撤销一个令牌并恢复快照,不会影响你拥有的其他资源。