#!/bin/sh # -------------- Default Settings -------------- MODE="normal" SESSION="$(id -un)" INTERNET_ACCESS="yes" # -------------- Argument Parsing -------------- while [ $# -gt 0 ]; do case "$1" in --mode) MODE="$2" shift 2 ;; --session-name) SESSION="$2" shift 2 ;; --internet-access) case "$2" in 1|yes|y) $INTERNET_ACCESS="yes" ;; 0|no|n) $INTERNET_ACCESS="no" ;; *) echo "Usage: --internet-access {1|yes|y or 0|no|n}" exit 1 ;; esac shift 2 ;; --offline) $INTERNET_ACCESS="no" shift 2 ;; --) shift break ;; *) break ;; esac done if [ $# -eq 0 ]; then echo "Usage: sandbox.sh [--mode MODE] [--session-name NAME] -- command [args...]" exit 1 fi USER="$(id -un)" HOME_REAL="$HOME" RUNTIME="$XDG_RUNTIME_DIR" SANDBOX_BASE="$HOME_REAL/.sandbox" EXPORT_DIR="$SANDBOX_BASE/export" #Networming toggle if [ "$INTERNET_ACCESS" = "no" ]; then NET_FLAG="--unshare-net" fi BASE_SYSTEM=" --ro-bind /usr /usr --ro-bind /bin /bin --ro-bind /sbin /sbin --ro-bind /lib /lib --ro-bind /lib64 /lib64 --ro-bind /etc /etc --proc /proc --dev /dev " #--dev-bind /dev/null /dev/null #--dev-bind /dev/dri /dev/dri # -------------- Modes -------------- case "$MODE" in normal) exec "$@" ;; contained) SANDBOX_HOME="$SANDBOX_BASE/contained/$SESSION" mkdir -p "$SANDBOX_HOME"/.config mkdir -p "$SANDBOX_HOME"/.local/share mkdir -p "$SANDBOX_HOME"/.cache mkdir -p "$EXPORT_DIR" exec bwrap \ --unshare-pid \ --unshare-uts \ --unshare-ipc \ $NET_FLAG \ --new-session \ $BASE_SYSTEM \ --bind "$SANDBOX_HOME" /home/$USER \ --setenv HOME /home/$USER \ --setenv USER "$USER" \ --setenv LOGNAME "$USER" \ --setenv XDG_CONFIG_HOME /home/$USER/.config \ --setenv XDG_DATA_HOME /home/$USER/.local/share \ --setenv XDG_CACHE_HOME /home/$USER/.cache \ --setenv XDG_RUNTIME_DIR "$RUNTIME" \ $INTERNET_ACCESS \ --bind "$RUNTIME" "$RUNTIME" \ --bind "$EXPORT_DIR" /export \ "$@" ;; volatile) mkdir -p "$EXPORT_DIR" exec bwrap \ --unshare-pid \ --unshare-uts \ --unshare-ipc \ $NET_FLAG \ --new-session \ $BASE_SYSTEM \ --tmpfs /home \ --dir /home/$USER \ --setenv HOME /home/$USER \ --setenv USER "$USER" \ --setenv LOGNAME "$USER" \ --setenv XDG_CONFIG_HOME /home/$USER/.config \ --setenv XDG_DATA_HOME /home/$USER/.local/share \ --setenv XDG_CACHE_HOME /home/$USER/.cache \ --setenv XDG_RUNTIME_DIR "$RUNTIME" \ $INTERNET_ACCESS \ --bind "$RUNTIME" "$RUNTIME" \ --bind "$EXPORT_DIR" /export \ "$@" ;; *) echo "Unknown mode: '$MODE'" exit 1 ;; esac