Agent Safehouse – macOS 原生沙箱用于本地代理
Source: Hacker News
针对主流代理的测试
所有代理在各自的沙箱中都能完美运行,但无法影响沙箱之外的任何内容。
拒绝优先访问模型
代理会继承您完整的用户权限。Safehouse 颠倒这一点——除非明确授予,否则一切均不可访问。
~/my-project/read/write
~/shared-lib/read-only
~/.ssh/denied
~/.aws/denied
~/other-repos/denied
入门指南
下载一个单文件脚本,赋予可执行权限,然后在其中运行您的代理。无需构建步骤,也不需要额外依赖——只需 Bash 和 macOS。
# 1. 下载 Safehouse(单个自包含脚本)
mkdir -p ~/.local/bin
curl -fsSL https://raw.githubusercontent.com/eugene1g/agent-safehouse/main/dist/safehouse.sh \
-o ~/.local/bin/safehouse
chmod +x ~/.local/bin/safehouse
# 2. 在 Safehouse 中运行任意代理
cd ~/projects/my-app
safehouse claude --dangerously-skip-permissions
Safehouse 会自动授予所选工作目录(默认是 git 根目录)的读写权限,以及对已安装工具链的读取权限。您大部分的主目录——SSH 密钥、其他仓库、个人文件——都会被内核拒绝访问。
看到失败——证明沙箱有效
尝试在 Safehouse 中读取敏感内容。内核会在进程看到数据之前阻止它。
# 尝试读取您的 SSH 私钥——被内核拒绝
safehouse cat ~/.ssh/id_ed25519
# cat: /Users/you/.ssh/id_ed25519: Operation not permitted
# 尝试列出另一个仓库——不可见
safehouse ls ~/other-project
# ls: /Users/you/other-project: Operation not permitted
# 但当前项目可以正常工作
safehouse ls .
# README.md src/ package.json ...
默认安全的 shell 函数
将以下内容添加到您的 shell 配置文件中,所有代理都会自动在 Safehouse 中运行——您无需记住额外操作。若想在不使用沙箱的情况下运行,可使用 command claude 绕过函数。
# ~/.zshrc or ~/.bashrc
safe() { safehouse --add-dirs-ro=~/mywork "$@"; }
# 沙箱模式——默认。直接输入命令名即可。
claude() { safe claude --dangerously-skip-permissions "$@"; }
codex() { safe codex --dangerously-bypass-approvals-and-sandbox "$@"; }
amp() { safe amp --dangerously-allow-all "$@"; }
gemini() { NO_BROWSER=true safe gemini --yolo "$@"; }
# 非沙箱模式——使用 `command` 绕过函数
# command claude # 普通交互会话