You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
IUT/vdn/bin/vdn-mount-chroot.bak

191 lines
4.4 KiB

#!/usr/bin/env bash
set -eu
#set -x
DISK_NAME="DebianBuster-amd64.disk"
FOR_ROOT=0
USE_SUDO=0
UMOUNT=0
synopsis() {
cat << EOF
Usage : `basename $0` [-h] [-r] [-i user] [-s] [-u]
EOF
}
help() {
cat << EOF
`basename $0` exécute VDN dans un environnement chroot en utilisant le disque :
$DISK
* Le mot de passe root vous sera demandé !
AVERTISSEMENTS :
1. de nombreuses opérations sous root sont effectuées (montages, chroot,
démontages). Pour que le démontage se fasse correctement, fermez toutes
les fénêtres et processus de l'environnement chroot (VDN).
2. L'isolation entre le système initial et le système chrooté n'est pas
totale. Les répertoires suivants du système initial sont partagés :
/dev, /dev/pts, /sys, /proc, /tmp et /home/$USER.
Autrement dit, ne faites pas n'importe quoi avec ces répertoires, ce
sont ceux de votre système.
`synopsis`
-h : affiche cette aide.
-r : (réservé) exécution spécifique à l'utilisateur root. Ne pas utiliser
directement sans savoir ce que vous faites !
-s : utilise "sudo" plutôt que "su -" pour basculer sous le compte root.
-i user : (réservé) indique l'utilisateur pour l'option -r. Ne pas utiliser
directement sans savoir ce que vous faites !
-u : démontages seulement.
EOF
}
usage() {
synopsis
exit 1
}
args() {
local opt
while getopts "hrsi:u" opt; do
case $opt in
h) help; exit 0;;
r) FOR_ROOT=1;;
s) USE_SUDO=1;;
i) USER="$OPTARG";;
u) UMOUNT=1;;
?) usage;;
esac
done
shift $(($OPTIND - 1))
[ $# -ne 0 ] && usage || :
}
vdnMountChrootForRoot() {
#key="$(cat $TMPDIR/vdn-key-$USER)"
disp=$(cat $TMPDIR/vdn-display-$USER)
echo "USER:$USER"
d=$TMPDIR/vdn-chroot-$USER;
if [ $UMOUNT = 0 ]; then
mount | grep -q $d || mount -o loop,offset=$((2048*512)) $DISK $d
for i in /dev /dev/pts /sys /proc /tmp /etc; do
mount | grep -q $d$i || { mount --bind $i $d$i; }
done
#mount --bind $VDN_PATH $d/home/test/vdn
mount --rbind /home $d/home
#mount | grep $d
#chroot $d su - -s /bin/bash -c "export DISPLAY=":"$disp; \
#unset XAUTHORITY; rm -rf /home/test/.config/xfce4-session; \
#rm -rf /home/test/.config/xfce4/terminal/; \
#xauth add \$DISPLAY . $key; \
#export NO_AT_BRIDGE=1; \
#xfce4-terminal --disable-server # 2> /dev/null;" test
whoami
ls -l $VDN_PATH/bin/vdn
#chroot $d su - $VDN_PATH/bin/vdn $USER
chroot $d su - --session-command "export DISPLAY=:"$disp"; $VDN_PATH/bin/vdn" $USER || :
#chroot $d su - -s /bin/bash -c "export DISPLAY=":"$disp; \
#xfce4-terminal --disable-server # 2> /dev/null;" $USER
fi
for i in /tmp /proc /sys /dev/pts /dev /etc; do
mount | grep -q $d$i && { umount $d$i || { echo "umount lazy : $d$i"; umount -l $d$i; } ; } || :
done
fuser -mv $d/home
mount | grep -q $d/home && { umount -l $d/home; } || :
sleep 1
mount | grep -q $d && { umount $d || umount -l $d; } || :
mount | grep $d
}
vdnMountChroot() {
d=$TMPDIR/vdn-chroot-$USER; [ ! -d $d ] && mkdir $d || :
if [ $UMOUNT = 0 ]; then
# get display
(rm -f $TMPDIR/vdn-display-$USER; umask 077 ; touch $TMPDIR/vdn-display-$USER)
DISP=$(echo $DISPLAY | cut -d ':' -f 2 | cut -d '.' -f 1)
echo $DISPLAY | cut -d ':' -f 2 >> $TMPDIR/vdn-display-$USER
# get xauth key
#key=$(xauth list| grep $(uname -n) | grep $DISP | tail -n 1 | tr -s ' ' | cut -d ' ' -f 3)
#[ -n "$key" ] || error "Xauth key is empty !"
#echo $key | egrep -q '^[[:xdigit:]]+$' || error "Bad xauth key ($key) !"
#(rm -f $TMPDIR/vdn-key-$USER; umask 077 ; touch $TMPDIR/vdn-key-$USER)
#echo $key >> $TMPDIR/vdn-key-$USER
fi
if [ $USE_SUDO = 0 ]; then
echo "Le mot de passe demandé est celui de l'administrateur (root)"
if [ $UMOUNT = 0 ]; then
su - -c "$VDN_PATH/bin/vdn-mount-chroot -r -i $USER"
else
su - -c "$VDN_PATH/bin/vdn-mount-chroot -r -i $USER -u"
fi
else
if [ $UMOUNT = 0 ]; then
sudo $VDN_PATH/bin/vdn-mount-chroot -r -i $USER
else
sudo $VDN_PATH/bin/vdn-mount-chroot -r -i $USER -u
fi
fi
}
# Programme principal
VDN_PATH=$(readlink -f $(dirname $0)/..); . $VDN_PATH/bin/functions.sh
DISK=$VDN_PATH/files/$DISK_NAME
[ ! -e $DISK ] && error "$DISK not found !" || :
if [ ! -w $DISK ]; then
error "$DISK doit être accessible à l'utilisateur en écriture !"
fi
args "$@"
if [ $FOR_ROOT = 1 ];then
vdnMountChrootForRoot
else
vdnMountChroot
fi