最近我在好几台无桌面环境的机器上设置了vibe coding环境,作为记录。操作环境都是基于arch linux的服务器,没有图形界面,完全通过命令行操作。

安装mise

通过 paru -S mise 或者 yay -S mise 安装mise。 官方文档 https://mise.jdx.dev/getting-started.html

Shell配置

如果你使用的是zsh或者fish,需要参考官方文档进行相关的设置

fish

一键配置

curl https://mise.run/fish | sh
# Installs mise and adds activation to ~/.config/fish/config.fish

或者手动在你的fish配置加入

# ~/.config/fish/config.fish
if status is-interactive
  mise activate fish | source
else
  mise activate fish --shims | source
end

mise的更新版本策略。在 mise 的配置中,通常有一个叫作 minimum_release_age(最低发布时限)的设定(比如设定为 3 天或 7 天)。它的意思是:一个新版本发布后,必须在官方服务器上“沉淀”满指定的时间,mise 才会认为它是安全的并允许升级。

mise settings set minimum_release_age 1

zsh

一键配置

curl https://mise.run/zsh | sh
# Installs mise and adds activation to ~/.zshrc

手动配置

# ~/.zprofile or ~/.zshrc
eval "$(mise activate zsh --shims)"

bash

一键配置

curl https://mise.run/bash | sh
# Installs mise and adds activation to ~/.bashrc

手工配置

# ~/.bash_profile or ~/.bash_login or ~/.profile
eval "$(mise activate bash --shims)"

安装编程环境

mise use -g nodejs bun rust go

不同的编码环境可能需要配置国内的各种镜像源,请自行查阅相关文档进行配置。

安装编程Agent

mise use -g claude-code codex opencode github:can1357/oh-my-pi

后续要全部更新 执行 mise upgrade 就可以了。

mise不具备加速功能,有些工具需要自备代理才能正常下载 oh-my-pi使用deepseek 参考 DeepSeek官网说明

安装serverless浏览器

可以通过安装agent-browser来实现serverless浏览器的功能。arch用户安装命令

paru -S agent-browser

但是agent-browser只是一个壳子,可以通过agent-browser install来自动安装chrome。如果你倾向于使用轻量级的,可以通过 paru -S lightpanda来安装lightpanda浏览器

参考

安装herdr

herdr号称agent的tmux,安装还是很简单的,直接 paru -S herdr-bin 即可。然后在远程主机上运行herdr即可使用。

使用tips

  • 如果herdr升级,可能需要herdr server stop 以后才能继续使用
  • 如果claude被升级干掉,可以用 claude -r恢复会话,参考附录
  • 0.5.6版本新增了 herdr –remote ,这样您就可以将 Herdr 用作远程服务器的瘦客户端,而无需事先通过 SSH 连接。Herdr 通过 SSH 连接,在需要时引导匹配的远程 herdr 二进制文件,自动启动远程服务器,并将高效的终端视图流式传输回您的本地终端。

Agent跨设备同步

Agent配置

在有界面的设备上,使用cc-switch配置好,然后通过webdav上传配置到云端。

桌面端的可以使用 paru -S cc-switch-bin 安装cc-switch。

同步到无头设备

在无桌面环境的设备上,通过命令安装 paru -S cc-switch-cli 安装cc-switch-cli。通过命令cc-switch打开程序,在菜单 “配置-webdav同步”,设置好webdav的地址和账号密码后,选择“webdav下载到本地”就行了。

SSH安全策略

在内网设备通过跳板机/NAT 转发对外提供 SSH 访问的场景下,sshd 收到的连接源 IP 永远是转发节点的内网地址,导致传统的 Match Address 方案无法区分流量来源。此时可以利用 Match LocalPort 在同一台机器上实现两套独立的认证策略。

核心思路

在目标机器上同时监听两个端口:

  • 外网端口(如 2022):由转发节点暴露到公网,仅允许密钥认证,对应较高安全策略
  • 内网端口(如 2023):仅在内网可达,允许密钥和密码认证,方便内网开发调试

安全边界由转发节点的防火墙规则保障——2023 端口不对外暴露,从根本上杜绝密码认证被公网触达的可能,而非依赖 sshd 自身的 IP 判断。 sshd 配置

Port 2022
Port 2023
PermitRootLogin yes
PubkeyAuthentication yes
PasswordAuthentication no
KbdInteractiveAuthentication no
ChallengeResponseAuthentication no
UsePAM yes

Match LocalPort 2022
    PasswordAuthentication no
    KbdInteractiveAuthentication no

Match LocalPort 2023
    PasswordAuthentication yes
    KbdInteractiveAuthentication yes

转发节点防火墙规则

只将外网端口暴露出去,内网端口仅允许内网网段访问:

# 仅放行内网对 2023 端口的访问
iptables -A INPUT -p tcp --dport 2023 -s 10.10.68.0/24 -j ACCEPT
iptables -A INPUT -p tcp --dport 2023 -j DROP

注意事项

Match 块必须置于全局指令之后,且块内指令不可与全局指令交叉混写 修改配置后先执行 sshd -t 验证语法,再 systemctl reload sshd 生效,不要直接 restart,避免打断已有连接 内网端口开启密码认证的前提是密码本身足够强,建议配合 fail2ban 防止暴力破解

附录

Claude Code Session 管理指南

核心概念

Session 是 Claude Code 保存的完整对话历史,包括你的提示词、每一次工具调用、文件读取记录和 Claude 的回复。进程退出后 session 自动写入磁盘,随时可以恢复。

重要:session 保存的是对话上下文,不是文件系统状态。Claude 对文件做的修改是真实发生的,不随 session 恢复而回滚。


恢复 Session 的三种方式

命令 行为 适合场景
claude -c / --continue 继续当前目录最近一次 session 同一个 repo,快速接着干
claude -r / --resume 按名称或 UUID 恢复指定 session 多任务并行,精确跳回某个 session
claude -r(无参数) 打开交互选择器,手动挑选 忘记名字或 ID 时
# 继续最近一次 session
claude -c

# 交互选择器
claude -r

# 按名称恢复(实验性,见下方说明)
claude -r "auth-refactor"

# 按 UUID 恢复(最可靠)
claude -r "9ecddef3-b9e9-47c1-83b2-2e02ce005005"

# 恢复并立即发送提示
claude -r "auth-refactor" "继续完成单元测试"

交互选择器快捷键:

  • P — 预览对话内容
  • R — 重命名 session
  • 直接输入关键词可过滤

Session 名称

名称从哪来
  • 自动生成:不命名时系统根据对话内容自动生成一个名称,通常比较泛,不好区分
  • 手动命名:在 session 内执行 /rename <名称>
# 会话中执行
/rename auth-refactor
/rename payment-debug

# 不带参数:让 Claude 根据对话自动生成名称
/rename
名称只是展示标签

真正的唯一标识是 UUID,不是名称。

  • 两个 session 可以重名,Claude Code 不会阻止
  • claude -r "name" 目前按名称匹配属于实验性功能,不保证准确(见 GitHub issue #54796)
  • 同名 session 在选择器中会同时出现,需靠时间戳或 P 预览区分
  • 可以配合 /color 给 session 设置颜色(如 /color blue),多开终端时便于视觉区分
最佳实践
# 加项目前缀,避免重名
/rename myapp-auth-refactor
/rename myapp-payment-debug

session 结束时终端会打印:

Resume this session with: claude --resume <uuid>

保存这个 UUID 是最可靠的做法,适合在脚本或自动化中使用。


进程被 Kill 后能恢复吗

能。 无论是手动 Ctrl+C、终端关闭、进程被强制 kill,还是机器重启,只要 ~/.claude/projects/ 目录完好,session 数据就不会丢失。

恢复时整个消息历史会被完整还原,包括:

  • 已读取的文件内容
  • 已执行的命令记录
  • 之前所有的对话上下文

Session 永不过期,数月前的 session 同样可以恢复。


已知 Bug 和注意事项

Bug 1:恢复后 skip-permissions 丢失

--dangerously-skip-permissions 启动的 session,通过 -r 恢复后该 flag 不会自动还原,进程恢复为普通权限模式(GitHub issue #21974)。

解决方法:恢复时手动带上 flag:

claude -r "your-session" --dangerously-skip-permissions
# 或
claude -r "your-session" --permission-mode bypassPermissions
Bug 2:skip-permissions 中途自动关闭

--dangerously-skip-permissions 启动后,在长时间运行的 session 中(尤其触发上下文压缩时),permission mode 可能中途自动重置,通过 Shift+Tab 重拨也无法持久生效(GitHub issue #45290)。

建议替代方案:使用 --permission-mode auto,这是 Anthropic 官方推出的更稳定替代方案,通过模型分类器判断操作安全性,危险操作被拦截时 Claude 会自动寻找更安全的替代路径,而不是中断等待。

Bug 3:恢复后 session_id 变化

通过 --resume 恢复的 session 会生成新的 UUID,hooks 和外部日志系统无法通过 session_id 追踪跨终端的同一会话(GitHub issue #12235)。


Session 数据存储位置

~/.claude/projects/<project-path-hash>/<session-uuid>.jsonl

每个 .jsonl 文件对应一个 session,消息以 JSON Lines 格式逐行记录。可以直接读取这些文件做自定义分析或元数据检索。


快速参考

# 日常使用
claude -c                          # 继续最近 session
claude -r                          # 选择器选 session
claude -r "name-or-uuid"           # 恢复指定 session

# 命名
/rename my-feature                 # 手动命名当前 session
/rename                            # 自动生成名称
/color blue                        # 设置颜色(多终端区分用)

# 带权限恢复
claude -r "session" --dangerously-skip-permissions

# 自动化脚本
claude -r "deploy-staging" -p "Verify the deploy status" --output-format json