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