1 changed files with 186 additions and 0 deletions
@ -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 <<EOSF |
||||||
|
if ! mount |grep -q "proc on ${target}/proc type proc" |
||||||
|
then |
||||||
|
echo "chroot is not available at this step" |
||||||
|
exit 1 |
||||||
|
fi |
||||||
|
sudo /usr/sbin/chroot ${target} /usr/bin/env -i \ |
||||||
|
HOME=/root \ |
||||||
|
TERM="${TERM}" \ |
||||||
|
debian_chroot=" ${target} " \ |
||||||
|
PS1='(chroot ${target}) \u:\w \$ ' \ |
||||||
|
PATH=/usr/bin:/usr/sbin \ |
||||||
|
/bin/bash --login |
||||||
|
EOSF |
||||||
|
|
||||||
|
cat > "/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 |
||||||
Loading…
Reference in new issue