#!/usr/bin/env bash if [ "$#" -lt 1 ]; then echo "Usage: ./run.sh command [arguments]" exit 1 fi # Find free display number for ((DNum=1 ; DNum <= 100 ; DNum++)) ; do [ -e /tmp/.X11-unix/X$DNum ] || break done RESOLUTION=1920x1080 # Start nested X Server Xephyr :$DNum \ -extension MIT-SHM \ -extension XTEST \ -nolisten tcp \ -screen $RESOLUTION \ -resizeable & xephyrpid=$! # If simple ratpoison window manager exists, run it if command -v ratpoison; then sleep 1 ratpoison -d :$DNum & else # Use the default x window manager installed based on lsb_release id DISPLAY=:$DNum distro_id=$(lsb_release -i | awk '{print($3)}') if [ "${distro_id}" == "Ubuntu" ] || [ "${distro_id}" == "Debian" ]; then x-window-manager & else Xorg & #generic case (Fedora, Arch, etc) fi fi windowmanagerpid=$! #detect podman or docker if command -v docker; then docker run --net=host \ --rm \ -e DISPLAY=:$DNum \ -v /tmp/.X11-unix/X$DNum:/tmp/.X11-unix/X$DNum:rw \ --user $(id -u):$(id -g) \ --group-add audio \ --cap-drop=ALL \ --shm-size 2g \ "$@" elif command -v podman; then podman run --net=host \ --rm \ -e DISPLAY=:$DNum \ -v /tmp/.X11-unix/X$DNum:/tmp/.X11-unix/X$DNum:rw \ --user $(id -u):$(id -g) \ --group-add audio \ --cap-drop=ALL \ --shm-size 2g \ "$@" fi kill $windowmanagerpid kill $xephyrpid ## Explanation of docker parameters # --net=host is to access the X server # --rm is to remove the container when finished # The next two lines is to pass along the X server socket and display # --user is to set user to be non-root # --cap-drop=ALL is to drop all priviledges # --shm-size 2g is to increase shared memory # $@ is to pass along the rest of the arguments