#!/usr/bin/env bash help () { echo 'dchr-run [options] [command]' echo '-- options:' echo ' -u uid[:gid] invoke command in chroot as a different user' # TODO: #echo ' -x11 apply options for correctly starting GUI apps' echo 'https://dchr.dc09.ru' } clean () { echo '-- Cleaning up' umount "$1/proc" umount "$1/sys" umount "$1/dev" umount "$1/run" } error () { echo -e '-- \e[1;31mError\e[0m -- see output above' exit 1 # `trap` in main() calls cleanup function } setup () { echo '-- Mounting' mount -t proc /proc "$1/proc" || error mount -t sysfs /sys "$1/sys" || error mount -o bind /dev "$1/dev" || error mount -o bind /run "$1/run" } runcmd () { echo -e '-- \e[1;32mOK\e[0m -- running chroot' userspec="--userspec=$1" chrdir="$2" shift 2 chrcmd=("$@") chroot "$userspec" "$chrdir" "${chrcmd[@]}" } main () { [[ "$1" == "--help" || "$1" == "" ]] && help && exit 0 userspec="$(id -u):$(id -g)" while [[ "$1" == -* ]] do case "$1" in -u) userspec="$2" shift 2 ;; #-x11);; TODO *) echo -ne '-- \e[1mInvalid option:\e[0m ' echo "$1" echo '-- Use ./ or full path if your chroot-dir starts with dash (-)' help exit 2 ;; esac done chrdir=$(readlink -f "$1") shift trap "clean \"$chrdir\"" EXIT setup "$chrdir" runcmd "$userspec" "$chrdir" "$@" exit $? } sourced () { [ -n "$ZSH_VERSION" ] && [[ "$ZSH_EVAL_CONTEXT" =~ :file ]] && return 0 [ -n "$BASH_VERSION" ] && [[ "$0" != "$BASH_SOURCE" ]] && return 0 return 1 } sourced || main "$@"