mirror of
https://github.com/York-Labs/OneClickDesktop.git
synced 2026-02-21 08:37:23 +08:00
Update OneClickDesktop.sh
Add CentOS 7/8 support.
This commit is contained in:
parent
0cc33d015b
commit
901cb651fa
@ -1,6 +1,6 @@
|
||||
#!/bin/bash
|
||||
###########################################################################################
|
||||
# One-click Desktop & Browser Access Setup Script v0.1.0 #
|
||||
# One-click Desktop & Browser Access Setup Script v0.2.0 #
|
||||
# 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 #
|
||||
@ -22,9 +22,9 @@
|
||||
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.
|
||||
#By default, this script only works on Ubuntu 18/20, Debian 10, and CentOS 7/8.
|
||||
#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.
|
||||
#Please do note that if you choose to use this script on OS other than Ubuntu 18/20, Debian 10, or CentOS 7/8, you might mess up your OS. Please keep a backup of your server before installation.
|
||||
|
||||
OS_CHECK_ENABLED=ON
|
||||
|
||||
@ -41,19 +41,16 @@ exec 2>&1
|
||||
|
||||
function check_OS
|
||||
{
|
||||
if [ -f /etc/lsb-release ]
|
||||
then
|
||||
if [ -f /etc/lsb-release ] ; then
|
||||
cat /etc/lsb-release | grep "DISTRIB_RELEASE=18." >/dev/null
|
||||
if [ $? = 0 ]
|
||||
then
|
||||
if [ $? = 0 ] ; then
|
||||
OS=UBUNTU18
|
||||
else
|
||||
cat /etc/lsb-release | grep "DISTRIB_RELEASE=20." >/dev/null
|
||||
if [ $? = 0 ]
|
||||
then
|
||||
if [ $? = 0 ] ; then
|
||||
OS=UBUNTU20
|
||||
else
|
||||
say "Sorry, this script only supports Ubuntu 18, 20 and Debian 10." red
|
||||
say "Sorry, this script only supports Ubuntu 20, Debian 10, and CentOS 7/8." red
|
||||
echo
|
||||
exit 1
|
||||
fi
|
||||
@ -63,12 +60,32 @@ function check_OS
|
||||
if [ $? = 0 ] ; then
|
||||
OS=DEBIAN10
|
||||
else
|
||||
say "Sorry, this script only supports Ubuntu 18, 20 and Debian 10." red
|
||||
say "Sorry, this script only supports Ubuntu 20, Debian 10, and CentOS 7/8." red
|
||||
echo
|
||||
exit 1
|
||||
fi
|
||||
elif [ -f /etc/redhat-release ] ; then
|
||||
cat /etc/redhat-release | grep " 8." >/dev/null
|
||||
if [ $? = 0 ] ; then
|
||||
OS=CENTOS8
|
||||
say @B"Support of CentOS 8 is experimental. Please report bugs." yellow
|
||||
say @B"Please try disabling selinux or firewalld if you cannot visit your desktop." yellow
|
||||
echo
|
||||
else
|
||||
cat /etc/redhat-release | grep " 7." >/dev/null
|
||||
if [ $? = 0 ] ; then
|
||||
OS=CENTOS7
|
||||
say @B"Support of CentOS 7 is experimental. Please report bugs." yellow
|
||||
say @B"Please try disabling selinux or firewalld if you cannot visit your desktop." yellow
|
||||
echo
|
||||
else
|
||||
say "Sorry, this script only supports Ubuntu 20, Debian 10, and CentOS 7/8." red
|
||||
echo
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
else
|
||||
say "Sorry, this script only supports Ubuntu 18, 20 and Debian 10." red
|
||||
say "Sorry, this script only supports Ubuntu 20, Debian 10, and CentOS 7/8." red
|
||||
echo
|
||||
exit 1
|
||||
fi
|
||||
@ -129,9 +146,14 @@ function get_user_options
|
||||
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
|
||||
if [ "x$OS" != "xCENTOS8" ] && [ "x$OS" != "xCENTOS7" ] ; then
|
||||
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
|
||||
else
|
||||
say @B"Guacamole will use RDP to communicate with server desktop." yellow
|
||||
choice_rdpvnc=1
|
||||
fi
|
||||
echo
|
||||
if [ $choice_rdpvnc = 1 ] ; then
|
||||
say @B"Please choose a screen resolution." yellow
|
||||
@ -176,7 +198,7 @@ function get_user_options
|
||||
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
|
||||
if [ "x$install_nginx" != "xn" ] && [ "x$install_nginx" != "xN" ] ; then
|
||||
echo
|
||||
say @B"Please tell me your domain name (e.g., desktop.qing.su):" yellow
|
||||
read guacamole_hostname
|
||||
@ -199,7 +221,7 @@ function get_user_options
|
||||
sleep 3
|
||||
}
|
||||
|
||||
function install_guacamole
|
||||
function install_guacamole_ubuntu_debian
|
||||
{
|
||||
echo
|
||||
say @B"Setting up dependencies..." yellow
|
||||
@ -253,20 +275,124 @@ function install_guacamole
|
||||
fi
|
||||
}
|
||||
|
||||
function install_guacamole_centos
|
||||
{
|
||||
echo
|
||||
say @B"Setting up dependencies..." yellow
|
||||
echo
|
||||
if [ "$OS" = "CENTOS8" ] ; then
|
||||
dnf -y update
|
||||
dnf -y group install "Development Tools"
|
||||
dnf -y install --nogpgcheck https://download1.rpmfusion.org/free/el/rpmfusion-free-release-8.noarch.rpm
|
||||
dnf -y install http://rpmfind.net/linux/epel/7/x86_64/Packages/s/SDL2-2.0.10-1.el7.x86_64.rpm
|
||||
dnf -y install http://mirror.centos.org/centos/8/Devel/x86_64/os/Packages/libuv-devel-1.23.1-1.el8.x86_64.rpm
|
||||
dnf -y --enablerepo=PowerTools install perl expect cairo cairo-devel libpng-devel libtool uuid libjpeg-devel libjpeg-turbo-devel freerdp freerdp-devel pango-devel libssh2-devel libvncserver-devel pulseaudio-libs-devel openssl-devel libwebp-devel libwebsockets-devel libvorbis-devel ffmpeg-devel uuid-devel ffmpeg ffmpeg-devel mingw64-filesystem
|
||||
yum -y groupinstall Fonts
|
||||
dnf -y install java-11-openjdk-devel
|
||||
else
|
||||
yum update -y
|
||||
yum -y install epel-release
|
||||
yum -y install wget curl vim tar sudo zip unzip perl git cairo-devel freerdp-devel freerdp-plugins gcc gnu-free-mono-fonts libjpeg-turbo-devel libjpeg-turbo-official libpng-devel libssh2-devel libtelnet-devel libvncserver-devel libvorbis-devel libwebp-devel libwebsockets-devel openssl-devel pango-devel policycoreutils-python pulseaudio-libs-devel setroubleshoot uuid-devel
|
||||
yum -y localinstall --nogpgcheck https://download1.rpmfusion.org/free/el/rpmfusion-free-release-7.noarch.rpm
|
||||
yum -y install ffmpeg ffmpeg-devel
|
||||
yum -y groupinstall Fonts
|
||||
yum -y install java-11-openjdk-devel
|
||||
fi
|
||||
install_tomcat9_centos
|
||||
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
|
||||
service guacd start
|
||||
chkconfig guacd on
|
||||
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_tomcat9_centos
|
||||
{
|
||||
curl -s https://mirrors.ocf.berkeley.edu/apache/tomcat/tomcat-9/v9.0.38/bin/apache-tomcat-9.0.38.tar.gz | tar -xz
|
||||
mv apache-tomcat-9.0.38 /etc/tomcat9
|
||||
echo "export CATALINA_HOME="/etc/tomcat9"" >> ~/.bashrc
|
||||
source ~/.bashrc
|
||||
useradd -r tomcat
|
||||
chown -R tomcat:tomcat /etc/tomcat9
|
||||
cat > /etc/systemd/system/tomcat9.service <<END
|
||||
[Unit]
|
||||
Description=Apache Tomcat Server
|
||||
After=syslog.target network.target
|
||||
|
||||
[Service]
|
||||
Type=forking
|
||||
User=tomcat
|
||||
Group=tomcat
|
||||
|
||||
Environment=CATALINA_PID=/etc/tomcat9/temp/tomcat.pid
|
||||
Environment=CATALINA_HOME=/etc/tomcat9
|
||||
Environment=CATALINA_BASE=/etc/tomcat9
|
||||
|
||||
ExecStart=/etc/tomcat9/bin/catalina.sh start
|
||||
ExecStop=/etc/tomcat9/bin/catalina.sh stop
|
||||
|
||||
RestartSec=10
|
||||
Restart=always
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
END
|
||||
systemctl daemon-reload
|
||||
systemctl start tomcat9
|
||||
systemctl enable tomcat9
|
||||
}
|
||||
|
||||
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
|
||||
if [ "$OS" = "CENTOS7" ] || [ "$OS" = "CENTOS8" ] ; then
|
||||
mv guacamole-$GUACAMOLE_VERSION.war /etc/tomcat9/webapps/guacamole.war
|
||||
else
|
||||
mv guacamole-$GUACAMOLE_VERSION.war /var/lib/tomcat9/webapps/guacamole.war
|
||||
fi
|
||||
systemctl restart tomcat9 guacd
|
||||
echo
|
||||
say @B"Guacamole Web Application successfully installed!" green
|
||||
echo
|
||||
}
|
||||
|
||||
function configure_guacamole
|
||||
function configure_guacamole_ubuntu_debian
|
||||
{
|
||||
echo
|
||||
mkdir /etc/guacamole/
|
||||
@ -332,6 +458,56 @@ END
|
||||
echo
|
||||
}
|
||||
|
||||
function configure_guacamole_centos
|
||||
{
|
||||
echo
|
||||
mkdir /etc/guacamole/
|
||||
cat > /etc/guacamole/guacamole.properties <<END
|
||||
guacd-hostname: localhost
|
||||
guacd-port: 4822
|
||||
auth-provider: net.sourceforge.guacamole.net.basic.BasicFileAuthenticationProvider
|
||||
basic-user-mapping: /etc/guacamole/user-mapping.xml
|
||||
END
|
||||
if [ $set_rdp_resolution = 0 ] ; then
|
||||
cat > /etc/guacamole/user-mapping.xml <<END
|
||||
<user-mapping>
|
||||
<authorize
|
||||
username="$guacamole_username"
|
||||
password="$guacamole_password_md5"
|
||||
encoding="md5">
|
||||
<connection name="default">
|
||||
<protocol>rdp</protocol>
|
||||
<param name="hostname">localhost</param>
|
||||
<param name="port">3389</param>
|
||||
<param name="security">rdp</param>
|
||||
</connection>
|
||||
</authorize>
|
||||
</user-mapping>
|
||||
END
|
||||
else
|
||||
cat > /etc/guacamole/user-mapping.xml <<END
|
||||
<user-mapping>
|
||||
<authorize
|
||||
username="$guacamole_username"
|
||||
password="$guacamole_password_md5"
|
||||
encoding="md5">
|
||||
<connection name="default">
|
||||
<protocol>rdp</protocol>
|
||||
<param name="hostname">localhost</param>
|
||||
<param name="port">3389</param>
|
||||
<param name="width">$rdp_screen_width</param>
|
||||
<param name="height">$rdp_screen_height</param>
|
||||
<param name="security">rdp</param>
|
||||
</connection>
|
||||
</authorize>
|
||||
</user-mapping>
|
||||
END
|
||||
fi
|
||||
systemctl restart tomcat9 guacd
|
||||
say @B"Guacamole successfully configured!" green
|
||||
echo
|
||||
}
|
||||
|
||||
function install_vnc
|
||||
{
|
||||
echo
|
||||
@ -416,22 +592,31 @@ 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" = "UBUNTU18" ] || [ "$OS" = "UBUNTU20" ] ; then
|
||||
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
|
||||
fi
|
||||
if [ "$OS" = "DEBIAN10" ] ; then
|
||||
apt-get install xfce4 xfce4-goodies firefox-esr xrdp -y
|
||||
else
|
||||
elif [ "$OS" = "CENTOS8" ] || [ "$OS" = "CENTOS7" ] ; then
|
||||
yum -y groupinstall "Server with GUI"
|
||||
yum -y install firefox
|
||||
compile_xrdp_centos
|
||||
yum -y install xorgxrdp
|
||||
echo "allowed_users=anybody" > /etc/X11/Xwrapper.config
|
||||
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 <<END
|
||||
if [ "$OS" != "CENTOS7" ] && [ "$OS" != "CENTOS8" ] ; then
|
||||
mv /etc/xrdp/startwm.sh /etc/xrdp/startwm.sh.backup
|
||||
cat > /etc/xrdp/startwm.sh <<END
|
||||
#!/bin/sh
|
||||
# xrdp X session start script (c) 2015, 2017 mirabilos
|
||||
# published under The MirOS Licence
|
||||
@ -470,7 +655,8 @@ test -x /etc/X11/Xsession && exec /etc/X11/Xsession
|
||||
exec /bin/sh /etc/X11/Xsession
|
||||
|
||||
END
|
||||
chmod +x /etc/xrdp/startwm.sh
|
||||
chmod +x /etc/xrdp/startwm.sh
|
||||
fi
|
||||
systemctl enable xrdp
|
||||
systemctl restart xrdp
|
||||
sleep 5
|
||||
@ -511,12 +697,58 @@ END
|
||||
fi
|
||||
}
|
||||
|
||||
function compile_xrdp_centos
|
||||
{
|
||||
if [ "$OS" = "CENTOS7" ] ; then
|
||||
yum -y install firefox finger cmake patch gcc make autoconf libtool automake pkgconfig openssl-devel gettext file pam-devel libX11-devel libXfixes-devel libjpeg-devel libXrandr-devel nasm flex bison gcc-c++ libxslt perl-libxml-perl xorg-x11-font-utils xmlto-tex
|
||||
else
|
||||
dnf -y --enablerepo=PowerTools install firefox cmake patch gcc make autoconf libtool automake pkgconfig openssl-devel gettext file pam-devel libX11-devel libXfixes-devel libjpeg-devel libXrandr-devel nasm flex bison gcc-c++ libxslt perl-libxml-perl xorg-x11-font-utils
|
||||
fi
|
||||
echo
|
||||
say @B"Starting to build xrdp from source..." yellow
|
||||
sleep 2
|
||||
cd $CurrentDir
|
||||
git clone --recursive https://github.com/neutrinolabs/xrdp.git
|
||||
cd xrdp
|
||||
./bootstrap
|
||||
./configure
|
||||
if [ -f $CurrentDir/xrdp/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
|
||||
systemctl start xrdp
|
||||
echo
|
||||
ss -lnpt | grep xrdp >/dev/null
|
||||
if [ $? = 0 ] ; then
|
||||
say @B"Xrdp successfully installed!" green
|
||||
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 '* Version 0.2.0 *'
|
||||
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 *'
|
||||
@ -529,8 +761,18 @@ 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
|
||||
if [ "$OS" = "CENTOS8" ] ; then
|
||||
dnf -y install nginx certbot python3-certbot-nginx
|
||||
systemctl enable nginx
|
||||
systemctl start nginx
|
||||
elif [ "$OS" = "CENTOS7" ] ; then
|
||||
yum -y install nginx certbot python-certbot-nginx
|
||||
systemctl enable nginx
|
||||
systemctl start nginx
|
||||
else
|
||||
apt-get install nginx certbot python3-certbot-nginx -y
|
||||
fi
|
||||
say @B"Nginx successfully installed!" green
|
||||
cat > /etc/nginx/conf.d/guacamole.conf <<END
|
||||
server {
|
||||
listen 80;
|
||||
@ -568,7 +810,7 @@ END
|
||||
say @B"Let's Encrypt certificate not installed! If you would like to install a Let's Encrypt certificate later, please manually run \"certbot --nginx --agree-tos --redirect --hsts --staple-ocsp -d $guacamole_hostname\"." yellow
|
||||
say @B"You can now access your desktop at http://${guacamole_hostname}!" green
|
||||
fi
|
||||
say @B"Your username is $guacamole_username and your password is $guacamole_password_prehash." green
|
||||
say @B"Your Guacamole username is $guacamole_username and your Guacamole password is $guacamole_password_prehash." green
|
||||
}
|
||||
|
||||
function main
|
||||
@ -579,22 +821,34 @@ function main
|
||||
fi
|
||||
echo "This script is going to install a desktop environment with browser access."
|
||||
echo
|
||||
say @B"This environment requires at least 1 GB of RAM." yellow
|
||||
if [ "$OS" = "CENTOS7" ] || [ "$OS" = "CENTOS8" ] ; then
|
||||
say @B"This environment requires at least 1.5 GB of RAM." yellow
|
||||
else
|
||||
say @B"This environment requires at least 1 GB of RAM." yellow
|
||||
fi
|
||||
echo
|
||||
echo "Would you like to proceed? [Y/N]"
|
||||
read confirm_installation
|
||||
if [ "x$confirm_installation" = "xY" ] || [ "x$confirm_installation" = "xy" ] ; then
|
||||
determine_system_variables
|
||||
get_user_options
|
||||
install_guacamole
|
||||
if [ "$OS" = "CENTOS7" ] || [ "$OS" = "CENTOS8" ] ; then
|
||||
install_guacamole_centos
|
||||
else
|
||||
install_guacamole_ubuntu_debian
|
||||
fi
|
||||
install_guacamole_web
|
||||
configure_guacamole
|
||||
if [ "$OS" = "CENTOS7" ] || [ "$OS" = "CENTOS8" ] ; then
|
||||
configure_guacamole_centos
|
||||
else
|
||||
configure_guacamole_ubuntu_debian
|
||||
fi
|
||||
if [ $choice_rdpvnc = 1 ] ; then
|
||||
install_rdp
|
||||
else
|
||||
install_vnc
|
||||
fi
|
||||
if [ "x$install_nginx" = "xY" ] || [ "x$install_nginx" = "xy" ] ; then
|
||||
if [ "x$install_nginx" != "xn" ] && [ "x$install_nginx" != "xN" ] ; then
|
||||
install_reverse_proxy
|
||||
else
|
||||
say @B"You can now access your desktop at http://$(curl -s icanhazip.com):8080/guacamole!" green
|
||||
|
||||
Loading…
Reference in New Issue
Block a user