#!/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