{"id":353798,"date":"2024-10-02T11:42:19","date_gmt":"2024-10-02T11:42:19","guid":{"rendered":"https:\/\/www.ninjaone.com\/script-hub\/monitorizar-los-archivos-de-registro-mac\/"},"modified":"2024-10-18T12:12:02","modified_gmt":"2024-10-18T12:12:02","slug":"monitorizar-los-archivos-de-registro-mac","status":"publish","type":"script_hub","link":"https:\/\/www.ninjaone.com\/es\/script-hub\/monitorizar-los-archivos-de-registro-mac\/","title":{"rendered":"C\u00f3mo monitorizar los archivos de registro en macOS con un script Bash personalizado"},"content":{"rendered":"<p>En el panorama inform\u00e1tico actual, monitorizar y gestionar eficazmente los archivos de registro es crucial para mantener el buen estado del sistema y garantizar la seguridad. Tanto si eres un profesional de TI como un <a href=\"https:\/\/www.ninjaone.com\/es\/que-es-un-msp\" target=\"_blank\" rel=\"noopener\">proveedor de servicios gestionados (MSP)<\/a>, tener la capacidad de buscar y alertar r\u00e1pidamente sobre un texto espec\u00edfico dentro de un archivo de registro puede ser una poderosa herramienta en tu arsenal. Este post explorar\u00e1 un <a href=\"https:\/\/www.ninjaone.com\/blog\/what-is-bash-scripting\/\" target=\"_blank\" rel=\"noopener\">script Bash<\/a> personalizado dise\u00f1ado <strong>para monitorizar los archivos de registro en <a href=\"https:\/\/www.ninjaone.com\/es\/supervision-gestion-de-endpoints\/mac-management\/\" target=\"_blank\" rel=\"noopener\">macOS<\/a><\/strong>.<\/p>\n<h2>La importancia de monitorizar los archivos de registro<\/h2>\n<p>Los archivos de registro son un componente cr\u00edtico en el funcionamiento y mantenimiento de los sistemas inform\u00e1ticos. Contienen registros de eventos, procesos y errores que se producen en un ordenador o red. Mediante el an\u00e1lisis de los archivos de registro, los profesionales de TI pueden identificar problemas, rastrear la causa ra\u00edz de los mismos y garantizar el cumplimiento de los requisitos normativos. Sin embargo, examinar manualmente estos archivos para encontrar informaci\u00f3n relevante puede llevar mucho tiempo y <a href=\"https:\/\/www.ninjaone.com\/blog\/how-human-error-relates-to-cybersecurity-risks\/\" target=\"_blank\" rel=\"noopener\">ser propenso a errores<\/a>.<\/p>\n<p>Aqu\u00ed es donde entra en juego <a href=\"https:\/\/www.ninjaone.com\/es\/rmm\/automatizacion-de-ti\" target=\"_blank\" rel=\"noopener\">la automatizaci\u00f3n<\/a>. Automatizar el proceso de monitorizar los archivos de registro y activar alertas cuando se encuentra un texto espec\u00edfico puede ahorrar tiempo y reducir el riesgo de pasar por alto problemas cr\u00edticos. El script que vamos a comentar es una soluci\u00f3n sencilla pero eficaz para conseguirlo en macOS.<\/p>\n<h2>El script para monitorizar los archivos de registro<\/h2>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"bash\">#!\/usr\/bin\/env bash\r\n\r\n# Description: Alert when the specified Text is found in a text file.\r\n#\r\n# Release Notes: Initial Release\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# Text to trigger on: [Alert]\r\n#\r\n# Below are all the valid parameters for this script.\r\n# Preset Parameter: --file \"\/opt\/MyLogFile.log\" --text batman\r\n#   Alerts when the text \"batman\" is found in the file \/opt\/MyLogFile.log\r\n#    This is Case Sensitive\r\n#     Example where it will alert: \"I am batman!\"\r\n#     Example where it will alert: \"Iambatman!\"\r\n#     Example where it will not alert: \"IamBatman!\"\r\n#     Example where it will not alert: \"I am Batman!\"\r\n#\r\n# Preset Parameter: --file \"\/opt\/MyLogFile.log\" --text Batman --caseInsensitive true\r\n#   Alerts when the text \"Batman\" is found in the file \/opt\/MyLogFile.log, but is case insensitive\r\n#    This is Case Insensitive\r\n#     Example where it will alert: \"I am batman!\"\r\n#     Example where it will alert: \"Iambatman!\"\r\n#\r\n# Preset Parameter: --file \"\/opt\/MyLogFile.log\" --text Batman --wholeWord true\r\n#   Alerts when the text \"Batman\" is found in the file \/opt\/MyLogFile.log, but only if it is a word in a sentence.\r\n#    This is Case Sensitive\r\n#     Example where it will alert: \"I am Batman!\"\r\n#     Example where it will not alert: \"IamBatman!\"\r\n#\r\n\r\n# Determines whether or not help text is necessary and routes the output to stderr\r\ndie() {\r\n    local _ret=\"${2:-1}\"\r\n    test \"${_PRINT_HELP:-no}\" = yes &amp;&amp; print_help &gt;&amp;2\r\n    echo \"$1\" &gt;&amp;2\r\n    exit \"${_ret}\"\r\n}\r\n\r\n# Function that evaluates whether a value passed to it begins by a character\r\n# that is a short option of an argument the script knows about.\r\n# This is required in order to support getopts-like short options grouping.\r\nbegins_with_short_option() {\r\n    local first_option all_short_options='ftiwh'\r\n    first_option=\"${1:0:1}\"\r\n    test \"$all_short_options\" = \"${all_short_options\/$first_option\/}\" &amp;&amp; return 1 || return 0\r\n}\r\n\r\n# THE DEFAULTS INITIALIZATION - OPTIONALS\r\n_arg_file=\r\n_arg_text=\r\n_arg_caseInsensitive=\"false\"\r\n_arg_wholeWord=\"false\"\r\n\r\n# Help text function for when invalid input is encountered\r\nprint_help() {\r\n    printf '%s\\n' \"Alert when the specified Text is found in a text file.\"\r\n    printf 'Usage: %s [-f|--file [path to file]] [-t|--text [text to search]] [-i|--caseInsensitive &lt;true|false&gt;] [-w|--wholeWord &lt;true|false&gt;] [-h|--help]\\n' \"$0\"\r\n    printf '\\t%s\\n' \"-f, --file: path to a log file\"\r\n    printf '\\t%s\\n' \"-t, --text: text to alert when found\"\r\n    printf '\\t%s\\n' \"-i, --caseInsensitive: search text with case insensitivity (default: false)\"\r\n    printf '\\t%s\\n' \"-w, --wholeWord: search for text as a whole word (default: false)\"\r\n    printf '\\t%s\\n' \"-h, --help: Prints help\"\r\n}\r\n\r\n# Grabbing the parameters and parsing through them.\r\nparse_commandLine() {\r\n    while test $# -gt 0; do\r\n        _key=\"$1\"\r\n        case \"$_key\" in\r\n        -f | --file)\r\n            test $# -lt 2 &amp;&amp; die \"Missing value for the optional argument '$_key'.\" 1\r\n            _arg_file=\"$2\"\r\n            shift\r\n            ;;\r\n        --file=*)\r\n            _arg_file=\"${_key##--file=}\"\r\n            ;;\r\n        -f*)\r\n            _arg_file=\"${_key##-f}\"\r\n            ;;\r\n        -t | --text)\r\n            test $# -lt 2 &amp;&amp; die \"Missing value for the optional argument '$_key'.\" 1\r\n            _arg_text=\"$2\"\r\n            shift\r\n            ;;\r\n        --text=*)\r\n            _arg_text=\"${_key##--text=}\"\r\n            ;;\r\n        -t*)\r\n            _arg_text=\"${_key##-t}\"\r\n            ;;\r\n        -i | --caseInsensitive)\r\n            test $# -lt 2 &amp;&amp; die \"Missing value for the optional argument '$_key'.\" 1\r\n            _arg_caseInsensitive=\"$2\"\r\n            shift\r\n            ;;\r\n        --caseInsensitive=*)\r\n            _arg_caseInsensitive=\"${_key##--caseInsensitive=}\"\r\n            ;;\r\n        -i*)\r\n            _arg_caseInsensitive=\"${_key##-i}\"\r\n            ;;\r\n        -w | --wholeWord)\r\n            test $# -lt 2 &amp;&amp; die \"Missing value for the optional argument '$_key'.\" 1\r\n            _arg_wholeWord=\"$2\"\r\n            shift\r\n            ;;\r\n        --wholeWord=*)\r\n            _arg_wholeWord=\"${_key##--wholeWord=}\"\r\n            ;;\r\n        -w*)\r\n            _arg_wholeWord=\"${_key##-w}\"\r\n            ;;\r\n        -h | --help)\r\n            print_help\r\n            exit 0\r\n            ;;\r\n        -h*)\r\n            print_help\r\n            exit 0\r\n            ;;\r\n        *)\r\n            _PRINT_HELP=yes die \"FATAL ERROR: Got an unexpected argument '$1'\" 1\r\n            ;;\r\n        esac\r\n        shift\r\n    done\r\n}\r\n\r\nparse_commandLine \"$@\"\r\n\r\ntext=$_arg_text\r\nfile=$_arg_file\r\ncaseInsensitive=$_arg_caseInsensitive\r\nwholeWord=$_arg_wholeWord\r\n\r\n# Check if Script Variables where used and overwrite command line parameters\r\nif [[ -n \"${textToMatch}\" ]]; then\r\n    text=$textToMatch\r\nfi\r\nif [[ -n \"${textFile}\" ]]; then\r\n    file=$textFile\r\nfi\r\nif [[ -n \"${matchWholeWord}\" ]]; then\r\n    wholeWord=$matchWholeWord\r\nfi\r\nif [[ -n \"${insensitiveToCase}\" ]]; then\r\n    caseInsensitive=$insensitiveToCase\r\nfi\r\n\r\n# Check if text is not an empty string\r\nif [[ -z \"${text}\" ]]; then\r\n    echo \"[Error] Text not specified\"\r\n    exit 2\r\nfi\r\n\r\n# Check if text is not an empty string\r\nif [[ -z \"${file}\" ]]; then\r\n    echo \"[Error] File not specified\"\r\n    exit 2\r\nfi\r\n\r\n# Does file exit and is readable\r\nif [ -f \"${file}\" ]; then\r\n    echo \"[Info] File \\\"${file}\\\" exists\"\r\n    if [ -r \"${file}\" ]; then\r\n        echo \"[Info] File \\\"${file}\\\" is readable\"\r\n    else\r\n        echo \"[Error] File \\\"${file}\\\" is not readable\"\r\n        exit 2\r\n    fi\r\nelse\r\n    echo \"[Error] File \\\"${file}\\\" does not exists\"\r\n    exit 2\r\nfi\r\n\r\n# Detect\r\ncount=0\r\nif [[ \"${wholeWord}\" == \"true\" ]]; then\r\n    if [[ \"${caseInsensitive}\" == \"true\" ]]; then\r\n        count=$(grep -c -i -n -w \"$text\" \"$file\")\r\n    else\r\n        count=$(grep -c -n -w \"$text\" \"$file\")\r\n    fi\r\nelse\r\n    if [[ \"${caseInsensitive}\" == \"true\" ]]; then\r\n        count=$(grep -c -i -n -e \"$text\" \"$file\")\r\n    else\r\n        count=$(grep -c -n -e \"$text\" \"$file\")\r\n    fi\r\nfi\r\n\r\n# Alert\r\nif ((count &gt; 0)); then\r\n    echo \"[Alert] Found text in file\"\r\n    exit 1\r\nelse\r\n    echo \"[Info] Not found text in file\"\r\n    exit 0\r\nfi\r\n<\/pre>\n<p>&nbsp;<\/p>\n\n<div class=\"in-context-cta\"><p>Accede a m\u00e1s de 700 scripts en el Dojo de NinjaOne <a href=\"https:\/\/www.ninjaone.com\/es\/prueba-gratuita-formulario\/\">Accede aqu\u00ed<\/a><\/p>\n<\/div>\n<h2>Entender el script<\/h2>\n<p>El script proporcionado es un script Bash dise\u00f1ado para buscar texto espec\u00edfico dentro de un archivo de registro y activar una alerta si se encuentra ese texto. Permite a los usuarios personalizar los par\u00e1metros de b\u00fasqueda, por ejemplo, si la b\u00fasqueda debe distinguir entre may\u00fasculas y min\u00fasculas o si debe coincidir s\u00f3lo con palabras completas. Aqu\u00ed tienes un desglose detallado de c\u00f3mo funciona el script.<\/p>\n<h3>Inicializaci\u00f3n del script<\/h3>\n<p>El script comienza definiendo algunas funciones para manejar errores, comprobar argumentos v\u00e1lidos y mostrar informaci\u00f3n de ayuda. La funci\u00f3n die(), por ejemplo, se utiliza para terminar el script y mostrar un mensaje de error si algo va mal. Esta funci\u00f3n tambi\u00e9n imprime el texto de ayuda si se proporciona la opci\u00f3n &#8211;help.<\/p>\n<h3>Configuraci\u00f3n de par\u00e1metros por defecto<\/h3>\n<p>El script inicializa varios par\u00e1metros por defecto:<\/p>\n<ul>\n<li>archivo_arg: Almacena la ruta del archivo de registro que se va a buscar.<\/li>\n<li>_arg_text: Contiene el texto que se debe buscar en el archivo de registro.<\/li>\n<li>_arg_caseInsensitive: Determina si la b\u00fasqueda debe distinguir entre may\u00fasculas y min\u00fasculas.<\/li>\n<li>_arg_wholeWord: Especifica si la b\u00fasqueda debe coincidir s\u00f3lo con palabras completas.<\/li>\n<\/ul>\n<p>Estos par\u00e1metros pueden ser modificados por el usuario mediante argumentos de l\u00ednea de comandos al ejecutar el script.<\/p>\n<h3>An\u00e1lisis sint\u00e1ctico de los argumentos de la l\u00ednea de comandos<\/h3>\n<p>La funci\u00f3n parse_commandLine() es responsable de analizar los argumentos de la l\u00ednea de comandos pasados al script. Admite varias opciones, como &#8211;file para especificar el archivo de registro, &#8211;text para definir el texto de b\u00fasqueda y &#8211;caseInsensitivey &#8211;wholeWord para personalizar el comportamiento de la b\u00fasqueda.<\/p>\n<p>Si falta alg\u00fan par\u00e1metro requerido, el script saldr\u00e1 con un mensaje de error. Esto garantiza que el script se ejecute con toda la informaci\u00f3n necesaria.<\/p>\n<h3>Validaci\u00f3n de entradas y accesibilidad de archivos<\/h3>\n<p>Antes de realizar la b\u00fasqueda, el script valida las entradas para asegurarse de que no est\u00e1n vac\u00edas y comprueba si el archivo especificado existe y es legible. Si el archivo no existe o no es accesible, el script sale con un mensaje de error, evitando una ejecuci\u00f3n innecesaria.<\/p>\n<h3>B\u00fasqueda en el archivo de registro<\/h3>\n<p>La funcionalidad principal del script reside en su capacidad para buscar en el archivo de registro bas\u00e1ndose en los par\u00e1metros proporcionados. El script utiliza el comando grep, una potente herramienta de b\u00fasqueda de texto en archivos, para realizar la b\u00fasqueda. Dependiendo de las opciones seleccionadas, grep buscar\u00e1 el texto con o sin distinci\u00f3n entre may\u00fasculas y min\u00fasculas, y coincidir\u00e1 con toda la palabra o con parte de ella.<\/p>\n<ul>\n<li>Si &#8211;wholeWord est\u00e1 establecido en true, el script a\u00f1ade el indicador -w a grep, asegurando que s\u00f3lo se encuentren palabras completas.<\/li>\n<li>Si &#8211;caseInsensitive est\u00e1 establecido en true, el script utiliza el indicador -i para ignorar may\u00fasculas y min\u00fasculas durante la b\u00fasqueda.<\/li>\n<\/ul>\n<h3>Activaci\u00f3n de alertas<\/h3>\n<p>Una vez finalizada la b\u00fasqueda, el script cuenta el n\u00famero de coincidencias encontradas en el archivo de registro. Si se detecta alguna coincidencia, el script activa una alerta imprimiendo [Alerta] Texto encontrado en el archivo. Si no se encuentra ninguna coincidencia, imprime [Info] Texto no encontrado en el fichero. Este sencillo enfoque garantiza que los usuarios sean informados inmediatamente si el texto que est\u00e1n supervisando aparece en el archivo de registro.<\/p>\n<h2>Aplicaciones reales<\/h2>\n<p>Imag\u00ednate a un profesional de TI que gestiona una granja de servidores en la que es crucial controlar la aparici\u00f3n de mensajes de error espec\u00edficos en los archivos de registro. Al desplegar este script, puede recibir autom\u00e1ticamente una alerta cada vez que aparezca un c\u00f3digo o mensaje de error concreto en los registros, lo que le permite tomar medidas inmediatas. Por ejemplo, si en los registros se encuentra el texto \u00abfallo de disco\u00bb, el script puede activar una alerta, lo que permite al equipo inform\u00e1tico abordar el problema antes de que se convierta en un fallo cr\u00edtico del sistema.<\/p>\n<h2>Comparaci\u00f3n con otros m\u00e9todos<\/h2>\n<p>Aunque este script proporciona una forma sencilla y eficaz de supervisar los archivos de registro, otros m\u00e9todos pueden lograr resultados similares. Por ejemplo, los sistemas de gesti\u00f3n de registros m\u00e1s avanzados, como <a href=\"https:\/\/www.splunk.com\/\" target=\"_blank\" rel=\"noopener\">Splunk<\/a> o <a href=\"https:\/\/www.elastic.co\/elastic-stack\" target=\"_blank\" rel=\"noopener\">ELK stack<\/a>, ofrecen an\u00e1lisis de registros completos, incluida la supervisi\u00f3n en tiempo real, consultas complejas e integraciones con otros sistemas. Sin embargo, estas soluciones suelen requerir m\u00e1s recursos y pueden resultar excesivas para entornos m\u00e1s peque\u00f1os o casos de uso espec\u00edficos en los que basta con un simple script Bash.<\/p>\n<h2>Preguntas frecuentes<\/h2>\n<p>1.\u00a0<strong>\u00bfSe puede utilizar este script en sistemas operativos distintos de macOS?<\/strong><\/p>\n<p>S\u00ed, este script est\u00e1 escrito en Bash, que est\u00e1 disponible en la mayor\u00eda de los sistemas operativos tipo Unix, incluido <a href=\"https:\/\/www.ninjaone.com\/blog\/linux-filesystems\/\" target=\"_blank\" rel=\"noopener\">Linux<\/a>. No obstante, pueden ser necesarios algunos ajustes en funci\u00f3n del entorno espec\u00edfico.<\/p>\n<p>2.\u00a0<strong>\u00bfC\u00f3mo puedo modificar el script para que busque en varios archivos a la vez?<\/strong><\/p>\n<p>Puedes modificar el script para que recorra varios archivos ampliando la opci\u00f3n &#8211;file para que acepte una lista de archivos o directorios. El script puede entonces iterar a trav\u00e9s de cada archivo y realizar la b\u00fasqueda.<\/p>\n<p>3.\u00a0<strong>\u00bfQu\u00e9 ocurre si el archivo de registro es muy grande?<\/strong><\/p>\n<p>Para archivos de registro muy grandes, el rendimiento puede convertirse en un problema. En estos casos, considera la posibilidad de optimizar la b\u00fasqueda limitando el n\u00famero de l\u00edneas buscadas o utilizando herramientas m\u00e1s avanzadas como awk o sistemas de gesti\u00f3n de registros.<\/p>\n<h2>Implicaciones para la seguridad inform\u00e1tica<\/h2>\n<p>Al automatizar la tarea de monitorizar los archivos de registro, este script puede ayudar a <a href=\"https:\/\/www.ninjaone.com\/es\/blog\/checklist-ciberseguridad-ransomware\/\" target=\"_blank\" rel=\"noopener\">mejorar la seguridad de TI<\/a>, garantizando que los problemas cr\u00edticos se detecten y aborden con prontitud. Por ejemplo, detectar intentos de acceso no autorizados o actividad de malware en los registros puede ayudar a <a href=\"https:\/\/www.ninjaone.com\/es\/it-hub\/endpoint-security\/que-es-una-violacion-de-datos\" target=\"_blank\" rel=\"noopener\">prevenir brechas de seguridad<\/a> y <a href=\"https:\/\/www.ninjaone.com\/es\/copia-de-seguridad\/file-and-folder-backup\/\" target=\"_blank\" rel=\"noopener\">reducir el riesgo de p\u00e9rdida de datos<\/a>.<\/p>\n<h2>Mejores pr\u00e1cticas<\/h2>\n<p>Cuando utilices este script, ten en cuenta las siguientes pr\u00e1cticas recomendadas:<\/p>\n<ul>\n<li>Actualiza regularmente el script para garantizar la compatibilidad con tu entorno.<\/li>\n<li>Utiliza par\u00e1metros de b\u00fasqueda de texto claros y espec\u00edficos para evitar falsos positivos.<\/li>\n<li>Implementa mecanismos adicionales de registro o alerta para complementar el script.<\/li>\n<\/ul>\n<h2>Reflexiones finales<\/h2>\n<p>Para los profesionales de TI y los MSP, herramientas como este script tienen un valor incalculable para automatizar tareas rutinarias y garantizar el buen estado del sistema. Al integrar estos scripts en tu flujo de trabajo, puedes centrarse en actividades m\u00e1s estrat\u00e9gicas, manteniendo la confianza en que los problemas cr\u00edticos no pasar\u00e1n desapercibidos. <a href=\"https:\/\/www.ninjaone.com\/es\/\" target=\"_blank\" rel=\"noopener\">NinjaOne<\/a> ofrece un conjunto de herramientas que pueden mejorar a\u00fan m\u00e1s tus capacidades de gesti\u00f3n de TI, proporcionando capas adicionales de <a href=\"https:\/\/www.ninjaone.com\/es\/rmm\/automatizacion-de-ti\" target=\"_blank\" rel=\"noopener\">automatizaci\u00f3n<\/a>, <a href=\"https:\/\/www.ninjaone.com\/es\/blog\/supervision-de-endpoints-ejemplos\/\" target=\"_blank\" rel=\"noopener\">supervisi\u00f3n<\/a> y <a href=\"https:\/\/www.ninjaone.com\/es\/it-hub\/endpoint-security\/\" target=\"_blank\" rel=\"noopener\">seguridad<\/a> para apoyar tus operaciones de TI.<\/p>\n","protected":false},"author":35,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"open","ping_status":"open","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":[4263],"class_list":["post-353798","script_hub","type-script_hub","status-publish","hentry","script_hub_category-macos"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.ninjaone.com\/es\/wp-json\/wp\/v2\/script_hub\/353798","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=353798"}],"wp:attachment":[{"href":"https:\/\/www.ninjaone.com\/es\/wp-json\/wp\/v2\/media?parent=353798"}],"wp:term":[{"taxonomy":"script_hub_category","embeddable":true,"href":"https:\/\/www.ninjaone.com\/es\/wp-json\/wp\/v2\/operating_system?post=353798"},{"taxonomy":"use_cases","embeddable":true,"href":"https:\/\/www.ninjaone.com\/es\/wp-json\/wp\/v2\/use_cases?post=353798"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}