#!/bin/bash function helpexit() { echo "Start a Docker session with LXDE and VNC server." echo "NOTE: Docker image is stopped and destroyed when ssh shell exits!" echo " --vnc Start VNC viewer" echo " --geometry WxY VNC Default screen size" echo " --new-passwd Generate new random VNC password file" echo " --persistent Do not remove container at exit" echo " --help This help" exit } function pwgen() { dd if=/dev/random of=vnc_passwd bs=1 count=8 } function rsagen() { rm -f .id_rsa .id_rsa.pub ssh-keygen -t rsa -b 1024 -N "" -f .id_rsa } RMIMAGE="--rm" for (( i=1; i<=$#; i++ )); do j=$(( $i + 1 )) [[ "${!i}" = "--help" ]] && helpexit [[ "${!i}" = "-h" ]] && helpexit [[ "${!i}" = "--vnc" ]] && { VNC=1; continue; } [[ "${!i}" = "--new-passwd" ]] && { pwgen; continue; } [[ "${!i}" = "--persistent" ]] && { RMIMAGE=""; continue; } [[ "${!i}" = "--geometry" ]] && { VNCSIZE="-geometry ${!j}"; [[ "$VNCSIZE" = *x* ]] || { echo "VNC geometry must be of format WxH, e.g. 1024x768" exit 1 } continue; } done set -e [[ -f .id_rsa.pub ]] || rsagen [[ -f .id_rsa ]] || rsagen cd $( dirname $( readlink -f $0 ) ) export USER=$( id -u -n ) export USERID=$( id -u ) export USERGID=$( id -u ) cat userinit.sh.template | \ sed 's,--USER--,'$USER',g' | \ sed 's,--USERID--,'$USERID',g' | \ sed 's,--USERGID--,'$USERGID',g' | \ sed 's,--PUBKEY--,'"$( cat .id_rsa.pub )"',' > userinit.sh chmod 755 userinit.sh image=$( basename $( dirname $( readlink -f $0 ) ) ) echo $image docker build -t $image . nname=$image$$ docker run $RMIMAGE -v /mnt:/mnt -v /media:/media -v $HOME/:/host_home \ --privileged \ -h $nname --name $nname $image \ bash /bootstuff.sh $USER & echo $nname while :; do sleep 3 IP=$( docker inspect --format '{{ .NetworkSettings.IPAddress }}' $nname ) [[ -z "$IP" ]] || break done echo $IP while :; do sleep 3 ssh-keyscan $IP && break done ssh -i .id_rsa -XY -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no $USER@$IP #&& break echo "Shutting down $nname" sleep 1 docker stop $nname >/dev/null &