Cómo descargar archivos desde una URL con un script de bash

En el dinámico entorno de TI actual, la automatización y el scripting son herramientas esenciales para los profesionales de TI y los proveedores de servicios gestionados (MSP). Ya sea para desplegar aplicaciones, gestionar la infraestructura o solucionar problemas, los scripts pueden ahorrar incontables horas de trabajo manual, aumentar la eficacia y reducir los errores humanos. Una tarea común que los profesionales a menudo necesitan automatizar es la descarga de archivos desde una URL utilizando un script de shell, concretamente un script de bash.

Echemos un vistazo más de cerca a un script de bash que no sólo descarga archivos desde URL, sino que también verifica el contenido del archivo con una suma MD5 proporcionada y crea las estructuras de directorio necesarias si aún no existen.

Script de bash para descargar archivos desde una URL

#!/usr/bin/env bash
# Description: Downloads a file from a URL to a specified path, and can verify the file content with a provided md5 sum.
#
# Release Notes: Initial Release
# (c) 2023 NinjaOne
#   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).
#
# Usage: <url> <download file path> [expected md5 sum]
# <> are required
# [] are optional
# Example: https://www.nirsoft.net/utils/advancedrun.zip /tmp/advancedrun.zip
#  Downloads advancedrun.zip
# Example: https://www.nirsoft.net/utils/advancedrun.zip /tmp/advancedrun.zip 1f0913135878bb6cd30c1f3f6cf4b882
#  Downloads advancedrun.zip, verify's the provided md5 summed hash
#
# Notes: If the path doesn't exist this script will create the folders needed to place it there.
#  If you used /tmp/MyFiles/advancedrun.zip and the MyFiles folder didn't exist then it would create it.
#  The same for /tmp/MyFiles/Tools/advancedrun.zip, it would create MyFiles and Tools.

# Parameters
URL=$1
SAVE_PATH=$2
SUM=$3

URL_CHECK_REGEX='(https?|ftp|file)://[-[:alnum:]+&@#/%?=~_|!:,.;]*[-[:alnum:]+&@#/%=~_|]'
if [[ "${URL}" =~ ${URL_CHECK_REGEX} ]]; then
    echo "${URL} is a valid URL."
else
    echo "${URL} is an invalid URL."
    exit 1
fi

# Verify that the path provided is in a valid format, and create the folder structure if needed.
PATH_CHECK_REGEX='^(/[^/ ]*)+/?$'
if [[ "${SAVE_PATH}" =~ ${PATH_CHECK_REGEX} ]]; then
    echo "${SAVE_PATH} is a valid path."
    FOLDER=$(dirname "${SAVE_PATH}")
    if [[ -d "${FOLDER}" ]]; then
        echo "Folder ${FOLDER} exists"
    else
        echo "Folder ${FOLDER} does not exist, creating."
        mkdir -p -v "${FOLDER}"
        if [ -f "${FOLDER}" ]; then
            echo "Created ${FOLDER}"
        else
            echo "Failed to created ${FOLDER}"
            exit 1
        fi
    fi
else
    echo "${SAVE_PATH} is an invalid path."
    exit 1
fi

function private_download() {
    # $1 = URL
    # $2 = File Path
    if [ "$(command -v wget)" ]; then
        echo "Downloading using wget"
        wget -O "$2" "$1"
    elif [ "$(command -v curl)" ]; then
        echo "Downloading using curl"
        curl "$1" --output "$2"
    else
        echo "Failed to find wget or curl."
        exit 1
    fi
}

function private_gethash() {
    FILE=$1
    HASH=$2
    WAS_ERROR=0
    if ! command -v md5 &>/dev/null; then
        # This should never happen
        echo "md5 could not be found"
        WAS_ERROR=1
    fi
    if [ "$(command -v md5)" ]; then
        CURRENT_HASH=$(md5 "${FILE}")
        # "##* " in "${CURRENT_HASH##* }" gets the last word in a string
        if [ "${HASH}" = "${CURRENT_HASH##* }" ]; then
            echo "File matches md5sum hash"
            WAS_ERROR=0
        else
            echo "File does not match md5sum hash"
            echo "Expected: ${CURRENT_HASH}"
            echo "File: ${HASH}"
            WAS_ERROR=1
        fi
    fi
    if [ ${WAS_ERROR} == 1 ]; then
        echo "Error verifying hash sum."
        exit 1
    fi
}

function private_validate() {
    if [ -f "$1" ]; then
        echo "File Downloaded."
        private_gethash "$1" "$2"
    else
        echo "Failed to download file."
        exit 1
    fi
}

# Download file
private_download "${URL}" "${SAVE_PATH}"
# If SUM is not empty
if [[ -n "${SUM}" ]]; then
    # Verify that the file was download
    # Compare hash from parameter to the file's calculated md5 sum
    private_validate "${SAVE_PATH}" "${SUM}"
fi

Resumen del script

Este script toma en cuenta principalmente tres parámetros: la URL desde donde se debe descargar el archivo, la ruta donde se debe guardar el archivo y un hash MD5 opcional para verificar el contenido. Si la ruta no existe, el script creará las carpetas necesarias, lo que supone una ventaja significativa cuando se trata de estructuras de directorios complejas. 

El script comienza validando la URL y los parámetros de la ruta. Si alguno de estos parámetros no es válido, se saldrá inmediatamente y lanzará un error. El script utiliza expresiones regulares para validar la URL y la ruta.  

Una vez verificados los parámetros, procede a descargar el archivo. El script está diseñado para utilizar ‘wget’ o ‘curl’ en función de lo que esté disponible en el entorno.  

Después de descargar correctamente el archivo, si se proporcionó un hash MD5, verifica el contenido del archivo descargado con el hash proporcionado. Esta función es especialmente útil para garantizar la integridad de los archivos, un aspecto crítico en muchas operaciones de TI. 

Comandos de script

El script utiliza principalmente los comandos ‘wget’ o ‘curl’ para descargar archivos, que son herramientas comunes en los sistemas basados en Unix. Tanto ‘wget’ como ‘curl’ son utilidades gratuitas para la descarga no interactiva de archivos desde la web, compatibles con los protocolos HTTP, HTTPS y FTP.  

El script también utiliza ‘md5’, una utilidad de línea de comandos que calcula y comprueba el compendio de mensajes MD5. El valor hash MD5 (128 bits) se representa normalmente como una secuencia de 32 dígitos hexadecimales. Se utiliza para garantizar la integridad de los datos de los archivos mediante la producción de un valor hash único para el contenido de un archivo. Si dos archivos tienen el mismo valor hash MD5, es muy probable que sean el mismo. 

El comando ‘mkdir -p’ se utiliza para crear la ruta del directorio si no existe. La opción “-p” garantiza que no se produzca ningún error si el directorio indicado como operando ya existe. 

El script utiliza ‘command -v’ para comprobar la disponibilidad de los comandos ‘wget’, ‘curl’ y ‘md5’ en el entorno. También utiliza expresiones regulares y sentencias condicionales ‘[[‘ and ‘]]’ para validar la URL y la ruta. 

A continuación, vamos a profundizar en el script y explorar sus posibles aplicaciones. 

Posibles aplicaciones

Este script de bash puede ser utilizado en una variedad de escenarios: 

  1. Actualizaciones de software: el script puede utilizarse para automatizar la descarga de actualizaciones de software desde el sitio web de un proveedor. Una vez descargadas, podría utilizarse otro script para aplicar estas actualizaciones en varios sistemas de una red.
  1. Parches de seguridad: los parches de seguridad suelen publicarse como archivos descargables en Internet. Este script puede automatizar el proceso de descarga de estos parches, garantizando que todos los sistemas de una red permanezcan actualizados y seguros.
  1. Archivos de datos: en entornos con muchos datos, es habitual tener archivos de datos alojados en servidores web. Este script puede utilizarse para descargar dichos archivos para su posterior análisis o procesamiento de datos.
  1. Sistemas distribuidos: en un sistema distribuido, puede existir la necesidad de descargar y verificar un archivo específico a través de múltiples sistemas. El script puede utilizarse para garantizar que se utiliza la misma versión de un archivo en todos los sistemas.
  1. Copia de seguridad y recuperación: el script se puede utilizar para descargar archivos de copia de seguridad de un servidor remoto con fines de recuperación de desastres.

Al comprender la mecánica del script, los profesionales de TI pueden modificarlo y ampliarlo para adaptarlo a sus necesidades específicas, mejorando aún más sus capacidades de automatización. 

Ventajas para los profesionales de TI y los MSP

Este script ofrece numerosas ventajas para los profesionales de TI y los MSP: 

  • Ahorro de tiempo: en lugar de descargar archivos manualmente, los profesionales pueden utilizar este script para automatizar el proceso, ahorrando así un tiempo valioso.
  • Reducción de errores: con la descarga automática y la verificación MD5, las posibilidades de error humano se reducen significativamente.
  • Flexibilidad: El script puede utilizar tanto ‘wget’ como ‘curl’, lo que lo hace adaptable a diferentes entornos.
  • Integridad del archivo: Al comparar los hashes MD5, el script garantiza la integridad del archivo descargado, lo que es crucial en operaciones sensibles a la seguridad.

Reflexiones finales

Este script de bash simplifica una tarea común, mejora la eficiencia y aumenta la fiabilidad y la seguridad. Tanto si eres un administrador de sistemas experimentado como si acabas de empezar en el mundo de las TI, este script es un valioso complemento para tu kit de herramientas. 

La plataforma de gestión y monitoreo remoto altamente calificado de NinjaOne puede permitir el despliegue y ejecución de este script de bash a través de múltiples sistemas de una manera fluida.

Ya sea que estés buscando descargar actualizaciones de software, parches de seguridad o archivos de datos, la integración de este script con NinjaOne puede ayudar a automatizar y agilizar estos procesos de TI. Puede garantizar la coherencia, reducir los errores manuales y ahorrar tiempo al permitir implantaciones masivas. Por lo tanto, cuando se utilizan junto con este script, las sólidas capacidades de NinjaOne pueden mejorar en gran medida la eficiencia operativa y la productividad. 

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).