#!/bin/bash ########################################################################################### # One-click Desktop & Browser Access Setup Script v0.0.2 # # Written by shc (https://qing.su) # # Github link: https://github.com/Har-Kuun/OneClickDesktop # # Contact me: https://t.me/hsun94 E-mail: hi@qing.su # # # # This script is distributed in the hope that it will be # # useful, but ABSOLUTELY WITHOUT ANY WARRANTY. # # # # The author thanks LinuxBabe for providing detailed # # instructions on Guacamole setup. # # https://www.linuxbabe.com/debian/apache-guacamole-remote-desktop-debian-10-buster # # # # Thank you for using this script. # ########################################################################################### #You can change the Guacamole source file download link here. #Check https://guacamole.apache.org/releases/ for the latest stable version. GUACAMOLE_DOWNLOAD_LINK="https://mirrors.ocf.berkeley.edu/apache/guacamole/1.2.0/source/guacamole-server-1.2.0.tar.gz" GUACAMOLE_VERSION="1.2.0" #By default, this script only works on Ubuntu 18/20 and Debian 10. #You can disable the OS check switch below and tweak the code yourself to try to install it in other OS versions. #Please do note that if you choose to use this script on OS other than Ubuntu 18/20 or Debian 10, you might mess up your OS. Please keep a backup of your server before installation. OS_CHECK_ENABLED=ON ######################################################################### # Functions start here. # # Do not change anything below unless you know what you are doing. # ######################################################################### exec > >(tee -i OneClickDesktop.log) exec 2>&1 function check_OS { if [ -f /etc/lsb-release ] then cat /etc/lsb-release | grep "DISTRIB_RELEASE=18." >/dev/null if [ $? = 0 ] then OS=UBUNTU18 else cat /etc/lsb-release | grep "DISTRIB_RELEASE=20." >/dev/null if [ $? = 0 ] then OS=UBUNTU20 else say "Sorry, this script only supports Ubuntu 18, 20 and Debian 10." red echo exit 1 fi fi elif [ -f /etc/debian_version ] ; then cat /etc/debian_version | grep "^10." >/dev/null if [ $? = 0 ] ; then OS=DEBIAN10 else say "Sorry, this script only supports Ubuntu 18, 20 and Debian 10." red echo exit 1 fi else say "Sorry, this script only supports Ubuntu 18, 20 and Debian 10." red echo exit 1 fi } function say { #This function is a colored version of the built-in "echo." #https://github.com/Har-Kuun/useful-shell-functions/blob/master/colored-echo.sh echo_content=$1 case $2 in black | k ) colorf=0 ;; red | r ) colorf=1 ;; green | g ) colorf=2 ;; yellow | y ) colorf=3 ;; blue | b ) colorf=4 ;; magenta | m ) colorf=5 ;; cyan | c ) colorf=6 ;; white | w ) colorf=7 ;; * ) colorf=N ;; esac case $3 in black | k ) colorb=0 ;; red | r ) colorb=1 ;; green | g ) colorb=2 ;; yellow | y ) colorb=3 ;; blue | b ) colorb=4 ;; magenta | m ) colorb=5 ;; cyan | c ) colorb=6 ;; white | w ) colorb=7 ;; * ) colorb=N ;; esac if [ "x${colorf}" != "xN" ] ; then tput setaf $colorf fi if [ "x${colorb}" != "xN" ] ; then tput setab $colorb fi printf "${echo_content}" | sed -e "s/@B/$(tput bold)/g" tput sgr 0 printf "\n" } function determine_system_variables { CurrentUser="$(id -u -n)" CurrentDir=$(pwd) HomeDir=$HOME } function get_user_options { echo say @B"Please input your Guacamole username:" yellow read guacamole_username echo say @B"Please input your Guacamole password:" yellow read guacamole_password_prehash read guacamole_password_md5 <<< $(echo -n $guacamole_password_prehash | md5sum | awk '{print $1}') echo say @B"Would you like Guacamole to connect to the server desktop through RDP or VNC?" yellow say @B"Input 1 for RDP, or 2 for VNC. If you have no idea what's this, please choose 1." yellow read choice_rdpvnc echo if [ $choice_rdpvnc = 1 ] ; then say @B"Please choose a screen resolution." yellow echo "Choose 1 for 1280x800 (default), 2 to fit your local screen, or 3 to manually configure RDP screen resolution." read rdp_resolution_options if [ $rdp_resolution_options = 2 ] ; then set_rdp_resolution=0; else set_rdp_resolution=1; if [ $rdp_resolution_options = 3 ] ; then echo echo "Please type in screen width (default is 1280):" read rdp_screen_width_input echo "Please type in screen height (default is 800):" read rdp_screen_height_input if [ $rdp_screen_width_input -gt 1 ] && [ $rdp_screen_height_input -gt 1 ] ; then rdp_screen_width=$rdp_screen_width_input rdp_screen_height=$rdp_screen_height_input else say "Invalid screen resolution input." red echo exit 1 fi else rdp_screen_width=1280 rdp_screen_height=800 fi fi say @B"Screen resolution successfully configured." green else echo while [ ${#vnc_password} != 8 ] ; do say @B"Please input your 8-character VNC password:" yellow read vnc_password done say @B"VNC password successfully configured." green echo "Please note that VNC password is NOT needed for browser access." sleep 1 fi echo say @B"Would you like to set up Nginx Reverse Proxy?" yellow say @B"Please note that if you want to copy or paste text between the server and your computer, you MUST set up an Nginx Reverse Proxy AND an SSL certificate. You can set it up later manually though." yellow echo "Please type [Y/n]:" read install_nginx if [ "x$install_nginx" = "xY" ] || [ "x$install_nginx" = "xy" ] ; then echo say @B"Please tell me your domain name (e.g., desktop.qing.su):" yellow read guacamole_hostname echo echo echo "Would you like to install a free Let's Encrypt certificate for domain name ${guacamole_hostname}? [Y/N]" say @B"Please point your domain name to this server IP BEFORE continuing!" yellow echo "Type Y if you are sure that your domain is now pointing to this server IP." read confirm_letsencrypt echo if [ "x$confirm_letsencrypt" = "xY" ] || [ "x$confirm_letsencrypt" = "xy" ] ; then echo "Please input an e-mail address:" read le_email fi else say @B"OK, Nginx will NOT be installed on this server." yellow fi echo say @B"Desktop environment installation will start now. Please wait." green sleep 3 } function install_guacamole { echo say @B"Setting up dependencies..." yellow echo apt-get update && apt-get upgrade -y apt-get install wget curl sudo zip unzip tar perl expect build-essential libcairo2-dev libpng-dev libtool-bin libossp-uuid-dev libvncserver-dev freerdp2-dev libssh2-1-dev libtelnet-dev libwebsockets-dev libpulse-dev libvorbis-dev libwebp-dev libssl-dev libpango1.0-dev libswscale-dev libavcodec-dev libavutil-dev libavformat-dev tomcat9 tomcat9-admin tomcat9-common tomcat9-user japan* chinese* korean* fonts-arphic-ukai fonts-arphic-uming fonts-ipafont-mincho fonts-ipafont-gothic fonts-unfonts-core -y if [ "$OS" = "DEBIAN10" ] ; then apt-get install libjpeg62-turbo-dev -y else apt-get install libjpeg-turbo8-dev language-pack-ja language-pack-zh* language-pack-ko -y fi wget $GUACAMOLE_DOWNLOAD_LINK tar zxf guacamole-server-${GUACAMOLE_VERSION}.tar.gz rm -f guacamole-server-${GUACAMOLE_VERSION}.tar.gz cd $CurrentDir/guacamole-server-$GUACAMOLE_VERSION echo "Start building Guacamole Server from source..." ./configure --with-init-dir=/etc/init.d if [ -f $CurrentDir/guacamole-server-$GUACAMOLE_VERSION/config.status ] ; then say @B"Dependencies met!" green say @B"Compiling now..." green echo else echo say "Missing dependencies." red echo "Please check log, install required dependencies, and run this script again." echo "Please also consider to report your log here https://github.com/Har-Kuun/OneClickDesktop/issues so that I can fix this issue." echo "Thank you!" echo exit 1 fi sleep 2 make make install ldconfig echo "Trying to start Guacamole Server for the first time..." echo "This can take a while..." echo systemctl daemon-reload systemctl start guacd systemctl enable guacd ss -lnpt | grep guacd >/dev/null if [ $? = 0 ] ; then say @B"Guacamole Server successfully installed!" green echo else say "Guacamole Server installation failed." red say @B"Please check the above log for reasons." yellow echo "Please also consider to report your log here https://github.com/Har-Kuun/OneClickDesktop/issues so that I can fix this issue." echo "Thank you!" exit 1 fi } function install_guacamole_web { echo echo "Start installaing Guacamole Web Application..." cd $CurrentDir wget https://downloads.apache.org/guacamole/$GUACAMOLE_VERSION/binary/guacamole-$GUACAMOLE_VERSION.war mv guacamole-$GUACAMOLE_VERSION.war /var/lib/tomcat9/webapps/guacamole.war systemctl restart tomcat9 guacd echo say @B"Guacamole Web Application successfully installed!" green echo } function configure_guacamole { echo mkdir /etc/guacamole/ cat > /etc/guacamole/guacamole.properties < /etc/guacamole/user-mapping.xml < rdp localhost 3389 END else cat > /etc/guacamole/user-mapping.xml < rdp localhost 3389 $rdp_screen_width $rdp_screen_height END fi else cat > /etc/guacamole/user-mapping.xml < vnc localhost 5901 $vnc_password END fi systemctl restart tomcat9 guacd say @B"Guacamole successfully configured!" green echo } function install_vnc { echo echo "Starting to install desktop, browser, and VNC server..." say @B"Please note that if you are asked to configure LightDM during this step, simply press Enter." yellow echo echo "Press Enter to continue." read catch_all echo if [ "$OS" = "DEBIAN10" ] ; then apt-get install xfce4 xfce4-goodies firefox-esr tigervnc-standalone-server tigervnc-common -y else apt-get install xfce4 xfce4-goodies firefox tigervnc-standalone-server tigervnc-common -y fi say @B"Desktop, browser, and VNC server successfully installed." green echo "Starting to configure VNC server..." sleep 2 echo mkdir $HomeDir/.vnc cat > $HomeDir/.vnc/xstartup < /etc/systemd/system/vncserver@.service < /dev/null 2>&1 ExecStart=/usr/bin/vncserver -depth 24 -geometry 1280x800 -localhost :%i ExecStop=/usr/bin/vncserver -kill :%i [Install] WantedBy=multi-user.target END vncpassbinpath=/usr/bin/vncpasswd /usr/bin/expect < $HomeDir/Desktop/EnableCopyPaste.sh < /dev/null if [ $? = 0 ] ; then say @B"VNC and desktop successfully configured!" green echo else say "VNC installation failed!" red say @B"Please check the above log for reasons." yellow echo "Please also consider to report your log here https://github.com/Har-Kuun/OneClickDesktop/issues so that I can fix this issue." echo "Thank you!" exit 1 fi } function install_rdp { echo echo "Starting to install desktop, browser, and XRDP server..." say @B"Please note that if you are asked to configure LightDM during this step, simply press Enter." yellow echo echo "Press Enter to continue." read catch_all echo if [ "$OS" = "DEBIAN10" ] ; then apt-get install xfce4 xfce4-goodies firefox-esr xrdp -y else apt-get install xfce4 xfce4-goodies firefox xrdp -y fi say @B"Desktop, browser, and XRDP server successfully installed." green echo "Starting to configure XRDP server..." sleep 2 echo mv /etc/xrdp/startwm.sh /etc/xrdp/startwm.sh.backup cat > /etc/xrdp/startwm.sh < /etc/systemd/system/restartguacd.service < /dev/null if [ $? = 0 ] ; then ss -lnpt | grep guacd > /dev/null if [ $? = 0 ] ; then say @B"XRDP and desktop successfully configured!" green else say @B"XRDP and desktop successfully configured!" green sleep 3 systemctl start guacd fi echo else say "XRDP installation failed!" red say @B"Please check the above log for reasons." yellow echo "Please also consider to report your log here https://github.com/Har-Kuun/OneClickDesktop/issues so that I can fix this issue." echo "Thank you!" exit 1 fi } function display_license { echo echo '*******************************************************************' echo '* One-click Desktop & Browser Access Setup Script *' echo '* Version 0.0.2 *' echo '* Author: shc (Har-Kuun) https://qing.su *' echo '* https://github.com/Har-Kuun/OneClickDesktop *' echo '* Thank you for using this script. E-mail: hi@qing.su *' echo '*******************************************************************' echo } function install_reverse_proxy { echo say @B"Setting up Nginx reverse proxy..." yellow sleep 2 apt-get install nginx certbot python3-certbot-nginx -y say @B"Nginx successfully installed!" green cat > /etc/nginx/conf.d/guacamole.conf <