1 changed files with 186 additions and 0 deletions
@ -0,0 +1,186 @@
@@ -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