type
Post
status
Published
date
Apr 12, 2026
slug
claude-bug
summary
踩坑记:一个官方文档没讲清楚的 root 权限坑
tags
思考
category
技术分享
icon
password
URL

一、故障现象

环境:Windows 10 + Claude Desktop 1.1617.0,服务器是 Ubuntu 24.04。
在桌面端添加 SSH 连接、选好环境、新建会话、授权工作目录——全部都正常。底部状态栏能清楚看到 [email protected]: /root/projectname,SSH 隧道稳稳建立。
但是发消息完全没有响应。
输入 hi 按回车,消息气泡显示出来,然后没有然后了。没有 loading 动画、没有 thinking 状态、没有任何报错、没有红条提示,UI 层面一片死寂,就像消息掉进了黑洞。
与此同时,桌面端的 Chat 标签页完全正常,跟 Claude 聊天秒回。这说明账号、网络、桌面端本身都没毛病,只有 Code + SSH 这个组合是坏的

二、官方文档没讲清楚的两件事

带着问题第一反应是去翻官方文档,结果有两处关键信息严重缺失。
第一,文档说"Claude Code must be installed on the remote machine"(Claude Code 必须安装在远程机器上)。这句话严重误导——我老老实实在服务器上用 nvm + npm install -g @anthropic-ai/claude-code 装了一份,还为了让非交互式 SSH 能找到它调整了 PATH、建了软链接。但实际上桌面端 SSH 连接时会自己下发一套独立的 ccd-cli 二进制到 ~/.claude/remote/ 目录(一个 230MB 的 ELF 可执行文件,版本可能和你系统装的完全不一样)。你手动装的那份 claude 桌面端压根不用。这个"自动下发"机制,文档一个字都没提。
第二,文档从头到尾没有一句话警告"不要用 root 用户 SSH 连接"。对习惯在测试服务器上用 root 的人来说,完全没有任何提示说这会出问题。

三、官方文档里找不到任何解决方案

文档的 Troubleshooting 章节只有几条泛泛而谈的建议:"完全退出桌面端重新打开""检查网络""Windows 用户看 Event Viewer"。这些对"消息发出去没有响应"这种静默失败完全没有帮助——Event Viewer 里什么都没有,桌面端日志文件在 MSIX 沙箱路径里本身就难找,找到了也没有有用信息。
最致命的是桌面端把 ccd-cli 的 stderr 完全吞掉了。用户在 UI 上看不到任何错误,在桌面端日志里看不到,在服务器端的 remote-server.log 里只能看到一行 Read 93 bytes from stderr 但不会告诉你那 93 字节具体写了什么。这是教科书级别的"静默失败"。

四、我浪费的八个小时

因为文档没讲清楚 + 错误信息被吞,我前后折腾了约 8 小时,依次排查了:nvm PATH 问题、/usr/local/bin 软链接、服务器网络连通性、curl api.anthropic.com、账号一致性、SSH 密钥认证、sshd debug 日志、给桌面端装 Proxifier 配 SOCKS5 代理、完全清理 ~/.claude 让桌面端重新下发……这些全部不是原因
最后是通过在服务器上用 pstree 观察进程树、读 ~/.claude/remote/remote-server.log、再写一个 bash wrapper 脚本把 ccd-cli 的 stderr 硬截获下来,才终于看到那行被吞掉的真实报错:
原因水落石出:桌面端为了"Auto accept edits"便利,默认给 ccd-cli 加了 --allow-dangerously-skip-permissions 参数;而 Claude Code CLI 硬编码禁止 root 用户使用这个参数(合理的安全规则——root 权限 + 跳过所有文件确认 = 让 AI 在你服务器上拥有无限权力)。两者相遇,ccd-cli 启动瞬间自检失败、退出。

五、正确的操作流程

如果你打算用 Claude Code 桌面端 SSH 连接 Linux 服务器,请严格按下面的流程走,能帮你跳过所有坑。

第一步:理解两个关键前提

  1. 你完全不需要在 Linux 服务器上提前安装 Claude Code。不用装 Node、不用 npm install、不用配 PATH。桌面端首次建立 SSH 连接时会自动下发一套完整的 remote 环境到 ~/.claude/remote/ 目录。你只需要让服务器能被 SSH 连上就行。
  1. 绝对不要用 root 用户 SSH 连接。必须用普通用户,否则会触发 -dangerously-skip-permissions 的 root 安全限制,表现就是消息发出去永远没有回复。

第二步:服务器上创建普通用户

以 root 身份登录服务器,执行:

第三步:从 Windows 验证 mu 能免密登录

PowerShell 执行:
不问密码直接返回 mu/home/mu,说明密钥配好了。

第四步:在 Claude 桌面端配置 SSH 连接

  1. 完全退出桌面端(任务管理器里确认没有 Claude.exe 残留),重新打开
  1. 切到 Code 标签
  1. 点顶部 environment 下拉 → + Add SSH connection
  1. 填写:
      • Host:你的服务器 IP
      • User:mu必须是普通用户,不要填 root
      • Port:22(或你自定义的 SSH 端口)
      • Identity File:私钥路径,如 C:\Users\你的用户名\.ssh\id_ed25519
  1. 保存

第五步:新建会话,耐心等待首次下发

选中 mu@服务器IP 连接,新建会话。这里是很重要的一步,请耐心:
  • 如果是第一次连接这台服务器,桌面端会自动往服务器上传 ~/.claude/remote/ 目录,包括 server 守护进程和约 230MBccd-cli/<版本> 二进制。这个下发过程可能需要 1–3 分钟(取决于网速),桌面端 UI 可能不会显示明确进度。请耐心等待,不要反复取消重来,也不要以为卡死了
  • 下发期间你可以在另一个终端 SSH 进服务器,执行 watch -n 1 'ls -la ~/.claude/remote/' 观察目录是否在增长,确认桌面端确实在传文件
  • 如果需要授权工作目录,选 /home/mu/projects(不要选 /root/ 下的任何目录,mu 用户没权限)
  • 如果要求登录 Claude 账号,走 OAuth 登录一次
下发完成后,发一条 hi 测试,应该立刻收到回复。

第六步(可选但强烈推荐):禁用 root SSH 登录

既然已经有了非 root 用户,顺手把 root 的 SSH 登录禁掉,符合生产服务器最佳实践:
做这步之前务必先确认 mu 用户能正常登录并能 sudo,否则有把自己锁在门外的风险。

几个关键注意事项

  • 文件权限:之后 Claude 编辑的文件默认都是 mu 用户的权限。如果你的项目原本在 /root/ 下或归属 root,需要先 chown -R mu:mu /path/to/project 把所有权交给 mu,否则 Claude 没法写入
  • 不要试图绕过安全规则:有人可能想"那我就用 sudo claude 吧"——这同样会被 block,而且破坏了安全模型的意义
  • 如果你已经踩过坑:rm -rf ~/.claude 清理残留(桌面端会重新下发),之前建的 /usr/local/bin/claude 软链接可以删,nvm 里 npm uninstall -g @anthropic-ai/claude-code 也可以卸载——桌面端根本不用它们

结语

整件事最让人无奈的不是技术问题本身——报错信息其实非常清楚:--dangerously-skip-permissions cannot be used with root/sudo privileges for security reasons,一句话说完,甚至直接指出了解决方向(别用 root)。
问题在于三个小坑叠加:官方文档没提醒不能用 root、官方文档没说清楚 Claude Code 会自动下发不用预装、桌面端 UI 完全吞掉了 ccd-cli 的 stderr。让一个五秒钟就能解决的问题,变成了八个小时的排查地狱。
希望这篇文章能让后来者直接跳到第五步,五分钟搞定。如果你也觉得这个静默失败应该被修复,可以去 https://github.com/anthropics/claude-code/issues 提 issue 支持一下。
一句话总结:用 Claude Code 桌面端连 Linux 服务器,不要用 root 登录,创建一个普通用户,仅此而已。
使用PM2启动Notionnext实现多开和进程守护自用Tiktok线路公开
Loading...