Initial commit
This commit is contained in:
commit
b50f2f8d41
1 changed files with 64 additions and 0 deletions
64
sandbox.sh
Executable file
64
sandbox.sh
Executable file
|
|
@ -0,0 +1,64 @@
|
|||
#!/usr/bin/env bash
|
||||
# Run Claude Code inside a bubblewrap sandbox.
|
||||
# Filesystem: read-only except for the project dir and /tmp
|
||||
# Network: shared with host (needed to reach docker-compose services on localhost)
|
||||
#
|
||||
# Prerequisite: bwrap must have the suid bit set to run unprivileged:
|
||||
# sudo chmod u+s $(which bwrap)
|
||||
#
|
||||
# Usage: sandbox.sh [-o|--opencode] [-s|--shell] [args...]
|
||||
# -o, --opencode launch opencode instead of claude (default)
|
||||
# -s, --shell launch an interactive bash shell for inspection
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
LAUNCH_OPENCODE=0
|
||||
LAUNCH_SHELL=0
|
||||
while [ $# -gt 0 ]; do
|
||||
case "$1" in
|
||||
-o|--opencode) LAUNCH_OPENCODE=1; shift ;;
|
||||
-s|--shell) LAUNCH_SHELL=1; shift ;;
|
||||
*) break ;;
|
||||
esac
|
||||
done
|
||||
|
||||
# Rename the tmux window to the project dir so it's easy to identify.
|
||||
if [ -n "$TMUX_PANE" ]; then
|
||||
tmux rename-window "$(basename "$PWD")"
|
||||
fi
|
||||
|
||||
if [ "$LAUNCH_SHELL" -eq 1 ]; then
|
||||
COMMAND=(bash --noprofile --norc)
|
||||
elif [ "$LAUNCH_OPENCODE" -eq 1 ]; then
|
||||
COMMAND=("$HOME/.opencode/bin/opencode")
|
||||
else
|
||||
COMMAND=("$HOME/.local/bin/claude")
|
||||
fi
|
||||
|
||||
exec bwrap \
|
||||
--ro-bind /usr /usr \
|
||||
--symlink usr/bin /bin \
|
||||
--symlink usr/sbin /sbin \
|
||||
--symlink usr/lib /lib \
|
||||
--symlink usr/lib64 /lib64 \
|
||||
--ro-bind /etc/resolv.conf /etc/resolv.conf \
|
||||
--ro-bind /etc/hosts /etc/hosts \
|
||||
--ro-bind /etc/passwd /etc/passwd \
|
||||
--ro-bind /etc/group /etc/group \
|
||||
--ro-bind /etc/nsswitch.conf /etc/nsswitch.conf \
|
||||
--ro-bind /etc/localtime /etc/localtime \
|
||||
--ro-bind /etc/ssl/certs /etc/ssl/certs \
|
||||
--dev /dev \
|
||||
--proc /proc \
|
||||
--tmpfs /tmp \
|
||||
--tmpfs /home \
|
||||
--bind "$PWD" "$PWD" \
|
||||
--ro-bind "$HOME/.local" "$HOME/.local" \
|
||||
--ro-bind "$HOME/.nvm" "$HOME/.nvm" \
|
||||
--bind "$HOME/.claude" "$HOME/.claude" \
|
||||
--bind "$HOME/.claude.json" "$HOME/.claude.json" \
|
||||
--bind "$HOME/.opencode" "$HOME/.opencode" \
|
||||
--unshare-pid \
|
||||
--die-with-parent \
|
||||
--chdir "$PWD" \
|
||||
-- "${COMMAND[@]}" "$@"
|
||||
Loading…
Reference in a new issue