From 9221d7b8e245d8517afd0f8575f634f2d800a255 Mon Sep 17 00:00:00 2001 From: cyril constantin Date: Sun, 20 Sep 2026 11:07:12 +0200 Subject: [PATCH] up --- mount_chroot.sh | 186 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 186 insertions(+) create mode 100755 mount_chroot.sh diff --git a/mount_chroot.sh b/mount_chroot.sh new file mode 100755 index 0000000..be3ea81 --- /dev/null +++ b/mount_chroot.sh @@ -0,0 +1,186 @@ +#!/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