{"id":208599,"date":"2023-09-08T12:48:11","date_gmt":"2023-09-08T12:48:11","guid":{"rendered":"https:\/\/www.ninjaone.com\/script-hub\/descargar-script-de-bash\/"},"modified":"2024-02-28T21:55:35","modified_gmt":"2024-02-28T21:55:35","slug":"descargar-script-de-bash","status":"publish","type":"script_hub","link":"https:\/\/www.ninjaone.com\/es\/script-hub\/descargar-script-de-bash\/","title":{"rendered":"C\u00f3mo descargar archivos desde una URL con un script de bash"},"content":{"rendered":"<p><span data-contrast=\"auto\">En el din\u00e1mico entorno de TI actual, la automatizaci\u00f3n y el scripting son herramientas esenciales para los profesionales de TI y los <\/span><a href=\"https:\/\/www.ninjaone.com\/es\/que-es-un-msp\"><span data-contrast=\"none\">proveedores de servicios gestionados (MSP)<\/span><\/a><span data-contrast=\"auto\">. 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\u00fan 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.<\/span><\/p>\n<p><span data-contrast=\"auto\">Echemos un vistazo m\u00e1s de cerca a un script de bash que no s\u00f3lo descarga archivos desde URL, sino que tambi\u00e9n verifica el contenido del archivo con una suma MD5 proporcionada y crea las estructuras de directorio necesarias si a\u00fan no existen.<\/span><\/p>\n<h2>Script de bash para descargar archivos desde una URL<\/h2>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\">#!\/usr\/bin\/env bash\r\n# Description: Downloads a file from a URL to a specified path, and can verify the file content with a provided md5 sum.\r\n#\r\n# Release Notes: Initial Release\r\n# (c) 2023 NinjaOne\r\n#   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.\r\n#   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. \r\n#   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. \r\n#   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. \r\n#   Warranty Disclaimer: The script is provided \u201cas is\u201d and \u201cas available\u201d, 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. \r\n#   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. \r\n#   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. \r\n#   EULA: If you are a NinjaOne customer, your use of the script is subject to the End User License Agreement applicable to you (EULA).\r\n#\r\n# Usage: &lt;url&gt; &lt;download file path&gt; [expected md5 sum]\r\n# &lt;&gt; are required\r\n# [] are optional\r\n# Example: https:\/\/www.nirsoft.net\/utils\/advancedrun.zip \/tmp\/advancedrun.zip\r\n#  Downloads advancedrun.zip\r\n# Example: https:\/\/www.nirsoft.net\/utils\/advancedrun.zip \/tmp\/advancedrun.zip 1f0913135878bb6cd30c1f3f6cf4b882\r\n#  Downloads advancedrun.zip, verify's the provided md5 summed hash\r\n#\r\n# Notes: If the path doesn't exist this script will create the folders needed to place it there.\r\n#  If you used \/tmp\/MyFiles\/advancedrun.zip and the MyFiles folder didn't exist then it would create it.\r\n#  The same for \/tmp\/MyFiles\/Tools\/advancedrun.zip, it would create MyFiles and Tools.\r\n\r\n# Parameters\r\nURL=$1\r\nSAVE_PATH=$2\r\nSUM=$3\r\n\r\nURL_CHECK_REGEX='(https?|ftp|file):\/\/[-[:alnum:]+&amp;@#\/%?=~_|!:,.;]*[-[:alnum:]+&amp;@#\/%=~_|]'\r\nif [[ \"${URL}\" =~ ${URL_CHECK_REGEX} ]]; then\r\n    echo \"${URL} is a valid URL.\"\r\nelse\r\n    echo \"${URL} is an invalid URL.\"\r\n    exit 1\r\nfi\r\n\r\n# Verify that the path provided is in a valid format, and create the folder structure if needed.\r\nPATH_CHECK_REGEX='^(\/[^\/ ]*)+\/?$'\r\nif [[ \"${SAVE_PATH}\" =~ ${PATH_CHECK_REGEX} ]]; then\r\n    echo \"${SAVE_PATH} is a valid path.\"\r\n    FOLDER=$(dirname \"${SAVE_PATH}\")\r\n    if [[ -d \"${FOLDER}\" ]]; then\r\n        echo \"Folder ${FOLDER} exists\"\r\n    else\r\n        echo \"Folder ${FOLDER} does not exist, creating.\"\r\n        mkdir -p -v \"${FOLDER}\"\r\n        if [ -f \"${FOLDER}\" ]; then\r\n            echo \"Created ${FOLDER}\"\r\n        else\r\n            echo \"Failed to created ${FOLDER}\"\r\n            exit 1\r\n        fi\r\n    fi\r\nelse\r\n    echo \"${SAVE_PATH} is an invalid path.\"\r\n    exit 1\r\nfi\r\n\r\nfunction private_download() {\r\n    # $1 = URL\r\n    # $2 = File Path\r\n    if [ \"$(command -v wget)\" ]; then\r\n        echo \"Downloading using wget\"\r\n        wget -O \"$2\" \"$1\"\r\n    elif [ \"$(command -v curl)\" ]; then\r\n        echo \"Downloading using curl\"\r\n        curl \"$1\" --output \"$2\"\r\n    else\r\n        echo \"Failed to find wget or curl.\"\r\n        exit 1\r\n    fi\r\n}\r\n\r\nfunction private_gethash() {\r\n    FILE=$1\r\n    HASH=$2\r\n    WAS_ERROR=0\r\n    if ! command -v md5 &amp;&gt;\/dev\/null; then\r\n        # This should never happen\r\n        echo \"md5 could not be found\"\r\n        WAS_ERROR=1\r\n    fi\r\n    if [ \"$(command -v md5)\" ]; then\r\n        CURRENT_HASH=$(md5 \"${FILE}\")\r\n        # \"##* \" in \"${CURRENT_HASH##* }\" gets the last word in a string\r\n        if [ \"${HASH}\" = \"${CURRENT_HASH##* }\" ]; then\r\n            echo \"File matches md5sum hash\"\r\n            WAS_ERROR=0\r\n        else\r\n            echo \"File does not match md5sum hash\"\r\n            echo \"Expected: ${CURRENT_HASH}\"\r\n            echo \"File: ${HASH}\"\r\n            WAS_ERROR=1\r\n        fi\r\n    fi\r\n    if [ ${WAS_ERROR} == 1 ]; then\r\n        echo \"Error verifying hash sum.\"\r\n        exit 1\r\n    fi\r\n}\r\n\r\nfunction private_validate() {\r\n    if [ -f \"$1\" ]; then\r\n        echo \"File Downloaded.\"\r\n        private_gethash \"$1\" \"$2\"\r\n    else\r\n        echo \"Failed to download file.\"\r\n        exit 1\r\n    fi\r\n}\r\n\r\n# Download file\r\nprivate_download \"${URL}\" \"${SAVE_PATH}\"\r\n# If SUM is not empty\r\nif [[ -n \"${SUM}\" ]]; then\r\n    # Verify that the file was download\r\n    # Compare hash from parameter to the file's calculated md5 sum\r\n    private_validate \"${SAVE_PATH}\" \"${SUM}\"\r\nfi\r\n<\/pre>\n<div class=\"blog-cta-new blog-cta-style-1\"><div class=\"cta-left\"><h2><\/h2><p><\/p><\/div><div class=\"cta-right\"><a class=\"button\" href=\"\"><\/a><\/div><\/div>\n<h2>Resumen del script<\/h2>\n<p><span data-contrast=\"auto\">Este script toma en cuenta principalmente tres par\u00e1metros: 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\u00e1 las carpetas necesarias, lo que supone una ventaja significativa cuando se trata de estructuras de directorios complejas.<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/p>\n<p><span data-contrast=\"auto\">El script comienza validando la URL y los par\u00e1metros de la ruta. Si alguno de estos par\u00e1metros no es v\u00e1lido, se saldr\u00e1 inmediatamente y lanzar\u00e1 un error. El script utiliza expresiones regulares para validar la URL y la ruta.\u00a0<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/p>\n<p><span data-contrast=\"auto\">Una vez verificados los par\u00e1metros, procede a descargar el archivo. El script est\u00e1 dise\u00f1ado para utilizar &#8216;wget&#8217; o &#8216;curl&#8217; en funci\u00f3n de lo que est\u00e9 disponible en el entorno.\u00a0<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/p>\n<p><span data-contrast=\"auto\">Despu\u00e9s de descargar correctamente el archivo, si se proporcion\u00f3 un hash MD5, verifica el contenido del archivo descargado con el hash proporcionado. Esta funci\u00f3n es especialmente \u00fatil para garantizar la integridad de los archivos, un aspecto cr\u00edtico en muchas operaciones de TI.<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/p>\n<h2>Comandos de script<\/h2>\n<p><span data-contrast=\"auto\">El script utiliza principalmente los comandos &#8216;wget&#8217; o &#8216;curl&#8217; para descargar archivos, que son herramientas comunes en los sistemas basados en Unix. Tanto &#8216;wget&#8217; como &#8216;curl&#8217; son utilidades gratuitas para la descarga no interactiva de archivos desde la web, compatibles con los protocolos HTTP, HTTPS y FTP.\u00a0<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/p>\n<p><span data-contrast=\"auto\">El script tambi\u00e9n utiliza &#8216;md5&#8217;, una utilidad de l\u00ednea 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\u00edgitos hexadecimales. Se utiliza para garantizar la integridad de los datos de los archivos mediante la producci\u00f3n de un valor hash \u00fanico para el contenido de un archivo. Si dos archivos tienen el mismo valor hash MD5, es muy probable que sean el mismo.<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/p>\n<p><span data-contrast=\"auto\">El comando &#8216;mkdir -p&#8217; se utiliza para crear la ruta del directorio si no existe. La opci\u00f3n \u00ab-p\u00bb garantiza que no se produzca ning\u00fan error si el directorio indicado como operando ya existe.<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/p>\n<p><span data-contrast=\"auto\">El script utiliza &#8216;command -v&#8217; para comprobar la disponibilidad de los comandos &#8216;wget&#8217;, &#8216;curl&#8217; y &#8216;md5&#8217; en el entorno. Tambi\u00e9n utiliza expresiones regulares y sentencias condicionales &#8216;[[&#8216; and &#8216;]]&#8217; para validar la URL y la ruta.<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/p>\n<p><span data-contrast=\"auto\">A continuaci\u00f3n, vamos a profundizar en el script y explorar sus posibles aplicaciones.<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/p>\n<h2>Posibles aplicaciones<\/h2>\n<p><span data-contrast=\"auto\">Este script de bash puede ser utilizado en una variedad de escenarios:<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/p>\n<ol>\n<li><b><span data-contrast=\"auto\">Actualizaciones de software:<\/span><\/b><span data-contrast=\"auto\">\u00a0el script puede utilizarse para automatizar la descarga de actualizaciones de software desde el sitio web de un proveedor. Una vez descargadas, podr\u00eda utilizarse otro script para aplicar estas actualizaciones en varios sistemas de una red.<\/span><\/li>\n<\/ol>\n<ol start=\"2\">\n<li><b><span data-contrast=\"auto\">Parches de seguridad:<\/span><\/b><span data-contrast=\"auto\">\u00a0los parches de seguridad suelen publicarse como archivos descargables en Internet. Este script puede <a href=\"https:\/\/www.ninjaone.com\/es\/blog\/automatizar-gestion-de-parches\/\">automatizar el proceso de descarga de estos parches<\/a>, garantizando que todos los sistemas de una red permanezcan actualizados y seguros.<\/span><\/li>\n<\/ol>\n<ol start=\"3\">\n<li><b><span data-contrast=\"auto\">Archivos de datos:<\/span><\/b><span data-contrast=\"auto\">\u00a0en 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\u00e1lisis o procesamiento de datos.<\/span><\/li>\n<\/ol>\n<ol start=\"4\">\n<li><b><span data-contrast=\"auto\">Sistemas distribuidos:<\/span><\/b><span data-contrast=\"auto\">\u00a0en un sistema distribuido, puede existir la necesidad de descargar y verificar un archivo espec\u00edfico a trav\u00e9s de m\u00faltiples sistemas. El script puede utilizarse para garantizar que se utiliza la misma versi\u00f3n de un archivo en todos los sistemas.<\/span><\/li>\n<\/ol>\n<ol start=\"5\">\n<li><b><span data-contrast=\"auto\">Copia de seguridad y recuperaci\u00f3n:<\/span><\/b><span data-contrast=\"auto\">\u00a0el script se puede utilizar para descargar archivos de copia de seguridad de un servidor remoto con fines de <a href=\"https:\/\/www.ninjaone.com\/es\/blog\/que-son-las-copias-de-seguridad-y-la-recuperacion-de-desastres-y-por-que-se-necesitan\/\">recuperaci\u00f3n de desastres<\/a>.<\/span><\/li>\n<\/ol>\n<p><span class=\"TextRun SCXW52657841 BCX0\" lang=\"EN-US\" data-contrast=\"auto\"><span class=\"NormalTextRun SCXW52657841 BCX0\">Al comprender la mec\u00e1nica del script, los profesionales de TI pueden <\/span><span class=\"NormalTextRun SCXW52657841 BCX0\">modificarlo <\/span><span class=\"NormalTextRun SCXW52657841 BCX0\">y ampliarlo para adaptarlo a sus necesidades espec\u00edficas, mejorando a\u00fan m\u00e1s sus capacidades de automatizaci\u00f3n.<\/span><\/span><span class=\"EOP SCXW52657841 BCX0\" data-ccp-props=\"{}\">\u00a0<\/span><\/p>\n<h2>Ventajas para los profesionales de TI y los MSP<\/h2>\n<p><span data-contrast=\"auto\">Este script ofrece numerosas ventajas para los profesionales de TI y los MSP:<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/p>\n<ul>\n<li><span data-contrast=\"auto\">Ahorro de tiempo: en lugar de descargar archivos manualmente, los profesionales pueden utilizar este script para automatizar el proceso, ahorrando as\u00ed un tiempo valioso.<\/span><\/li>\n<\/ul>\n<ul>\n<li><span data-contrast=\"auto\">Reducci\u00f3n de errores: con la descarga autom\u00e1tica y la verificaci\u00f3n MD5, las posibilidades de error humano se reducen significativamente.<\/span><\/li>\n<\/ul>\n<ul>\n<li><span data-contrast=\"auto\">Flexibilidad: El script puede utilizar tanto &#8216;wget&#8217; como &#8216;curl&#8217;, lo que lo hace adaptable a diferentes entornos.<\/span><\/li>\n<\/ul>\n<ul>\n<li><span data-contrast=\"auto\">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.<\/span><\/li>\n<\/ul>\n<h2>Reflexiones finales<\/h2>\n<p><span data-contrast=\"auto\">Este script de bash simplifica una tarea com\u00fan, 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.<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/p>\n<p><span data-contrast=\"auto\">La plataforma de gesti\u00f3n y monitoreo remoto altamente calificado de <\/span><a href=\"https:\/\/www.ninjaone.com\/es\/rmm\"><span data-contrast=\"none\">NinjaOne <\/span><\/a><span data-contrast=\"auto\">puede permitir el despliegue y ejecuci\u00f3n de este script de bash a trav\u00e9s de m\u00faltiples sistemas de una manera fluida. <\/span><\/p>\n<p><span data-contrast=\"auto\">Ya sea que est\u00e9s buscando descargar actualizaciones de software, parches de seguridad o archivos de datos, la integraci\u00f3n de este script con NinjaOne puede ayudar a\u00a0<\/span><a href=\"https:\/\/www.ninjaone.com\/es\/rmm\/it-automation\/\"><span data-contrast=\"none\">automatizar y agilizar estos procesos de TI<\/span><\/a><span data-contrast=\"auto\">. 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\u00f3lidas capacidades de NinjaOne pueden mejorar en gran medida la eficiencia operativa y la productividad.<\/span><span data-ccp-props=\"{}\">\u00a0<\/span><\/p>\n","protected":false},"author":35,"featured_media":206739,"parent":0,"menu_order":0,"comment_status":"open","ping_status":"closed","template":"","meta":{"_acf_changed":false,"_relevanssi_hide_post":"","_relevanssi_hide_content":"","_relevanssi_pin_for_all":"","_relevanssi_pin_keywords":"","_relevanssi_unpin_keywords":"","_relevanssi_related_keywords":"","_relevanssi_related_include_ids":"","_relevanssi_related_exclude_ids":"","_relevanssi_related_no_append":"","_relevanssi_related_not_related":"","_relevanssi_related_posts":"","_relevanssi_noindex_reason":"","_lmt_disableupdate":"no","_lmt_disable":""},"operating_system":[4210],"use_cases":[4259],"class_list":["post-208599","script_hub","type-script_hub","status-publish","has-post-thumbnail","hentry","script_hub_category-macos","use_cases-configuracion-general"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.ninjaone.com\/es\/wp-json\/wp\/v2\/script_hub\/208599","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.ninjaone.com\/es\/wp-json\/wp\/v2\/script_hub"}],"about":[{"href":"https:\/\/www.ninjaone.com\/es\/wp-json\/wp\/v2\/types\/script_hub"}],"author":[{"embeddable":true,"href":"https:\/\/www.ninjaone.com\/es\/wp-json\/wp\/v2\/users\/35"}],"replies":[{"embeddable":true,"href":"https:\/\/www.ninjaone.com\/es\/wp-json\/wp\/v2\/comments?post=208599"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.ninjaone.com\/es\/wp-json\/wp\/v2\/media\/206739"}],"wp:attachment":[{"href":"https:\/\/www.ninjaone.com\/es\/wp-json\/wp\/v2\/media?parent=208599"}],"wp:term":[{"taxonomy":"script_hub_category","embeddable":true,"href":"https:\/\/www.ninjaone.com\/es\/wp-json\/wp\/v2\/operating_system?post=208599"},{"taxonomy":"use_cases","embeddable":true,"href":"https:\/\/www.ninjaone.com\/es\/wp-json\/wp\/v2\/use_cases?post=208599"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}