Guía paso a paso para automatizar la instalación de ConnectWise ScreenConnect en Linux

En el panorama actual de las TI, las herramientas de asistencia remota son indispensables para los proveedores de servicios gestionados (MSP) y los profesionales de TI. Estas herramientas facilitan la solución eficaz de problemas y la gestión de dispositivos remotos, reduciendo el tiempo de inactividad y mejorando la productividad.

ConnectWise ScreenConnect, una sólida solución de asistencia remota, es muy utilizada por sus completas funciones y su facilidad de uso. Automatizar el proceso de instalación de estas herramientas puede ahorrar mucho tiempo y esfuerzo. Este post profundiza en un script Bash diseñado para automatiza la descarga e instalación de ConnectWise ScreenConnect en sistemas Linux, destacando sus características, uso y ventajas.

Contexto

ConnectWise ScreenConnect permite a los profesionales de TI acceder y controlar dispositivos de forma remota, proporcionando una experiencia de asistencia sin interrupciones. La instalación de ConnectWise ScreenConnect en varios dispositivos puede ser tediosa, especialmente cuando se requiere la personalización para diferentes configuraciones organizativas.

El script proporcionado para la instalación de ConnectWise automatiza este proceso, permitiendo la personalización de varios parámetros como el nombre de la empresa, el tipo de dispositivo, la ubicación, etc. Esta automatización es especialmente beneficiosa para los MSP que gestionan numerosos entornos de clientes, ya que garantiza una implementación coherente y eficaz.

El script para automatizar la instalación de ConnectWise

#!/usr/bin/env bash
#
# Description: Download and install ConnectWise ScreenConnect. This script supports automatic customization of the company name, device type, location, and other ScreenConnect fields.
# By using this script, you indicate your acceptance of the following legal terms as well as our Terms of Use at https://www.ninjaone.com/terms-of-use.
# Ownership Rights: NinjaOne owns and will continue to own all right, title, and interest in and to the script (including the copyright). NinjaOne is giving you a limited license to use the script in accordance with these legal terms. 
# Use Limitation: You may only use the script for your legitimate personal or internal business purposes, and you may not share the script with another party. 
# Republication Prohibition: Under no circumstances are you permitted to re-publish the script in any script library or website belonging to or under the control of any other software provider. 
# Warranty Disclaimer: The script is provided “as is” and “as available”, without warranty of any kind. NinjaOne makes no promise or guarantee that the script will be free from defects or that it will meet your specific needs or expectations. 
# Assumption of Risk: Your use of the script is at your own risk. You acknowledge that there are certain inherent risks in using the script, and you understand and assume each of those risks. 
# Waiver and Release: You will not hold NinjaOne responsible for any adverse or unintended consequences resulting from your use of the script, and you waive any legal or equitable rights or remedies you may have against NinjaOne relating to your use of the script. 
# EULA: If you are a NinjaOne customer, your use of the script is subject to the End User License Agreement applicable to you (EULA).
#
# Preset Parameter: --screenconnectdomain "replace.me"
#   Replace the text encased in quotes to have the script build the download URL and then install ScreenConnect.
#
# Preset Parameter: --useOrgName
#   Modifies your URL to use the organization name in the "Company Name" Field in ScreenConnect.
#
# Preset Parameter: --useLocation
#   Modifies your URL to use the Location Name in the "Site" Field in ScreenConnect.
#
# Preset Parameter: --deviceType "REPLACEME"
#   Modifies your URL to fill in the "Device Type" field in ScreenConnect. (Either Workstation or Laptop).
#
# Preset Parameter: --Department "REPLACEME"
#   Modifies your URL to fill in the Department name with the text encased in quotes
#
# Preset Parameter: --skipSleep
#   By default, this script sleeps at a random interval (between 3 and 30 seconds) before downloading the installation file.
#   This option skips the sleep interval.
#
# Pre-set Parameter: --help
#   Displays some help text.

# These are all our preset parameter defaults. You can set these = to something if you would prefer the script automatically assumed a parameter is used.
_arg_screenconnectdomain=
# For parameters that don't have arguments "on" or "off" is used.
_arg_useOrgName="off"
_arg_useLocation="off"
_arg_department=
_arg_devicetype=
_arg_destfolder=/tmp
_arg_skipsleep="off"
_arg_installJava="off"

# Help text function for when invalid input is encountered
print_help() {
  printf '\n\n%s\n\n' 'Usage: [--screenconnectdomain <arg>] [--useOrgName] [--useLocation] [--deviceType <arg>] [--department <arg>] [--skipSleep] [-h|--help]'
  printf '\n%s\n' 'Preset Parameter: --screenconnectdomain "replace.me"'
  printf '\t%s' "Replace the text encased in quotes with the domain used for ConnectWise ScreenConnect. e.g. 'example.screenconnect.com'"
  printf '\n%s\n' 'Preset Parameter: --useOrgName'
  printf '\t%s\n' "Modifies your URL in order to fill in the 'Company Name' field in ScreenConnect with the Organization Name."
  printf '\n%s\n' 'Preset Parameter: --useLocation'
  printf '\t%s\n' "Modifies your URL to fill in the 'Site Name' field in ScreenConnect with the device's location as specified in Ninja."
  printf '\n%s\n' 'Preset Parameter: --department "YourDesiredDepartmentName"'
  printf '\t%s\n' "Modifies your URL in order to fill in the 'Department' field in ScreenConnect with the text encased in quotes."
  printf '\n%s\n' 'Preset Parameter: --devicetype "YourDesiredDeviceType"'
  printf '\t%s\n' "Modifies your URL in order to fill in the 'Device Type' field in ScreenConnect with the text encased in quotes."
  printf '\n%s\n' 'Preset Parameter: --skipSleep'
  printf '\t%s\n' "By default this script will sleep at a random interval between 3 and 60 seconds prior to download. Use this option to skip this behavior."
  printf '\n%s\n' 'Preset Parameter: --installJava'
  printf '\t%s\n' "Install Java if it's not already present."
  printf '\n%s\n' 'Preset Parameter: --help'
  printf '\t%s\n' "Displays this help menu."
}

# Determines whether or not help text is necessary and routes the output to stderr
die() {
  local _ret="${2:-1}"
  echo "$1" >&2
  test "${_PRINT_HELP:-no}" = yes && print_help >&2
  exit "${_ret}"
}

# Grabbing the parameters and parsing through them.
parse_commandline() {
  while test $# -gt 0; do
    _key="$1"
    case "$_key" in
    --screenconnectdomain | --domain)
      test $# -lt 2 && die "Missing value for the optional argument '$_key'." 1
      _arg_screenconnectdomain=$2
      shift
      ;;
    --screenconnectdomain=*)
      _arg_screenconnectdomain="${_key##--screenconnectdomain=}"
      ;;
    --useOrgName | --useorgname | --orgname)
      _arg_useOrgName="on"
      ;;
    --useLocation | --useOrgLocation | --uselocation | --location)
      _arg_useLocation="on"
      ;;
    --deviceType | --devicetype)
      test $# -lt 2 && die "Missing value for the optional argument '$_key'." 1
      _arg_devicetype="$2"
      shift
      ;;
    --devicetype=*)
      _arg_devicetype="${_key##--devicetype=}"
      ;;
    --department | --Department)
      test $# -lt 2 && die "Missing value for the optional argument '$_key'." 1
      _arg_department="$2"
      shift
      ;;
    --department=*)
      _arg_department="${_key##--department=}"
      ;;
    --installJava)
      _arg_installJava="on"
      ;;
    --skipsleep | --skipSleep)
      _arg_skipsleep="on"
      ;;
    --help | -h)
      _PRINT_HELP=yes die 0
      ;;
    *)
      _PRINT_HELP=yes die "FATAL ERROR: Got an unexpected argument '$1'" 1
      ;;
    esac
    shift
  done
}

parse_commandline "$@"

# If script form is used, override command-line arguments

if [[ -n $screenconnectDomainName ]]; then
  _arg_screenconnectdomain="$screenconnectDomainName"
fi

if [[ -n $installJavaIfMissing && $installJavaIfMissing == "true" ]]; then
  _arg_installJava="on"
fi

if [[ -n $instanceId ]]; then
  _arg_instanceId="$instanceId"
fi

if [[ -n $useNinjaOrganizationName && $useNinjaOrganizationName == "true" ]]; then
  _arg_useOrgName="on"
fi

if [[ -n $useNinjaLocationName && $useNinjaLocationName == "true" ]]; then
  _arg_useLocation="on"
fi

if [[ -n $deviceType ]]; then
  _arg_devicetype="$deviceType"
fi

if [[ -n $department ]]; then
  _arg_department="$department"
fi

if [[ -n $skipSleep && $skipSleep == "true" ]]; then
  _arg_skipsleep="on"
fi

# This function will download our file when we're ready for that.
downloadFile() {
  i=1
  while [[ $i -lt 4 ]]; do
    if [[ ! $_arg_skipsleep == "on" ]]; then
      sleepTime=$((3 + RANDOM % 30))
      echo "Sleeping for $sleepTime seconds."
      sleep $sleepTime
    fi

    echo "Download Attempt $i"
    wget -q -O "$_arg_destfolder/$filename" "$url"

    file=$_arg_destfolder/$filename
    if [[ -f $file ]]; then
      echo 'Download was successful!'
      i=4
    else
      echo 'Attempt Failed!'
      ((i += 1))
    fi
  done
}

# Check if deb or rpm distro
usesDeb=$(command -v dpkg)
usesRpm=$(command -v rpm)

if [[ -z $usesDeb && -z $usesRpm ]]; then
  _PRINT_HELP=no die "FATAL ERROR: rpm or dpkg cannot be found. ConnectWise ScreenConnect cannot be installed on this system. https://screenconnect.connectwise.com/blog/remote-support-access/remote-desktop-linux" 1
fi

# If we're not given a download method error out
if [[ -z $_arg_screenconnectdomain ]]; then
  _PRINT_HELP=yes die "FATAL ERROR: A download url or the domain you use for ScreenConnect is required to install ScreenConnect." 1
fi

pattern='^http(.?)://(.*)'
if [[ $_arg_screenconnectdomain =~ $pattern ]]; then
  _arg_screenconnectdomain=${_arg_screenconnectdomain//http*:\/\//}
  echo "You accidentally included http with the domain. Using '$_arg_screenconnectdomain' instead."
fi

# If the destination folder doesn't exist create it.
if [[ ! -d $_arg_destfolder ]]; then
  mkdir "$_arg_destfolder"
fi

# Setting filename depending on if its a Debian package or a Redhat package.
if [[ -n $usesDeb ]]; then
  filename="ClientSetup.deb"
else
  filename="ClientSetup.rpm"
fi

# If a file already exists with that name remove it.
if [[ -f "$_arg_destfolder/$filename" ]]; then
  rm "$_arg_destfolder/$filename"
fi

# Start the build process
echo "Building URL..."
usesPython2=$(command -v python2)
usesPython3=$(command -v python3)

if [[ -z $usesPython2 && -z $usesPython3 ]]; then
  _PRINT_HELP=no die "FATAL ERROR: python is required for this script to function!"
fi

# For anything we put in the url we'll need to escape it as wget won't do this conversion for us.
encodeURL() {
  local toEncode=$1
  local encodedURL

  if [[ -n $usesPython3 ]]; then
    encodedURL=$(python3 -c "import urllib.parse;print(urllib.parse.quote('$toEncode'))")
  else
    encodedURL=$(python2 -c "import urllib;print urllib.quote('$toEncode')")
  fi
  echo "$encodedURL"
}

companyName=$(encodeURL "$NINJA_COMPANY_NAME")
baseURL="https://$_arg_screenconnectdomain/Bin/$companyName.$filename?e=Access&y=Guest"

# If the technician specified --useOrgName (or any other switch/flag) we set it to "on" when we parse the parameters
if [[ $_arg_useOrgName == "on" ]]; then
  orgName=$(encodeURL "$NINJA_ORGANIZATION_NAME")
  baseURL="$baseURL&c=$orgName"
else
  # If they decided to not use that field we just leave it blank so ScreenConnect will skip over it.
  baseURL="$baseURL&c="
fi

if [[ $_arg_useLocation == "on" ]]; then
  location=$(encodeURL "$NINJA_LOCATION_NAME")
  baseURL="$baseURL&c=$location"
else
  baseURL="$baseURL&c="
fi

if [[ -n $_arg_department ]]; then
  _arg_department=$(encodeURL "$_arg_department")
  baseURL="$baseURL&c=$_arg_department"
else
  baseURL="$baseURL&c="
fi

if [[ -n $_arg_devicetype ]]; then
  _arg_devicetype=$(encodeURL "$_arg_devicetype")
  baseURL="$baseURL&c=$_arg_devicetype&c=&c=&c=&c="
else
  baseURL="$baseURL&c=&c=&c=&c=&c="
fi

url="$baseURL"
echo "URL Built: $url"

# At this point we should have everything setup for us to be able to download the file.
downloadFile

# Lets check if the download was a success
file="$_arg_destfolder/$filename"
if [[ ! -f $file ]]; then
  _PRINT_HELP=no die "FATAL ERROR: The Installation File has failed to download please try again." 1
fi

# Grabs a list of all installed packages and then filters it by connectwisecontrol-yourinstanceid
if [[ -n $usesDeb ]]; then
  packageName=$(dpkg --info $file | grep "Package: " | sed 's/Package: //g')
  installedPkg=$(dpkg -l | grep "$packageName")
else
  packageName=$(rpm -qp $file --info | grep "Name" | sed 's/Name *: //g')
  installedPkg=$(rpm -q "$packageName" | grep -v "installed")
fi

if [[ -n $installedPkg ]]; then
  echo "ConnectWise ScreenConnect is already installed!"
  exit 0
else
  echo "ConnectWise ScreenConnect is not installed. Installing..."
fi

# Checking for dependencies and if they're not installed install them
javaIsInstalled=$(java -version 2>&1 | grep Runtime)
if [[ -z $javaIsInstalled && $_arg_installJava == "on" ]]; then
  echo "Java is not installed. Java is required to install ConnectWise ScreenConnect. Attempting to install automatically."
  if [[ -n $usesDeb ]]; then
    if apt-get update; then
      echo "Updated apt package repos successfully. Installing default-jre..."
      if apt-get install -y default-jre; then
        echo "Default jre installed successfully!"
      else
        rm "$file"
        _PRINT_HELP=no die "FATAL ERROR: Failed to install default-jre using apt-get! We recommend fixing this prior to attempting to install ScreenConnect." 1
      fi
    else
      rm "$file"
      _PRINT_HELP=no die "FATAL ERROR: Failed to update package repositories using apt-get update! We recommend fixing this prior to attempting to install ScreenConnect." 1
    fi
  else
    usesDnf=$(command -v dnf)
    if [[ -n $usesDnf ]]; then
      if dnf install java -y; then
        echo "Installed latest jre successfully!"
      else
        rm "$file"
        _PRINT_HELP=no die "FATAL ERROR: Failed to install latest jre using dnf! We recommend fixing this prior to attempting to install ScreenConnect." 1
      fi
    else
      if yum install java -y; then
        echo "Installed latest jre successfully!"
      else
        rm "$file"
        _PRINT_HELP=no die "FATAL ERROR: Failed to install latest jre using yum! We recommend fixing this prior to attempting to install ScreenConnect." 1
      fi
    fi 
  fi
elif [[ -z $javaIsInstalled ]]; then
  rm "$file"
  _PRINT_HELP=no die "FATAL ERROR: Please check the box 'Install Java If Missing' in order to have this script install Java as it is required."
else
  echo "Java is installed!"
fi

# Start installing
echo "Installing application..."
if [[ -n $usesDeb ]]; then
  if dpkg -i "$file"; then
    echo "Exit Code: $?"
    echo "ConnectWise ScreenConnect Installed Successfully!"
    rm "$file"
    exit 0
  else
    echo "Exit Code: $?"
    rm "$file"
    _PRINT_HELP=no die "FATAL ERROR: The Installation has failed!" 1
  fi
else
  if rpm -i "$file"; then
    echo "Exit Code: $?"
    echo "ConnectWise ScreenConnect Installed Successfully!"
    rm "$file"
    exit 0
  else
    echo "Exit Code: $?"
    rm "$file"
    _PRINT_HELP=no die "FATAL ERROR: The Installation has failed!" 1
  fi
fi

 

Análisis detallado

El script para automatizar la instalación de ConnectWise está estructurado para facilitar la automatización de la descarga e instalación de ConnectWise ScreenConnect en sistemas Linux. Aquí tienes un desglose paso a paso de cómo funciona:

  • Parámetros preestablecidos y valores por defecto: el script para automatizar la instalación de ConnectWise comienza definiendo los parámetros preestablecidos y sus valores por defecto. Estos parámetros incluyen el dominio ScreenConnect, el nombre de la organización, el tipo de dispositivo, la ubicación, etc. Los usuarios pueden modificar estos valores por defecto para adaptarlos a sus necesidades específicas.
  • Función texto de ayuda: la función print_help proporciona orientación sobre cómo utilizar el script para automatizar la instalación de ConnectWise, detallando cada parámetro y su propósito.
  • Análisis de parámetros: la función parse_commandline analiza los argumentos de la línea de comandos y establece las variables adecuadas en función de la información introducida por el usuario.
  • Función de descarga: la función downloadFile se encarga del proceso de descarga. Reintenta hasta tres veces, incorporando un intervalo de espera aleatorio entre intentos para mitigar posibles problemas de descarga.
  • Instalación lógica: el script para automatizar la instalación de ConnectWise comprueba la presencia de las herramientas necesarias (dpkg o rpm), construye la URL de descarga e inicia la descarga. También se encarga de la instalación de Java si es necesario.

Posibles casos de uso

Imaginemos una situación en la que un proveedor de servicios gestionados tiene que ocuparse de la instalación de ConnectWise ScreenConnect en una base de clientes diversa. Este script simplifica el proceso de automatizar la descarga y la instalación de ConnectWise, garantizando que cada despliegue se personaliza con los detalles organizativos correctos. Por ejemplo, el MSP puede especificar distintos tipos de dispositivos y ubicaciones para cada cliente, lo que agiliza el proceso de configuración y garantiza la coherencia en todas las implementaciones.

Comparaciones

En comparación con la instalación manual, este script para automatizar la instalación de ConnectWise reduce significativamente el tiempo y el esfuerzo necesarios. Otros métodos, como el uso de instaladores gráficos, son menos eficaces para las implantaciones masivas. Aunque herramientas de gestión de la configuración como Ansible o Puppet ofrecen funciones de automatización similares, este script para automatizar la instalación de ConnectWise proporciona una solución ligera y sencilla sin necesidad de infraestructura adicional.

FAQ

  1. ¿Qué ocurre si falla la descarga? El script para automatizar la instalación de ConnectWise reintenta la descarga hasta tres veces, incorporando un intervalo de espera aleatorio para evitar los límites de velocidad del servidor.
  2. ¿Puedo utilizar este script en cualquier distribución de Linux? El script para automatizar la instalación de ConnectWise es compatible con las distribuciones que utilizan los sistemas de gestión de paquetes dpkg (basadas en Debian) o rpm (basadas en Red Hat).
  3. ¿Es necesario Java para este script para automatizar la instalación de ConnectWise? Sí, se requiere Java. El script puede instalar Java automáticamente si no está presente.

Implicaciones

La automatización de la instalación de herramientas de asistencia remota como ConnectWise ScreenConnect garantiza despliegues coherentes y sin errores. Este script para automatizar la instalación de ConnectWise no sólo ahorra tiempo, sino que también mejora la seguridad al reducir la probabilidad de que se produzcan errores de configuración. En un contexto más amplio, los scripts de despliegue automatizado contribuyen a un entorno informático más seguro y manejable, sobre todo en operaciones a gran escala.

Recomendaciones

Cuando utilices este script para automatizar la instalación de ConnectWise, asegúrate de que:

  • Se conceden los permisos necesarios para la ejecución.
  • El script para automatizar la instalación de ConnectWise se prueba en un entorno controlado antes de su despliegue.
  • Los parámetros se revisan cuidadosamente y se adaptan en función de las necesidades.

Reflexiones finales

El script proporcionado es una herramienta valiosa para los profesionales de TI y los MSP que quieran agilizar la instalación de ConnectWise ScreenConnect. Al automatizar el proceso de descarga e instalación, se ahorra tiempo y se garantiza la coherencia en varias instalaciones. NinjaOne ofrece soluciones integrales de gestión de TI que complementan dichos scripts de automatización, proporcionando una plataforma robusta para gestionar el soporte remoto y otras operaciones de TI de manera eficaz.

Categorías:

Quizá también te interese…

×

¡Vean a NinjaOne en acción!

Al enviar este formulario, acepto la política de privacidad de NinjaOne.

Términos y condiciones de NinjaOne

Al hacer clic en el botón “Acepto” que aparece a continuación, estás aceptando los siguientes términos legales, así como nuestras Condiciones de uso:

  • Derechos de propiedad: NinjaOne posee y seguirá poseyendo todos los derechos, títulos e intereses sobre el script (incluidos los derechos de autor). NinjaOne concede al usuario una licencia limitada para utilizar el script de acuerdo con estos términos legales.
  • Limitación de uso: solo podrás utilizar el script para tus legítimos fines personales o comerciales internos, y no podrás compartirlo con terceros.
  • Prohibición de republicación: bajo ninguna circunstancia está permitido volver a publicar el script en ninguna biblioteca de scripts que pertenezca o esté bajo el control de cualquier otro proveedor de software.
  • Exclusión de garantía: el script se proporciona “tal cual” y “según disponibilidad”, sin garantía de ningún tipo. NinjaOne no promete ni garantiza que el script esté libre de defectos o que satisfaga las necesidades o expectativas específicas del usuario.
  • Asunción de riesgos: el uso que el usuario haga del script corre por su cuenta y riesgo. El usuario reconoce que existen ciertos riesgos inherentes al uso del script, y entiende y asume cada uno de esos riesgos.
  • Renuncia y exención: el usuario no hará responsable a NinjaOne de cualquier consecuencia adversa o no deseada que resulte del uso del script y renuncia a cualquier derecho o recurso legal o equitativo que pueda tener contra NinjaOne en relación con su uso del script.
  • CLUF: si el usuario es cliente de NinjaOne, su uso del script está sujeto al Contrato de Licencia para el Usuario Final (CLUF).