#!/usr/bin/env bash target=$1 ask_for_execution() { USER_ANSWER="?"; while [ "${USER_ANSWER}" != "n" ] && [ "${USER_ANSWER}" != "y" ] && [ "${USER_ANSWER}" != "q" ] do echo -n "Is this the good target ? [y/n/q]" read -r -n 1 USER_ANSWER echo ""; done if [ "$USER_ANSWER" == "y" ] then return 0 elif [ "$USER_ANSWER" == "n" ] then return 1 elif [ "$USER_ANSWER" == "q" ] then exit 0 else exit 0 fi } check_virtual_kernel_filesystems() { echo "call check_virtual_kernel_filesystems" if mount |grep -q "udev on ${target}/dev type devtmpfs" && \ mount |grep -q "devpts on ${target}/dev/pts type devpts" && \ mount |grep -q "proc on ${target}/proc type proc" && \ mount |grep -q "sysfs on ${target}/sys type sysfs" && \ mount |grep -q "tmpfs on ${target}/run type tmpfs" && \ mount |grep -q "tmpfs on ${target}/dev/shm type tmpfs" then echo "Ok, Filesystems are ready for chroot" return 0 else echo "Warning : Not ready for chroot !!!" return 1 fi } mount_virtual_kernel_filesystem() { echo "call mount_virtual_kernel_filesystem" echo "sudo operation : mount dev sys proc sys run /dev/shm on ${target}" sudo /usr/bin/mount -v --bind /dev "${target}/dev" || return 1 sudo /usr/bin/mount -vt devpts devpts -o gid=5,mode=0620 "${target}/dev/pts" || return 1 sudo /usr/bin/mount -vt proc proc "${target}/proc" || return 1 sudo /usr/bin/mount -vt sysfs sysfs "${target}/sys" || return 1 sudo /usr/bin/mount -vt tmpfs tmpfs "${target}/run" || return 1 echo "Content of ${target}/dev :" ls -l "${target}/dev/" echo "Content of ${target}/dev/shm :" ls -l "${target}/dev/shm" if [ -h "${target}/dev/shm" ] then echo /usr/bin/install -v -d -m 1777 "${target}$(realpath /dev/shm)" || return 1 sudo /usr/bin/install -v -d -m 1777 "${target}$(realpath /dev/shm)" || return 1 else echo /usr/bin/mount -vt tmpfs -o nosuid,nodev tmpfs "${target}/dev/shm" || return 1 sudo /usr/bin/mount -vt tmpfs -o nosuid,nodev tmpfs "${target}/dev/shm" || return 1 fi return 0 } cat > "${HOME}"/target_chroot.sh < "/tmp/$(whoami)_sudo" << EOF $(whoami) ALL = NOPASSWD: /usr/bin/mount * ${target}* $(whoami) ALL = NOPASSWD: /usr/sbin/chroot ${target}* EOF target_chroot() { echo "call target_chroot $1" CHROOTFILE=$1 sed "1iif [[ ! \"\${UID\}\" -eq 0 ]] && [ ! -e ${CHROOTFILE} ]" -i "${CHROOTFILE}" sed "2ithen" -i "${CHROOTFILE}" sed "3iecho \"bad chroot\"" -i "${CHROOTFILE}" sed "4iexit 1" -i "${CHROOTFILE}" sed "5ielse" -i "${CHROOTFILE}" sed "\$afi" -i "${CHROOTFILE}" if cat "${CHROOTFILE}" | sudo /usr/sbin/chroot "${target}" /usr/bin/env -i \ HOME=/root \ TERM="$TERM" \ debian_chroot=" ${target} " \ PS1='(${target} chroot) \u:\w\$ ' \ PATH=/usr/bin:/usr/sbin \ /bin/bash then echo "command succeed" return 0 else return 1 fi } usage() { echo "Prepare an valid chroot environment" echo "$ mount_chroot.sh target [filename]" echo "Examples:" echo "$ bash mount_chroot.sh /mnt/sid" echo "$ bash mount_chroot.sh /mnt/sid myscript.sh" exit 0 } main() { nbargs=$# if [[ ${nbargs} -ge 1 ]] then target=$1 else echo "--- Give at least target as argument" usage fi echo "--- chroot target is ${target}" if [ ! -d "${target}" ] then echo "--- Error: not a directory" exit 1 fi if [[ ! "${target}" =~ ^/mnt/ ]] then echo "--- Error: not mounted under /mnt" exit 1 fi if ! ask_for_execution then echo "--- Give the good target" exit 1 fi if ! check_virtual_kernel_filesystems then if ! mount_virtual_kernel_filesystem then echo "Mount failure. Please fix it!" exit 1 fi if ! check_virtual_kernel_filesystems then echo "Mount failure. Please fix it!" exit 1 fi fi if [[ ${nbargs} -eq 1 ]] then bash ~/target_chroot.sh elif [[ ${nbargs} -ge 2 ]] then shift script="$*" echo "--- script is ${script}" target_chroot "${script}" fi } if [[ "${BASH_SOURCE[0]}" == "$0" ]] then main "$@" fi