<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ Linux - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Descubre miles de cursos de programación escritos por expertos. Aprende Desarrollo Web, Ciencia de Datos, DevOps, Seguridad y obtén asesoramiento profesional para desarrolladores. ]]>
        </description>
        <link>https://www.freecodecamp.org/espanol/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Linux - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/espanol/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Sun, 24 May 2026 13:55:50 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/espanol/news/tag/linux/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Aprender Linux para Principiantes: Desde las Bases a Técnicas Avanzadas [Libro Completo] ]]>
                </title>
                <description>
                    <![CDATA[ Aprender Linux es una de las habilidades más valiosas en la industria de la tecnología. Te ayuda a realizar las tareas más rápidamente y de manera más eficiente. Muchos de los servidores poderosos y supercomputadoras del mundo ejecutan Linux. Mientras que te fortalece en tu rol actual, aprender Linux también ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/learn-linux-for-beginners-from-basics-to-advanced-techniques-full-book/</link>
                <guid isPermaLink="false">66bbd9a1d77ca5042ec0cb1f</guid>
                
                    <category>
                        <![CDATA[ Linux ]]>
                    </category>
                
                    <category>
                        <![CDATA[ bash ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Elias Ezequiel Pereyra Gomez ]]>
                </dc:creator>
                <pubDate>Wed, 09 Oct 2024 14:35:10 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2024/08/764782a4-1bf3-45a5-857c-7fe3921bfb08.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Aprender Linux es una de las habilidades más valiosas en la industria de la tecnología. Te ayuda a realizar las tareas más rápidamente y de manera más eficiente. Muchos de los servidores poderosos y supercomputadoras del mundo ejecutan Linux.</p><p>Mientras que te fortalece en tu rol actual, aprender Linux también te puede ayudar en transicionar a otras carreras tech como DevOps, Ciberseguridad, y Computación en la Nube.</p><p>En este manual, aprenderás las bases de la línea de comandos de Linux, y luego transitaremos a temas más avanzados como <em>programación de scripts</em> y administración de sistema. Sea que eres nuevo en Linux o que ya has estado usándolo por años, este libro tiene algo para ti.</p><p><strong>Nota Importante</strong>: Todos los ejemplos en este libro son mostrados en Ubuntu 22.04.2 LTS (Jammy Jellyfish). La mayoría de las herramientas de línea de comandos son más o menos los mismos en otras distribuciones. Sin embargo, algunas aplicaciones de escritorio (GUI) y comandos podrían diferir si estás trabajando en otra distribución de Linux.</p><h2 id="tabla-de-contenidos">Tabla de Contenidos</h2><p><a href="#parte-1-introduccion-linux">Parte 1: Introducción a Linux</a></p><ul><li><a href="#comenzando-linux">1.1. Comenzando con Linux</a></li></ul><p><a href="#parte-2-introduccion-bash">Parte 2: Introducción al Shell de Bash y los Comandos de Sistema</a></p><ul><li><a href="#comenzando-shell-bash">2.1. Comenzando con el shell de Bash</a></li><li><a href="#estructura-comando">2.2. La Estructura de Command</a></li><li><a href="#comandos-bash-y-atajos">2.3. Comandos de Bash y Atajos de Teclado</a></li><li><a href="#comando-whomai">2.4. Identificándote: El Comando <code>whoami</code></a></li></ul><p><a href="#parte-3-entendiendo-sistema-linux">Parte 3: Entendiendo tu Sistema de Linux</a></p><ul><li><a href="#descubriendo-tu-so-y-especificaciones">3.1. Descubriendo tu SO y Especificaciones</a></li></ul><p><a href="#parte-4-manejando-archivos-desde-el-cli">Parte 4: Manejando Archivos desde la Línea de Comando</a></p><ul><li><a href="#la-jerarquia-del-sistema-archivos-linux">4.1. La Jerarquía del Sistema de Archivos de Linux</a></li><li><a href="#navegando-sistema-archivos-de-linux">4.2. Navegando a través del Sistema de Archivos de Linux</a></li><li><a href="#manejando-archivos-y-carpetas">4.3. Manejando Archivos y Directorios</a></li><li><a href="#localizando-archivos-y-carpetas">4.4 Localizando archivos y carpetas usando el comando <code>find</code></a></li><li><a href="#comandos-basicos-para-ver-archivos">4.5. Comandos Básicos para ver Archivos</a></li></ul><p><a href="#parte-5-esencial-sobre-edicion-texto-linux">Parte 5: Lo Esencial sobre Edición de Texto en Linux</a></p><ul><li><a href="#dominando-vim-guia-completa">5.1. Dominando Vim: La Guía Completa</a></li><li><a href="#dominando-nano">5.2. Dominando Nano</a></li></ul><p><a href="#parte-6-programacion-en-bash">Parte 6: La Programación en Bash</a></p><ul><li><a href="#definicion-de-los-scripts-bash">6.1. Definición de los scripts de Bash</a></li><li><a href="#ventajas-scripts-bash">6.2. Ventajas de los scripts de Bash</a></li><li><a href="#vista-general-shell-bash-y-cli">6.3. Vista General del Shell Bash y de la Interfaz de Línea de Comandos</a></li><li><a href="#como-crear-y-ejecutar-scripts-bash">6.4. Cómo crear y ejecutar scripts de Bash</a></li><li><a href="#basico-programacion-bash">6.5. Lo Básico de la Programación en Bash</a></li></ul><p><a href="#parte-7-manejo-paquetes-software-linux">Parte 7: Manejando Paquetes de Software en Linux</a></p><ul><li><a href="#paquetes-y-gestion-paquetes">7.1. Paquetes y Gestión de Paquetes</a></li><li><a href="#instalando-paquete-a-traves-cli">7.2. Instalando un Paquete a través de la Línea de Comando</a></li><li><a href="#instalando-paquete-a-traves-gui-synaptic">7.3. Instalando un Paquete a través de un Método Gráfico Avanzado – Synaptic</a></li><li><a href="#instalando-paquetes-descargados">7.4. Instalando Paquetes Descargados desde un sitio web</a></li></ul><p><a href="#parte-8-temas-linux-avanzados">Parte 8: Temas de Linux Avanazados</a></p><ul><li><a href="#gestion-del-usuario">8.1. Gestión del Usuario</a></li><li><a href="#conectandose-sevidores-remotos-a-traves-ssh">8.2 Conectándose a Servidores Remotos a través de SSH</a></li><li><a href="#analisis-sintactico-y-analisis-log-avanzado">8.3. Análisis Sintáctico y Análisis de Archivos Log Avanzados</a></li><li><a href="#gestionando-procesos-de-linux">8.4. Manejando los Procesos de Linux a través de la Línea de Comandos</a></li><li><a href="#flujos-entrada-y-salida-estandar-en-linux">8.5. Flujos de Entrada y Salida Estándar en Linux</a></li><li><a href="#automatizacion-linux-automatizar-tareas-cron-jobs">8.6 Automatización en Linux – Automatizar Tareas con Tareas de Cron</a></li><li><a href="#conceptos-basicos-de-redes-de-linux">8.7. Conceptos Básicos de Redes de Linux</a></li><li><a href="#solucionando-problemas-linux-herramientas-y-tecnicas">8.8. Solución de problemas de Linux: Herramientas y Técnicas</a></li><li><a href="#estrategia-general-para-solucionar-problemas-servidores">8.9. Estrategia de Solución de Problemas General para los Servidores</a></li></ul><p><a href="#conclusion">Conclusión</a></p><!--kg-card-begin: html--><h2 id="parte-1-introduccion-linux">Parte 1: Introducción a Linux</h2><!--kg-card-end: html--><!--kg-card-begin: html--><h3 id="comenzando-linux">1.1. Comenzando con Linux</h3><!--kg-card-end: html--><h4 id="-qu-es-linux">¿Qué es Linux?</h4><p>Linux es un Sistema Operativo de código abierto que está basado en el Sistema Operativo Unix. Fue creado por Linus Torvalds in 1991.</p><p>El Código Abierto significa que el código fuente del Sistema Operativo está disponible al público. Este le permite a cualquiera modificar el código origina, personalizarlo, y distribuir el Sistema Operativo a usuarios potenciales.</p><h4 id="-por-qu-deber-as-aprender-sobre-linux">¿Por qué deberías aprender sobre Linux?</h4><p>En el escenario de los centros de datos de hoy, Linux y Microsoft Windows se destacan como los contendientes, con Linux teniendo la mayor parte.</p><p>Aquí hay varias razones convincentes para aprender Linux:</p><ul><li>Dada la prevalencia del alojamiento de Linux, hay una alta chance que tu aplicación será alojado en Linux. Así que aprender Linux como un desarrollador se convierte cada vez más valorado.</li><li>Con la computación en la nube se convierte en la norma, las chances son altas que tus instancias de la nube se basará en Linux.</li><li>Los servidores de Linux como la fundación para muchos Sistemas Operativos para el Internet de las Cosas (IoT) y aplicaciones móviles.</li><li>En IT, hay muchas oportunidades para aquellos hábiles en Linux.</li></ul><h4 id="-qu-significa-que-linux-es-un-sistema-operativo-de-c-digo-abierto">¿Qué significa que Linux es un Sistema Operativo de código abierto?</h4><p>Primero, ¿qué es código abierto? Software de código abierto cuyo código fuente es accesible gratuitamente, permitiendo a cualquier utilizar, modificar y distribuirlo.</p><p>Cuando sea que el código fuente fuese creado, se considera automáticamente protegido por derechos de autor, y su distribución se rige por el titular de los derechos de autor a través de licencias de software.</p><p>En contraste al código abierto, el software propietario o de código cerrado restringe el acceso a su código fuente. Solamente los creadores pueden verlos, modificarlos o distribuirlos.</p><p>Linux es ante todo de código abierto, lo que significa que su código fuente está disponible de forma gratuita. Cualquiera puede verlo, modificarlo, y distribuirlo. Los Desarrolladores desde cualquier lugar en el mundo pueden contribuir a sus mejoras. Esto sienta la fundación de la colaboración lo cual es un aspecto importante del software de código abierto.</p><p>Esto enfoque colaborativo ha llevado a la amplia adopción de Linux entre los servidores, computadoras de escritorio, sistemas embebidos, y dispositivos móviles.</p><p>El aspecto más interesante de Linux siendo de código abierto es que cualquier puede adaptar el sistema operativo a sus necesidades específicas sin ser restringido por las limitaciones de propiedad.</p><p>El SO (Sistema Operativo) Chrome utilizado por los Chromebooks está basado en Linux. Android, que impulsa a muchos teléfonos inteligentes, también está basado en Linux.</p><p><strong>¿Qué es un Kernel de Linux?</strong></p><p>El kernel es el componente central de un Sistema Operativo que gestiona la computadora y sus operaciones hardware. Maneja operaciones de memoria y el tiempo de CPU.</p><p>El kernel actúa como un puente entre aplicaciones y el proceso de datos a nivel de hardware usando la comunicación entre procesos y llamadas de sistema.</p><p>El kernel se carga en memoria primero cuando un Sistema Operativo comienza y permanece allí hasta que el sistema se apaga. Es responsable de tareas como la gestión de disco, gestión de tareas, y gestión de memoria.</p><figure class="kg-card kg-image-card"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1719844849011/f4bb226e-f319-4cb5-bfc9-c1a80401123e.png" class="kg-image" alt="Linux Kernel Layout showing interaction of kernal with applications and OS" width="563" height="393" loading="lazy"></figure><p>Si estás interesado en saber cómo se ve el kernel de Linux, <a href="https://github.com/torvalds/linux">aquí</a> está el enlace de Github.</p><h4 id="-que-es-una-distribuci-n-de-linux">¿Que es una distribución de Linux?</h4><p>A este punto, sabes que puedes re-usar el código kernel de Linux, modificarlo, y crear un nuevo kernel. Puedes aún combinar diferentes utilidades y software para crear un Sistema Operativo completamente nuevo.</p><p>Una distribución de Linux o distro es una versión del Sistema Operativo Linux que incluye el kernel de Linux, utilidades de sistema, y otros software. Siendo de código abierto, una distribución de Linux es un esfuerzo colaborativo que involucra múltiples comunidades de desarrollo de código abierto independientes.<strong>¿Qué significa que una distribución sea derivado?</strong> Cuando dices que una distribución es "derivado" de otro, el nuevo distro está construido sobre la base o fundación del distro original. Esta derivación puede incluir el usar el sistema de gestión de paquetes (más sobre esto después), versión del kernel, y a veces las mismas herramientas de configuración.</p><p>Hoy, hay miles distribuciones de Linux para elegir, ofreciendo diferentes objetivos y criterios para seleccionar y soportar el software provisto por su distribución.</p><p>Las distribuciones varían uno del otro, pero generalmente tienen características en común.</p><ul><li>Una distribución consiste de un kernel de Linux.</li><li>Soporta programas de espacio de usuario.</li><li>Una distribución podría ser pequeño y de un solo propósito o incluir miles de programas de código abierto.</li><li>Algunos medios para instalar y actualizar la distribución y sus componentes debería ser provistos.</li></ul><p>Si ves la <a href="https://upload.wikimedia.org/wikipedia/commons/1/1b/Linux_Distribution_Timeline.svg">Línea de Tiempo de las Distribuciones de Linux</a>, verás dos mayores distros: Slackware y Debian. Varias distribuciones son derivados de ellos. Por ejemplo, Ubuntu y Kali son derivados de Debian.</p><p><strong>¿Cuáles son las ventajas de la derivación?</strong> Hay varias ventajas de la derivación. La Distribuciones derivadas pueden aprovechar la estabilidad, seguridad, y grandes repositorios de software de la distribución padre.</p><p>Cuando se construye sobre una fundación existente, los desarrolladores pueden conducir su enfoque y esfuerzo enteramente en las características especializadas de la nueva distribución. Los usuarios de distribuciones derivadas se pueden beneficiar de la documentación, el soporte de comunidad, y recursos ya disponibles para la distribución padre.</p><p>Algunas distribuciones de Linux populares son:</p><ol><li><strong>Ubuntu</strong>: Uno de las distribuciones de Linux más usado y más popular. Es amigable y recomendado para los principiantes. <a href="https://ubuntu.com/">Aprender más sobre Ubuntu aquí</a>.</li><li><strong>Linux Mint</strong>: Basado en Ubuntu, Linux Mint provee una experiencia amigable con un enfoque en soporte de multimedia. <a href="https://linuxmint.com/">Aprender más sobre Linux Mint aquí</a>.</li><li><strong>Arch Linux</strong>: Popular entre usuarios experimentados, Arch es una distribución ligera y flexible dirigido a usuarios que prefieren un enfoque DIY. <a href="https://www.archlinux.org/">Aprender más sobre Arch Linux aquí</a>.</li><li><strong>Manjaro</strong>: Basado en Arch Linux, Manjaro provee una experiencia amigable con software pre-instalado y herramientas sencillas de gestión del sistema. <a href="https://manjaro.org/">Aprender más sobre Manjaro aquí</a>.</li><li><strong>Kali Linux</strong>: Kali Linux provee un conjunto comprensivo de herramientas de seguridad y está mayormente enfocado en ciberseguridad y hacking. <a href="https://www.kali.org/">Aprender más sobre Kali Linux aquí</a>.</li></ol><h4 id="c-mo-instalar-y-acceder-a-linux">Cómo instalar y acceder a Linux</h4><p>La mejor manera de aprender es aplicar los conceptos a medidas que avanzas. En esta sección, aprenderemos cómo instalar Linux en tu máquina así puedes seguirme. También aprenderás cómo acceder a Linux en una máquina con Windows.</p><p>Te recomiendo que sigas cualquiera de los métodos mencionados en esta sección para tener acceso a Linux así puedes seguirme.</p><h5 id="instalar-linux-como-el-so-primario">Instalar Linux como el SO primario</h5><p>Instalar Linux como el SO primario es la forma más eficiente de usar Linux, ya que puedes usar todo el poder de tu máquina.</p><p>En esta sección, aprenderás cómo instalar Ubuntu, el cual es uno de las distribuciones de Linux más popular. Dejé fuera de lista otras distribuciones por ahora, ya que quiero mantener las cosas sencillas. Siempre puedes explorar otras distribuciones una vez que te sientas cómodo con Ubuntu.</p><p><strong>Paso 1 – Descargar el iso de Ubuntu:</strong> Ve al <a href="https://ubuntu.com/download/desktop">sitio web</a> oficial y descarga el archivo iso. Asegúrate en seleccionar un lanzamiento estable que está caracterizado como "LTS". LTS significa "Soporte de Largo Término" (Long Term Support en inglés) lo que significa que puedes obtener seguridad gratuita y actualizaciones de mantenimiento por un tiempo prolongado (usualmente 5 años).</p><p><strong>Paso 2 – Crea un pendrive bootable:</strong> Hay un número de softwares que puede crear un pendrive booteable. Recomiendo usar Rufus, ya que es bastante fácil de usar. Puedes descargarlo <a href="https://rufus.ie/">aquí</a>.</p><p><strong>Paso 3 – Iniciar desde el pendrive:</strong> Una vez que tu pendrive bootable está listo, insértalo y inicia desde el pendrive. El menú del boot depende de tu laptop. Puedes buscar en google el menú de boot para tu modelo de laptop.</p><p><strong>Paso 4 – Sigue los pasos.</strong> Una vez, que el proceso de boot comience, selecciona <code>try or install ubuntu</code>.</p><figure class="kg-card kg-image-card"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1719304227675/5b706f94-7368-47ca-a4d6-d55a0d92eff9.png" class="kg-image" alt="Screen prompt to either try or install Ubuntu" width="611" height="329" loading="lazy"></figure><p>El proceso tomará algo de tiempo. Una vez que el GUI aparece, puedes seleccionar el idioma, y el teclado, y continuar. Ingresa al inicio de sesión con tu nombre. Recuerda las credenciales ya que los necesitarás para inciar sesión en tu sistema y acceder a privilegios totales. Espera que la instalación se complete.</p><p><strong>Paso 5 – Reinicia:</strong> Haz clic en reiniciar ahora y retira el pen drive.</p><p><strong>Paso 6 – Inicia sesión:</strong> Inicia sesión con las credenciales que ingresaste anterioremente.</p><p>¡Y ahí está! Ahora puedes instalar aplicaciones y personalizar tu escritorio.</p><figure class="kg-card kg-image-card"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1719304547967/d150c6eb-d04e-47e0-8473-d1a837df45c4.png" class="kg-image" alt="Ubuntu 22.04.4 LTS Desktop screen" width="1920" height="1080" loading="lazy"></figure><p>Para una instalación avanzada, puedes explorar los siguientes temas:</p><ul><li>Particionamiento de Disco.</li><li>Configurar la memoria de intercambio para permitir la hibernación.</li></ul><p><strong>Accediendo a la terminal</strong></p><p>Una parte importante de este manual es aprender sobre la terminal donde ejecutarás todos los comandos y ver toda la magia. Puedes buscar en la terminal presionando la tecla "window" y escribiendo "terminal". Puedes fijar la Terminal en el <em>dock</em> donde otras aplicaciones están localizadas para un fácil acceso.</p><figure class="kg-card kg-image-card"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1719305113272/4dd30c5e-da73-4cd4-86bb-7dcd8cd2084c.png" class="kg-image" alt="Search results for &quot;terminal&quot;" width="437" height="255" loading="lazy"></figure><blockquote>💡 The shortcut for opening the terminal is <code>ctrl+alt+t</code></blockquote><p>También puedes abrir la terminal desde una carpeta. Haz clic derecho donde estás y haz clic en "Abrir en Terminal". Esto abrirá la terminal en la misma ruta.</p><figure class="kg-card kg-image-card"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1719305289021/284a4a53-2d1a-4eaa-925a-1002a32c1dce.png" class="kg-image" alt="Opening the terminal with right click menu" width="640" height="414" loading="lazy"></figure><h5 id="c-mo-usar-linux-en-una-m-quina-windows">Cómo usar Linux en una máquina Windows</h5><p>A veces prodrías necesitar ejecutar tanto Linux como Windows lado a lado. Afortunadamente, hay varias maneras que puedes aprovechar de ambos mundos sin tener distintas computadoras para cada sistema operativo.</p><p>En esta sección, explorarás una pocas formas de usar Linux en una máquina de Linux. Algunos de ellos basados al navegador o basados en la nube y no necesita ninguna instalación de SO antes de usarlos.</p><p><strong>Opción 1: "Dual-boot" Linux + Windows</strong>: Con dual boot, puedes instalar Linux juntamente con Windows en tu computadora, permitiéndote elegir qué Sistema Operativo usar al inicio.</p><p>Esto requierer particionar tu disco duro e instalar Linux en una partición separada. Con este enfoque, solamente puedes usar un sistema Operativo a la vez.</p><p><strong>Opción 2: USar el Subsitema de Windows &nbsp;para Linux &nbsp;(WSL)</strong>: El Subsistema para Linux provee una capa de comtabilidad que te permite ejecutar ejecutables binarios de Linux de forma nativa en WIndows.</p><p>Usando WSL tiene algunas ventajas. La configuración para WSL es sencilla y rápida. Es liviana comparado con los VMs donde tiene que aisgnar recursos desde la máquina anfitriona. No necesitas instalar ningún ISO o imagen de disco virtual para las máquinas Linux los cuales tienden a ser archivos pesados. Puedes usar Windows y Linux lado a lado.</p><p><strong>Cómo instalar WSL2</strong></p><p>Primero, activa el Subsitema de Windows para la opción Linux en las configuraciones.</p><p>Ve al inicio. Busca "Turn Windows features on or off".</p><p>Verifica la opción "Windows Subsystem for Linux" si ya no está.</p><figure class="kg-card kg-image-card"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1719306102095/84f23bae-faa5-4ece-a9b6-e40f8789a061.png" class="kg-image" alt="Checking the option &quot;Windows Subsystem for Linux&quot; in Windows features" width="891" height="550" loading="lazy"></figure><p>Luego, abre tu línea de comandos y provee los comandos de instalación.</p><p>Abre la terminal como un administrador:</p><figure class="kg-card kg-image-card"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1720451480640/6052c9b4-cf07-47e0-ae89-18c3a2d3e385.png" class="kg-image" alt="Running command prompt as an admin by right clicking the app and choosing &quot;run as admin£" width="1032" height="846" loading="lazy"></figure><p>Ejecuta el comando de abajo:</p><pre><code class="language-markdown">wsl --install
</code></pre><p>Esta es la salida:</p><figure class="kg-card kg-image-card"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1719306131053/b7272031-ddb7-4e04-8d7b-bafc0911da04.png" class="kg-image" alt="Downloading progress of Ubuntu" width="1099" height="637" loading="lazy"></figure><p>Nota: Por defecto, Ubuntu será instalado.</p><figure class="kg-card kg-image-card"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1719306144861/a01f95df-1d95-4b79-bff9-08759be0d3dc.png" class="kg-image" alt="Ubuntu installed by default using WSL" width="1092" height="626" loading="lazy"></figure><ul><li>Una vez que la instalación está completa, necesitarás reiniciar tu máquina WIndows. Así que, reinicia tu máquina con Windows.</li></ul><p>Después de reiniciar, verías una ventana así:</p><figure class="kg-card kg-image-card"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1719306157704/15620fbe-59d1-40da-9cd6-119a1fab0802.png" class="kg-image" alt="Window that shows after a restart" width="1111" height="647" loading="lazy"></figure><p>Una vez que la instalación de Ubuntu está completa, se te pedirá que ingreses tu nombre de usuario y la constraseña.</p><figure class="kg-card kg-image-card"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1719306167380/5e3058cd-b7a1-45b1-a16d-c23b5a451504.png" class="kg-image" alt="User prompted to enter a username and password" width="908" height="611" loading="lazy"></figure><p>Y, ¡y eso es todo! Estás listo ya para usar Ubuntu.</p><p>Lanza Ubuntu buscando desde el menú de inicio.</p><figure class="kg-card kg-image-card"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1719306185110/77c17856-08ac-4ec7-9380-5b06f93be095.png" class="kg-image" alt="Launching Ubuntu from the start menu" width="966" height="846" loading="lazy"></figure><p>Y aquí tenemos tu instancia de Ubuntu lanzada.</p><figure class="kg-card kg-image-card"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1719306196320/13be3a71-5b40-440c-a6bf-d742e5b5934b.png" class="kg-image" alt="Successful installation of Ubuntu using WSL" width="1103" height="639" loading="lazy"></figure><p><strong>Opción 3: Usa a Máquina Virtual (VM)</strong></p><p>Una máquina virtual (VM) es una emulación de software de un sistema de computación de Física. Te permite ejeuctar múltiples Sistemas Operativos y aplicaciones en una sola máquina física simultáneamente.</p><p>Puedes usar la Virtualización de Software tales como VirtualBox de Oracle o VMware para crear una máquina virtual que ejecuta Linux dentro de tu entorno de Windows. Esto te permite ejecutar Linux como un SIstema Operativo invitado junto a Windows.</p><p>El software VM provee opciones para asignar y gestionar los recursos hardware para cada VM, incluyendo núcles de CPU, memoria, espacio de disco, y ancho de banda de red. Puedes ajustar estas asignaciones basado en los requerimientos de los Sistemas Operativos invitados y las aplicaciones.</p><p>Aquí hay algunas de las opciones comúnes disponibles para la Virtualización:</p><ul><li><a href="https://www.virtualbox.org/">Oracle virtual box</a></li><li><a href="https://multipass.run/">Multipass</a></li><li><a href="https://www.vmware.com/content/vmware/vmware-published-sites/us/products/workstation-player.html.html">VMware workstation player</a></li></ul><p><strong>Opción 4: Usa una Solución basado en el Navegador</strong></p><p>Las soluciones basados en el Navegador son particularmente útiles para pruebas rápidas, aprender, o acceder a entornos de Linux desde dispositivos que no tienen Linux instalado.</p><p>Puedes usar los editores de código en líne o terminales basadas en web para acceder a Linux. Fíjate que usualmente no tienes privilegios de administrador en estos casos.</p><h4 id="editores-de-c-digo-en-l-nea"><strong>Editores de Código en línea</strong></h4><p>Los Editores de Código en línea con terminales de Linux incorporadas. Mientras que su propósito primario es codificar, también puedes utilizar la terminal de Linux para ejecutar comandos y realizar tareas.</p><p><a href="https://replit.com/">Replit</a> es un ejemplo de un editor de código en línea, donde puedes escribir tu código y acceder a la shell de Linux al mismo tiempo.</p><figure class="kg-card kg-image-card"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1719306257260/d85d5541-b78f-4c8b-99a8-dbd8c097f661.gif" class="kg-image" alt="Running scripts and a bash shell in Replit" width="1520" height="721" loading="lazy"></figure><h4 id="terminales-de-linux-basados-en-web"><strong>Terminales de Linux basados en Web</strong></h4><p>Las terminales de Linux en línea te permiten acceder a una interfaz de línea de comandos desde tu navegador. Estas terminalesproveen una interfaz basada en web a un shell de Linux, permitiéndote ejecutar comandos y trabajar con utilidades de Linux.</p><p>Un ejemploes <a href="https://jslinux.org/">JSLinux</a>. La captura de abajo muestra un entorno de Linux listo para ser usado:</p><figure class="kg-card kg-image-card"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1719306276915/ddaabfc3-9a20-43b2-bedc-0af6875d2008.png" class="kg-image" alt="Using JSLinux to access Linux terminal" width="826" height="765" loading="lazy"></figure><p><strong>Opción 5: Usa una Solución basada en la Nube</strong></p><p>En vez de ejecutar Linux directamente en tu máquina de Windows, puedes considerar usar entornos de Linux basados en la nube o Servidores Privados Virtuales (VPS), para acceder y trabajar con Linux remotamente.</p><p>Servicios como Amazon EC2, Microsoft Azure, o DigitalOcean proveen instancias de Linux a las que te puedes conectar desde tu computadora de Windows. Fíjate que algunos de estos servicios ofrecen planes gratuitos, pero no son usualmente gratis a la larga.</p><!--kg-card-begin: html--><h2 id="parte-2-introduccion-bash">Parte 2: Introducción al Shell de Bash y Comandos de Sistema</h2><!--kg-card-end: html--><!--kg-card-begin: html--><h3 id="comenzando-bash">2.1. Comenzando con el shell de Bash</h3><!--kg-card-end: html--><h4 id="introducci-n-al-shell-de-bash">Introducción al shell de bash</h4><p>La línea de comandos de Linux es provisto por un programa llamado el shell. A través de los años, el programa shell ha evolucinado para atender varias opciones.</p><p>Distintos usuarios pueden ser configurados para usar distintos shells. Pero, la mayoría de los usuarios prefieren quedarse con su shell predeterminado actual. El shell predeterminado para muchos distros de Linux es el Bourne-Again Shell de GNU (<code>bash</code>). Bash es sucedido por el shell Bourne (<code>sh</code>).</p><p>Para saber tu shell actual, abre tu terminal e ingresa el siguiente comando:</p><pre><code class="language-bash">echo $SHELL
</code></pre><p>Desglose del comando:</p><ul><li>El comando <code>echo</code> se usa para imprimir en la terminal.</li><li>El <code>$SHELL</code> es una variable especial que contiene el nombre del shell actual.</li></ul><p>En mi configuración, la salida es <code>/bin/bash</code>. Esto significa que estoy usando el shell bash.</p><pre><code class="language-bash"># output
echo $SHELL
/bin/bash
</code></pre><p>Bash es muy poderoso ya que puede simplificar ciertas operaciones que son difíciles de lograr eficientemente con un GUI (o Interfaz de Usuario Gráfico). Recuerda que la mayoría de los servidores no tienen un GUI, y es mejor aprender a usar los poderosos de una interfza de línea de comandos (CLI).</p><p><strong>Terminal vs Shell</strong></p><p>Los términos "terminal" y "shell" son frecuentemente usado de forma intercambiable, pero se refieren a distitnas partes de la interfaz de línea de comandos.</p><p>La terminal es la interfaz que usas para interactuar con el shell. El shell es el intérprete de comandos que procesa y ejecuta tus comandos. Aprenderás más sobre los shells en la Parte 6 del manual.</p><h4 id="-qu-es-un-prompt">¿Qué es un prompt?</h4><p>Cuando un shell se usa interactivamente, muestra un <code>$</code> cuando espera un comando del usuario. Este es el prompt del shell.</p><pre><code>[username@host ~]$
</code></pre><p>Si el shell se está ejecutando como <code>root</code> (aprenderás más sobre el usuario root luego), el prompt se cambia a <code>#</code>.</p><pre><code>[root@host ~]#
</code></pre><!--kg-card-begin: html--><h3 id="estructura-comando">2.2. Estructura del Comando</h3><!--kg-card-end: html--><p>Un comando es un programa que ejecuta una operación específica. Una vez que tienes acceso a la shell, puedes ingresar cualquier comando después del signo <code>$</code> y ves la salida en la terminal.</p><p>Generalmente, los comandos de Linux sigue esta sintaxis:</p><pre><code class="language-bash">command [options] [arguments]
</code></pre><p>Aquí está el desglose de la sintaxis de arriba:</p><ul><li><code>command</code>: Este es el nombre del comando que quieres ejecutar. <code>ls</code> (list - listar), <code>cp</code> (copy - copiar), y <code>rm</code> (remove - borrar) son comandos comúnes de Linux.</li><li><code>[options]</code>: Opciones, o flags, son precedidos frecuentemente por un guión (-) o doble guiones (--), modifican el comportamiento del comando. Pueden cambiar cómo opera el comando. Por ejemplo, <code>ls -a</code> usa la opción <code>-a</code> para mostrar los archivos ocultos en la carpeta actual.</li><li><code>[arguments]</code>: Los argumentos son las entradas para los comandos que uno requiere. Estos pueden ser nombres de archivos, nombres de usuario, u otros datos sobre los cuales el comando actuará. Por ejemplo, en el comando <code>cat access.log</code>, <code>cat</code> es el comando y <code>access.log</code> es la entrada. Como resultado, el comando <code>cat</code> muestra los contenidos del archivo <code>access.log</code>.</li></ul><p>Las opciones y argumentos no son requeridos por todos los comandos. Algunos comandos pueden ser ejecutados sin ninguna opción o argumento, mientras que otros podrían requerir uno o ambos para que funcionen correctamente. Siempre puedes referirte al manual del comando para ver las opciones y los argumentos que soporta.</p><p>💡<strong>Consejo:</strong> Puedes ver el manual de un comando usando el comando <code>man</code>.</p><p>Puedes acceder a la página manual para <code>ls</code> con <code>man ls</code>, y te mostrará algo así:</p><figure class="kg-card kg-image-card"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1719312523336/5b1232a6-8c0b-4a97-86f0-9f15f2e14ed7.png" class="kg-image" alt="5b1232a6-8c0b-4a97-86f0-9f15f2e14ed7" width="1890" height="969" loading="lazy"></figure><p>Las páginas manuales son una forma genial y rápida para acceder a la documentación. Recomiendo leer las páginas de man para los comandos que mas usas.</p><!--kg-card-begin: html--><h3 id="comandos-bash-y-atajos">2.3. Comandos de Bash y Atajos de Teclado</h3><!--kg-card-end: html--><p>Cuando estás en la terminal, puedes acelerar tus tareas usando atajos.</p><p>Aquí hay algunos de los atajos más comunes de la terminal:</p><!--kg-card-begin: html--><table>
<thead>
<tr>
<th>Operación</th>
<th>Atajo</th>
</tr>
</thead>
<tbody>
<tr>
<td>Busca el comando previo</td>
<td>Flecha arriba</td>
</tr>
<tr>
<td>Salta al principio de la palabra previa</td>
<td>Ctrl+FlechaAbajo</td>
</tr>
<tr>
<td>Limpia los caracteres del cursor al final de la línea de comandos</td>
<td>Ctrl+K</td>
</tr>
<tr>
<td>Completa los comandos, nombres de archivo, y opciones</td>
<td>Presionando Tab</td>
</tr>
<tr>
<td>Salta al principio de la línea de comandos</td>
<td>Ctrl+A</td>
</tr>
<tr>
<td>Muestra la lista de comandos previos</td>
<td>history</td>
</tr>
</tbody>
</table><!--kg-card-end: html--><!--kg-card-begin: html--><h3 id="comando-whomai">2.4. Identificándote: El comando whoami</h3><!--kg-card-end: html--><p>Puedes obtener el nombre de usuario con el que iniciaste sesión con el comando <code>whoami</code>. Este comando es útil cuando cambias entre distintos usuarios y quieres confirmar el usuario actual.</p><p>Justo después del signo <code>$</code>, escribe <code>whoami</code> y presiona enter.</p><pre><code class="language-bash">whoami
</code></pre><p>Esta es la salida que obtuve.</p><pre><code class="language-bash">zaira@zaira-ThinkPad:~$ whoami
zaira
</code></pre><!--kg-card-begin: html--><h2 id="parte-3-entendiendo-sistema-linux">Parte 3: Entendiendo tu Sistema de Linux</h2><!--kg-card-end: html--><!--kg-card-begin: html--><h3 id="descubriendo-tu-so-y-especificaciones">3.1. Descubriendo tu SO y Especificaciones</h3><!--kg-card-end: html--><h4 id="imprimir-informaci-n-del-sistema-usando-el-comando-uname">Imprimir información del sistema usando el comando <code>uname</code></h4><p>Puedes obtener información del sistema de forma detallada del comando <code>uname</code>.</p><p>Cuando provees la opción <code>-a</code>, imprime toda la información del sistema.</p><pre><code class="language-bash">uname -a
# salida
Linux zaira 6.5.0-21-generic #21~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Fri Feb  9 13:32:52 UTC 2 x86_64 x86_64 x86_64 GNU/Linux
</code></pre><p>En la salida de arriba,</p><ul><li><code>Linux</code>: Indica el sistema operativo.</li><li><code>zaira</code>: Representa el nombre del host de la máquina.</li><li><code>6.5.0-21-generic #21~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Fri Feb 9 13:32:52 UTC 2</code>: Provee información sobre la versión del kernel, fecha de la construcción, y algunos detalles adicionales.</li><li><code>x86_64 x86_64 x86_64</code>: Indica la arquitectura del sistema.</li><li><code>GNU/Linux</code>: Representa el tipo de sistema operativo.</li></ul><h4 id="encontrar-detalles-de-la-arquitectura-de-la-cpu-usando-el-comando-lscpu">Encontrar detalles de la arquitectura de la CPU usando el comando <code>lscpu</code></h4><p>El comando <code>lscpu</code> en Linux se usa para mostrar información sobre la arquitectura de la CPU. Cuando ejecutas <code>lscpu</code> en la terminal, provee detalles tales como:</p><ul><li>La arquitectura de la CPU (por ejemplo, x86_64)</li><li>op-mode(s) de la CPU (por ejemplo, 32-bit, 64-bit)</li><li>Orden de Byte (por ejemplo, Little Endian)</li><li>CPU(s) (número de CPUs), y así sucesivamente</li></ul><p>Intentémoslo:</p><pre><code class="language-bash">lscpu
# salida
Architecture:            x86_64
  CPU op-mode(s):        32-bit, 64-bit
  Address sizes:         48 bits physical, 48 bits virtual
  Byte Order:            Little Endian
CPU(s):                  12
  On-line CPU(s) list:   0-11
Vendor ID:               AuthenticAMD
  Model name:            AMD Ryzen 5 5500U with Radeon Graphics
    Thread(s) per core:  2
    Core(s) per socket:  6
    Socket(s):           1
    Stepping:            1
    CPU max MHz:         4056.0000
    CPU min MHz:         400.0000
</code></pre><p>Eso fue mucha información, ¡pero útil también! Recuerda que siempre puedes ir viendo información relevante usando argumentos específicos. Ve el manual del comando con <code>man lscpu</code>.</p><!--kg-card-begin: html--><h2 id="parte-4-manejando-archivos-desde-el-cli">Parte 4: Manejando archivos desde la Línea de Comandos</h2><!--kg-card-end: html--><!--kg-card-begin: html--><h3 id="la-jerarquia-del-sistema-archivos-linux">4.1. La Jerarquía del sistema de archivos de Linux</h3><!--kg-card-end: html--><p>Todos los archivos en Linux son almacenados en un sistema de archivos. Sigue una estructura tipo árbol invertido porque la raíz está en la parte superior.</p><p>El &nbsp;<code>/</code> es la carpeta raíz y el punto de comienzo del sistema de archivos. La carpeta raíz contiene todas las otras carpetas y archivos en el sistema. El caracter <code>/</code> también sirve como una carpeta separadora entre los nombres de rutas. Por ejemplo, <code>/home/alice</code> forma una ruta completa.</p><p>La imagen de abajo muestra la jerarquía completa del sistema de archivos. Cada carpeta sirve un propósito específico.</p><p>Fíjate que esta no es una lista exhaustiva y distintas distribuciones podría tener distintas configuraciones.</p><figure class="kg-card kg-image-card"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1719322457140/02fdbf2c-f4fa-438b-af2f-c23f59f9ddf4.png" class="kg-image" alt="Linux file system hierarchy" width="1455" height="474" loading="lazy"></figure><p>Aquí hay una tabla que muestra el propósito de cada carpeta:</p><!--kg-card-begin: html--><table>
<thead>
<tr>
<th>Ubicación</th>
<th>Propósito</th>
</tr>
</thead>
<tbody>
<tr>
<td>/bin</td>
<td>Binarios de comandos esenciales</td>
</tr>
<tr>
<td>/boot</td>
<td>Archivos estáticos del cargador de arranque (boot loader), necesario para comenzar el proceso de incio.</td>
</tr>
<tr>
<td>/etc</td>
<td>Configuración de sistema específica del host</td>
</tr>
<tr>
<td>/home</td>
<td>Carpetas personales del usuario</td>
</tr>
<tr>
<td>/root</td>
<td>Carpeta personal para el usuario root administrativo</td>
</tr>
<tr>
<td>/lib</td>
<td>Librerías compartidas y módulos del kernel esenciales</td>
</tr>
<tr>
<td>/mnt</td>
<td>Punto de montaje para montar un sistema de archivos de forma temporal</td>
</tr>
<tr>
<td>/opt</td>
<td>Paquetes de software de aplicación complementarios</td>
</tr>
<tr>
<td>/usr</td>
<td>Software y librerías compartidas instalados</td>
</tr>
<tr>
<td>/var</td>
<td>Datos de variables que es también persistente entre los arranques</td>
</tr>
<tr>
<td>/tmp</td>
<td>Archivos temporarios que son accessibles a todos los usuarios</td>
</tr>
</tbody>
</table><!--kg-card-end: html--><p>💡 <strong>Consejo:</strong> Puedes aprender más sobre el sistema de archivos usando el comando <code>man hier</code>.</p><p>Puedes ver tu sistema de archivos usando el comando <code>tree -d -L 1</code>. Puedes modificar el argumento <code>-L</code> para cambiar la profundidad del árbol.</p><pre><code class="language-bash">tree -d -L 1
# salida
.
├── bin -&gt; usr/bin
├── boot
├── cdrom
├── data
├── dev
├── etc
├── home
├── lib -&gt; usr/lib
├── lib32 -&gt; usr/lib32
├── lib64 -&gt; usr/lib64
├── libx32 -&gt; usr/libx32
├── lost+found
├── media
├── mnt
├── opt
├── proc
├── root
├── run
├── sbin -&gt; usr/sbin
├── snap
├── srv
├── sys
├── tmp
├── usr
└── var

25 carpetas
</code></pre><p>Esta lista no es exhaustiva y distintas distribuciones y sistemas podrían ser configurados de forma distinta.</p><!--kg-card-begin: html--><h3 id="navegando-sistema-archivos-de-linux">4.2. Navegando el sistema de archivos de Linux</h3><!--kg-card-end: html--><h4 id="ruta-absoluta-vs-ruta-relativa">Ruta absoluta vs ruta relativa</h4><p>La ruta absoluta es la ruta completa de la carpeta raíz al archivo o a la carpeta. Siempre comienza con un <code>/</code>. Por ejemplo, <code>/home/john/documents</code>.</p><p>La ruta relativa, por otro lado, es la ruta desde la carpeta actual al archivo de destino o a la carpeta. No comienza con un <code>/</code>. Por ejemplo, <code>documents/work/project</code>.</p><h4 id="localizando-tu-carpeta-actual-usando-el-comando-pwd">Localizando tu carpeta actual usando el comando <code>pwd</code></h4><p>Es fácil perder tu camino en el sistema de archivos de Linux, especialmente si eres nuevo en la línea de comandos. Puedes localizar tu carpeta actual usando el comando <code>pwd</code>.</p><p>Aquí hay un ejemplo:</p><pre><code class="language-bash">pwd
# output
/home/zaira/scripts/python/free-mem.py
</code></pre><h4 id="cambiando-carpetas-usando-el-comando-cd">Cambiando carpetas usando el comando <code>cd</code></h4><p>El comando para cambiar carpetas es <code>cd</code> y significa "cambiar carpeta - change directory en inglés". Puedes usar el comando <code>cd</code> para navegar hacia otra carpeta diferente.</p><p>Puedes usar una ruta relativa o una ruta absoluta.</p><p>Por ejemplo, si quieres navegar la estructura de archivos de abajo (siguiendo las líneas rojas):</p><figure class="kg-card kg-image-card"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1719389950079/640cce46-6c52-4f38-9787-581747fb9798.png" class="kg-image" alt="Example file structure" width="327" height="253" loading="lazy"></figure><p>y estás en "home", el comando sería así:</p><pre><code class="language-bash">cd home/bob/documents/work/project
</code></pre><p>Otros atajos de <code>cd</code> usado comúnmente son:</p><!--kg-card-begin: html--><table>
<thead>
<tr>
<th>Comando</th>
<th>Descripción</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>cd ..</code></td>
<td>Regresar una carpeta</td>
</tr>
<tr>
<td><code>cd ../..</code></td>
<td>Regresar dos carpetas</td>
</tr>
<tr>
<td><code>cd</code> o <code>cd ~</code></td>
<td>Regresar a la carpeta personal</td>
</tr>
<tr>
<td><code>cd -</code></td>
<td>Regresar a la ruta previa</td>
</tr>
</tbody>
</table><!--kg-card-end: html--><!--kg-card-begin: html--><h3 id="manejando-archivos-y-carpetas">4.3. Manejando archivos y carpetas</h3><!--kg-card-end: html--><p>Cuando se trabaja con archivos y carpetas, podrías querer copiar, mover, quitar, y crear archivos y carpetas nuevas. Aquí hay algunos comandos que te pueden ayudar con eso.</p><p>💡<strong>Consejo:</strong> Puedes diferenciar entre un archivo y una carpeta mirando la primera letra en la salida de <code>ls -l</code>. Un <code>'-'</code> representa un archivo y un <code>'d'</code> representa una carpeta.</p><figure class="kg-card kg-image-card"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1719390306244/4f1688cd-ded5-43fe-b13a-9ca44ac7c4ad.png" class="kg-image" alt="&quot;d&quot; represents a folder" width="766" height="226" loading="lazy"></figure><h4 id="creando-nuevas-carpetas-usando-el-comando-mkdir">Creando nuevas carpetas usando el comando <code>mkdir</code></h4><p>Puedes crear una carpeta vacía usando el comando <code>mkdir</code>.</p><pre><code class="language-bash"># creates an empty directory named "foo" in the current folder
mkdir foo
</code></pre><p>También puedes crear carpetas recursivamente usando la opción <code>-p</code>.</p><pre><code class="language-bash">mkdir -p tools/index/helper-scripts
# output of tree
.
└── tools
    └── index
        └── helper-scripts

3 directories, 0 files
</code></pre><h4 id="creando-nuevos-archivos-usando-el-comando-touch">Creando nuevos archivos usando el comando <code>touch</code></h4><p>El comando <code>touch</code> crea un archivo vacío. Puedes usarlo así:</p><pre><code class="language-bash"># creates empty file "file.txt" in the current folder
touch file.txt
</code></pre><p>Los nombres del archivo pueden ser encadenados si quieres crear múltiples archivos en un solo comando.</p><pre><code class="language-bash"># creates empty files "file1.txt", "file2.txt", and "file3.txt" in the current folder

touch file1.txt file2.txt file3.txt
</code></pre><h4 id="eliminando-archivos-y-carpetas-usando-el-comando-rm-y-rmdir">Eliminando archivos y carpetas usando el comando <code>rm</code> y <code>rmdir</code></h4><p>Puedes usar el comando <code>rm</code> para eliminar ambos archivos y carpetas no vacías.</p><!--kg-card-begin: html--><table>
<thead>
<tr>
<th>Comando</th>
<th>Descripción</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>rm archivo.txt</code></td>
<td>Elimina el archivo <code>archivo.txt</code></td>
</tr>
<tr>
<td><code>rm -r dir</code></td>
<td>Elimina la carpeta <code>dir</code> y su contenido</td>
</tr>
<tr>
<td><code>rm -f archivo.txt</code></td>
<td>Elimina el archivo <code>archivo.txt</code> sin mostrar un mensaje de confirmación</td>
</tr>
<tr>
<td><code>rmdir</code> carpeta</td>
<td>Elimina una carpeta vacía</td>
</tr>
</tbody>
</table><!--kg-card-end: html--><p>🛑 Fíjate que deberías usar el argumento <code>-f</code> con cuidado ya que no te preguntará antes de eliminar un archivo. También, ten cuidado cuando ejecutas comandos <code>rm</code> en la carpeta <code>root</code> ya que podría resultar en eliminar archivos importantes de sistema.</p><h4 id="copiando-archivos-usando-el-comando-cp">Copiando archivos usando el comando <code>cp</code></h4><p>Para copiar archivos en Linux, usa el comando <code>cp</code>.</p><ul><li><strong>Sintaxis para copiar archivos:</strong><code>cp source_file destination_of_file</code></li></ul><p>Este comando copia un archivo llamado <code>file1.txt</code> a una nueva ubicación del archivo <code>/home/adam/logs</code>.</p><pre><code class="language-bash">cp file1.txt /home/adam/logs
</code></pre><p>El comando <code>cp</code> también crea una copia de un archivo con el nombre provisto.</p><p>Este comando copia un archivo llamado <code>file1.txt</code> a otro archivo llamado <code>file2.txt</code> en la misma carpeta.</p><pre><code class="language-bash">cp file1.txt file2.txt
</code></pre><h4 id="moviendo-y-renombrando-archivos-y-carpetas-usando-el-comando-mv">Moviendo y renombrando archivos y carpetas usando el comando <code>mv</code></h4><p>El comando <code>mv</code> se usa para mover archivos y carpetas de una carpeta a otra.</p><p><strong>Sintaxis para mover archivos: </strong><code>mv source_file destination_directory</code></p><p><strong>Ejemplo:</strong> Mover un archivo llamado <code>file1.txt</code> a una carpeta llamada <code>backup</code>:</p><pre><code class="language-bash">mv file1.txt backup/
</code></pre><p>Para mover una carpeta y sus contenidos:</p><pre><code class="language-bash">mv dir1/ backup/
</code></pre><p>Renombrando archivos y carpetas en Linux también se hace con el comando <code>mv</code>.</p><p><strong>Sintaxis para renombrar archivos: </strong><code>mv old_name new_name</code></p><p><strong>Ejemplo:</strong> Renombrar un archivo de <code>file1.txt</code> a <code>file2.txt</code>:</p><pre><code class="language-bash">mv file1.txt file2.txt
</code></pre><p>Renombrar una carpeta de <code>dir1</code> a <code>dir2</code>:</p><pre><code class="language-bash">mv dir1 dir2
</code></pre><!--kg-card-begin: html--><h3 id="localizando-archivos-y-carpetas">4.4. Localizando archivos y carpetas usando el comando find</h3><!--kg-card-end: html--><p>El comando <code>find</code> te permite buscar eficientemente archivos, carpetas, y un caracter y dispositivos de bloque.</p><p>Abajo está la sintaxis del comando <code>find</code>:</p><pre><code class="language-bash">find /path/ -type f -name file-to-search
</code></pre><p>Donde,</p><ul><li><code>/path</code> es la ruta donde el archivo se espera ser encontrado. Este es el punto de comienzo para buscar archivos. La ruta también pueder ser <code>/</code> o <code>.</code> el cual representa la raíz y la carpeta actual, respectivamente.</li><li><code>-type</code> representa los descriptores del archivo. Pueden ser cualquiera de lo de abajo: <code>f</code> – <strong>Archivo regular</strong> tales como archivos de texto, imágenes, y archivos ocultos. <code>d</code> – <strong>Carpeta</strong>. Estosson las carpetas bajo consideración. <code>l</code> – <strong>Enlace Simbólico</strong>. Los enlaces simbólicos apunta a archivos y son similares a atajos. <code>c</code> – <strong>Dispositivos de Caracteres</strong>. Archivos que se usan para acceder a dispositivos de carecteres se llaman archivos de dispositivo de caracter. Los drivers se comunican con dispositivos de caracteres enviando y recibiendo caracteres individuales (bytes, octetoss). Ejemplos incluyen teclados, tarjetas de sonido, y el ratón. <code>b</code> – <strong>Dispositivos de Bloque</strong>. Archivos que se usan para acceder a dispositivos de bloque se llaman archivos de dipositivos de bloque. Los drivers se comunican con dispositivos de bloque enviando y recibiendo bloques enteros de datos. Ejemplos incluyen USB y CD-ROM.</li><li><code>-name</code> es el nombre del tipo de archivo que quieres buscar.</li></ul><h4 id="c-mo-buscar-archivos-por-nombre-o-extensi-n">Cómo buscar archivos por nombre o extensión</h4><p>Supón que necesitamos encontrar archivos que contienen "style" en sus nombres. Usaremos este comando</p><pre><code class="language-bash">find . -type f -name "style*"
#output
./style.css
./styles.css
</code></pre><p>Ahora digamos que queremos encontrar archivos con una extensión particular como <code>.html</code>. Modificaremos el comando así:</p><pre><code class="language-bash">find . -type f -name "*.html"
# output
./services.html
./blob.html
./index.html
</code></pre><h4 id="c-mo-buscar-archivos-ocultos">Cómo buscar archivos ocultos</h4><p>Un punto al comienzo del nombre de archivo representa archivos ocultos. Son ocultos normalmente pero pueden ser vistos con <code>ls -a</code> en la carpeta actual.</p><p>Podemos modificar el comando <code>find</code> como se muestra abajo para buscar archivos ocultos:</p><pre><code class="language-bash">find . -type f -name ".*"
</code></pre><p><strong>Listar y encontrar archivos ocultos</strong></p><pre><code class="language-bash">ls -la
# contenido de las carpetas
total 5
drwxrwxr-x  2 zaira zaira 4096 Mar 26 14:17 .
drwxr-x--- 61 zaira zaira 4096 Mar 26 14:12 ..
-rw-rw-r--  1 zaira zaira    0 Mar 26 14:17 .bash_history
-rw-rw-r--  1 zaira zaira    0 Mar 26 14:17 .bash_logout
-rw-rw-r--  1 zaira zaira    0 Mar 26 14:17 .bashrc

find . -type f -name ".*"
# salida de find
./.bash_logout
./.bashrc
./.bash_history
</code></pre><p>Arriba puedes ver una lista de archivos ocultos en mi carpeta home.</p><h4 id="c-mo-buscar-archivos-log-y-archivos-de-configuraci-n">Cómo buscar archivos log y archivos de configuración</h4><p>Los archivos logs usualmente tienen la extensión <code>.log</code>, y podemos encontrarlos así:</p><pre><code class="language-bash"> find . -type f -name "*.log"
</code></pre><p>De forma similar, podemos buscar archivos de configuración de esta forma:</p><pre><code class="language-bash"> find . -type f -name "*.conf"
</code></pre><h4 id="c-mo-buscar-otros-archivos-por-tipo">Cómo buscar otros archivos por tipo</h4><p>Podemos buscarpor archivos de bloque de caracteres proveyendo <code>c</code> a <code>-type</code>:</p><pre><code class="language-bash">find / -type c
</code></pre><p>De forma similar, podemos encontrar archivos de bloque de dispositivos usando <code>b</code>:</p><pre><code class="language-bash">find / -type b
</code></pre><h4 id="c-mo-buscar-carpetas">Cómo buscar carpetas</h4><p>En el ejemplo de abajo, encontramos las carpetas usando el argumento <code>-type d</code>.</p><pre><code class="language-bash">ls -l
# lista el contenido de las carpetas
drwxrwxr-x 2 zaira zaira 4096 Mar 26 14:22 hosts
-rw-rw-r-- 1 zaira zaira    0 Mar 26 14:23 hosts.txt
drwxrwxr-x 2 zaira zaira 4096 Mar 26 14:22 images
drwxrwxr-x 2 zaira zaira 4096 Mar 26 14:23 style
drwxrwxr-x 2 zaira zaira 4096 Mar 26 14:22 webp 

find . -type d 
# salida de find mostrando carpetas
.
./webp
./images
./style
./hosts
</code></pre><h4 id="c-mo-buscar-archivos-por-tama-o">Cómo buscar archivos por tamaño</h4><p>Un uso increíblemente útil del comando <code>find</code> es listar archivos basados en un tamaño particular.</p><pre><code class="language-bash">find / -size +250M
</code></pre><p>Aquí, estamos listando archivos cuyos tamaños exceden los <code>250MB</code>.</p><p>Otras unidades incluyen:</p><ul><li><code>G</code>: GigaBytes.</li><li><code>M</code>: MegaBytes.</li><li><code>K</code>: KiloBytes</li><li><code>c</code> : bytes.</li></ul><p>Sólo reemplaza con la unidad relevante.</p><pre><code class="language-bash">find &lt;directory&gt; -type f -size +N&lt;Unit Type&gt;
</code></pre><h4 id="c-mo-buscar-archivos-por-tiempo-de-modificaci-n">Cómo buscar archivos por tiempo de modificación</h4><p>Usando el argumento <code>-mtime</code>, puedes filtrar archivos y carpetas basado en el tiempo de modificación.</p><pre><code class="language-bash">find /path -name "*.txt" -mtime -10
</code></pre><p>Por ejemplo,</p><ul><li><strong>-mtime +10</strong> significa que estás buscando un archivo que se modificó hace 10 días.</li><li><strong>-mtime -10</strong> significa menos de 10 días.</li><li><strong>-mtime 10</strong> si te salteas + o – significa exactamente 10 días.</li></ul><!--kg-card-begin: html--><h3 id="comandos-basicos-para-ver-archivos">4.5. Comandos Básicos para ver archivos</h3><!--kg-card-end: html--><h4 id="concatena-y-muestra-archivos-usando-el-comando-cat">Concatena y muestra archivos usando el comando <code>cat</code></h4><p>El comando <code>cat</code> en Linux se usa para mostrar los contenidos de un archivo. También puede ser usado para concatenar y crear nuevos archivos.</p><p>Aquí está la sintaxis básica del comando <code>cat</code>:</p><pre><code class="language-bash">cat [opciones] [archivo]
</code></pre><p>La forma más simple de usar <code>cat</code> es sin ninguna opción o argumento. Esto mostrará los contenidos del archivo en la terminal.</p><p>Por ejemplo, si quieres mostrar los contenidos de un archivo llamado <code>file.txt</code>, puedes usar el siguiente comando:</p><pre><code class="language-bash">cat file.txt
</code></pre><p>Esto mostrará todos los contenidos del archivo en la termina de una sola vez.</p><h4 id="ver-archivos-de-texto-de-forma-interactiva-usando-less-y-more">Ver archivos de texto de forma interactiva usando <code>less</code> y <code>more</code></h4><p>Mientras que <code>cat</code> muestra todo el archivo de una sola vez, <code>less</code> y <code>more</code> te permite ver los contenidos de un archivo de forma interactiva. Esto es útil cuando quieres desplazarte a través de un archivo grande o buscar por contenido específico.</p><p>La sintaxis del comando <code>less</code> es:</p><pre><code class="language-bash">less [opciones] [archivo]
</code></pre><p>El comando <code>more</code> es similar a <code>less</code> pero tiene menos características. Se usa para mostrar los contenidos de un archivo en una pantalla a la vez.</p><p>La sintaxis del comando <code>more</code> es:</p><pre><code class="language-bash">more [opciones] [archivo]
</code></pre><p>Para ambos comandos, puedes usar el <code>la barra de espacio</code> para desplazarte a una página abajo, la tecla <code>Enter</code> para desplazarte una línea abajo, y la tecla <code>q</code> para salir del visualizador.</p><p>Para moverte hacia atrás puedes usar la tecla <code>b</code>, y para moverte hacia adelante puedes usar la tecla <code>f</code>.</p><h4 id="mostrando-la-ltima-parte-de-los-archivos-usando-tail">Mostrando la última parte de los archivos usando <code>tail</code></h4><p>A veces podrías necesitar ver solo las últimas líneas de un archivo en vez de todo el archivo. El comando <code>tail</code> en Linux se usa para mostrar la última parte de un archivo.</p><p>Por ejemplo, <code>tail file.txt</code> mostrará las últimas 10 líneas del archivo <code>file.txt</code> por defecto.</p><p>Si quieres mostrar un número distinto de líneas, puedes usar la opción <code>-n</code> seguido del número de líneas que quieres mostrar.</p><pre><code class="language-bash"># Muestra las últimas 50 líneas del archivo file.txt
tail -n 50 file.txt
</code></pre><p>💡<strong>Consejo:</strong> Otro uso de <code>tail</code> es su opción inmediata (<code>-f</code>). Esta opción te permite ver los contenidos de un archivo a medida que están siendo escritos. Esto es una utilidad útil para ver y monitorear archivos log en tiempo real.</p><h4 id="mostrar-el-comienzo-de-los-archivos-usando-head">Mostrar el comienzo de los archivos usando <code>head</code></h4><p>Así como <code>tail</code> muestra la última parte de un archivo, puedes usar el comando <code>head</code> en Linux para mostrar el inicio de un archivo.</p><p>Por ejemplo, <code>head file.txt</code> mostrará las 10 primera líneas del archivo <code>file.txt</code> por defecto.</p><p>Para cambiar el número de líneas mostradas, puedes usar la opción <code>-n</code> seguido del número de líneas que quieres mostrar.</p><h4 id="contando-palabras-l-neas-y-caracteres-usando-wc">Contando palabras, líneas, y caracteres usando <code>wc</code></h4><p>Puedes contar palabras, líneas y caracteres en un archivo usando el comando <code>wc</code>.</p><p>Por ejemplo, ejecutando <code>wc syslog.log</code> me dio la siguiente salida:</p><pre><code class="language-bash">1669 9623 64367 syslog.log
</code></pre><p>En la salida de arriba,</p><ul><li><code>1669</code> representa el número de líneas en el archivo <code>syslog.log</code>.</li><li><code>9623</code> representa el número de palabras en el archivo <code>syslog.log</code>.</li><li><code>64367</code> representa el número de caracteres en el archivo <code>syslog.log</code>.</li></ul><p>Así que, el comando <code>wc syslog.log</code> contó <code>1669</code> líneas <code>9623</code> palabras, y <code>64367</code> caracteres en el archivo <code>syslog.log</code>.</p><h4 id="comparando-archivo-l-nea-por-l-nea-usando-diff">Comparando archivo línea por línea usando <code>diff</code></h4><p>Comparando y encontrando diferencias entre dos archivos es una tarea común en Linux. Puedes comparar dos archivos justo en la línea de comandos usando el comando <code>diff</code>.</p><p>La sintaxis básica del comando <code>diff</code> es:</p><pre><code class="language-bash">diff [opciones] archivo1 archivo2
</code></pre><p>Aquí hay dos archivos, <code>hello.py</code> y <code>also-hello.py</code>, que compararemos usando el comando <code>diff</code>:</p><pre><code class="language-bash"># contenido de hello.py

def greet(name):
    return f"Hola, {name}!"

user = input("Ingresa tu nombre: ")
print(greet(user))
# contenido de also-hello.py

more also-hello.py
def greet(name):
    return fHola, {name}!

user = input(Ingresa tu nombre: )
print(greet(user))
print("¡Un placer en conocerte!")
</code></pre><ol><li>Verifica si los archivos son similares o no.</li></ol><pre><code class="language-bash">diff -q hello.py also-hello.py
# Salida
Files hello.py and also-hello.py differ
</code></pre><p>2. &nbsp; Ve cómo los archivos difieren. Para eso, puedes usar el argumento <code>-u</code> para ver una salida unificada:</p><pre><code class="language-bash">diff -u hello.py also-hello.py
--- hello.py    2024-05-24 18:31:29.891690478 +0500
+++ also-hello.py    2024-05-24 18:32:17.207921795 +0500
@@ -3,4 +3,5 @@

 user = input(Ingresa tu nombre: )
 print(greet(user))
+print("Un placer en conocerte")
</code></pre><p>En la salida de arriba:</p><ul><li><code>--- hello.py 2024-05-24 18:31:29.891690478 +0500</code> indica el archivo siendo comparado y su marca de tiempo.</li><li><code>+++ also-hello.py 2024-05-24 18:32:17.207921795 +0500</code> indica el otro archivo siendo comparado y su marca de tiempo.</li><li><code>@@ -3,4 +3,5 @@</code> muestra los número de línea donde los cambios ocurren. En estecaos, indica que las líneas 3 a 4 en el archivo original ha cambiado a las líneas 3 a 5 en el archivo modificado.</li><li><code>user = input(Ingresa tu nombre: )</code> es una línea del archivo original.</li><li><code>print(greet(user))</code> es otra línea del archivo original.</li><li><code>print("Un placer en conocerte")</code> es la línea adicional en el archivo modificado.</li></ul><p>3. &nbsp; Para ver el diff en un formato lado a lado, puedes usar el argumento <code>-y</code>:</p><pre><code class="language-bash">diff -y hello.py also-hello.py
# Salida
def greet(name):                        def greet(name):
    return fHola, {name}!                        return fHola, {name}!

user = input(Ingresa tu nombre: )                    user = input(Enter your name: )
print(greet(user))                        print(greet(user))
                                        &gt;    print("Un placer en conocerte")
</code></pre><p>En la salida:</p><ul><li>Las líneas que están en ambos archivos se muestran lado a lado.</li><li>Las líneas que son distintas se muestran con un símbolo <code>&gt;</code> indicando que la línea está presente solamente en uno de los archivos.</li></ul><!--kg-card-begin: html--><h2 id="parte-5-esencial-sobre-edicion-texto-linux">Parte 5: Lo Esencial sobre Edición de Texto en Linux</h2><!--kg-card-end: html--><p>Las habilidades de edición de texto usando la línea de comandos son una de las habilidades más cruciales en Linux. En esta sección, aprenderás cómo usar dos editores de textos populares en Linux: Vim y Nano.</p><p>Te sugiero que domines cualquier editor de texto de tu gusto y apegarte a él. Te ahorrará tiempo y te hará más productivo. Vim y nano son opciones seguras ya que están presentes en la mayoría de las distribuciones de Linux.</p><!--kg-card-begin: html--><h3 id="dominando-vim-guia-completa">5.1. Dominando Vim: La Guía Completa</h3><!--kg-card-end: html--><h4 id="introducci-n-a-vim">Introducción a Vim</h4><p>Vim es una herramienta de edición de texto popular para la línea de comandos. Vim tiene sus ventajas: es poderoso, personalizable, y rápido. Aquí hay algunas razones de por qué deberías considerar aprender Vim:</p><ul><li>La mayoría de los servidores son accedidos a través de un CLI, así que en administración de sistemas, no es necesario que tengas los lujos de un GUI. Pero Vim te respalda – siempre estarás allí.</li><li>Vim usa un enfoque centrado al teclado, ya que está diseñado para ser usado sin un ratón, lo cual puede acelerar significativamente las tareas de edición una vez que has aprendido los atajos de teclado. Esto también lo hace más rápido que las herramientas GUI.</li><li>Algunas utilidades de Linux, por ejemplo edición de <em>cron jobs</em>, funcionan en el mismo formato de edición como Vim.</li><li>Vim es apropiado para todos – usuarios principiantes y avanzados. Vim suporta búsquedas de cadena complejas, resaltación de búsquedas, y mucho más. A través de los plugins, Vim provee capacidades extendidas para los desarrolladores y administradores de sistema que incluyen completación de código, resaltación de sintaxis, gestión de archivos, control de versiones, y más.</li></ul><p>Vim tiene dos variaciones: Vim (<code>vim</code>) y Vim pequeño (<code>vi</code>). Vim pequeño es una versión más pequeña de Vim que carece de algunas características de Vim.</p><h4 id="c-mo-comenzar-usando-vim">Cómo comenzar usando <code>vim</code></h4><p>Comienza usando Vim con este comando:</p><pre><code class="language-bash">vim your-file.txt
</code></pre><p><code>your-file.txt</code> puede ser un nuevo archivo o un archivo existente que quieres editar.</p><h4 id="navegando-con-vim-dominando-modos-de-movimiento-y-comando">Navegando con Vim: Dominando modos de movimiento y comando</h4><p>A principios del CLI, los teclados no tenían teclas de flecha. Por lo tanto, la navegación se hacía usando el conjunto de teclas disponibles, <code>hjkl</code> siendo uno de ellos.</p><p>Siendo centrado al teclado, usando las teclas <code>hjkl</code> pueden acelerar inmensamente las tareas de edición de texto.</p><p>Nota: aunque las teclas de flecha funcionan bien totalmente, todavías puedes experimentar con las teclas <code>hjkl</code> para navegar. Algunas personas encuentran esta forma de navegar eficiente.</p><p>💡<strong>Consejo:</strong> Para recordar la secuencia de <code>hjkl</code>, usa esto: <strong>h</strong>ang back, <strong>j</strong>ump down, <strong>k</strong>ick up, <strong>l</strong>eap forward (quedarse atrás, saltar hacia abajo, patear, saltar hacia adelante).</p><figure class="kg-card kg-image-card"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1719392462442/1a667ede-5f03-4acb-b40f-b10cefc64de3.png" class="kg-image" alt="hjkl navigation guide" width="471" height="274" loading="lazy"></figure><h4 id="los-tres-modos-de-vim">Los tres modos de Vim</h4><p>Necesitas conocer los 3 modos de operando de Vim y cómo cambiarlos. Las pulsaciones de teclas se comportan de forma distinta en cada modo de comando. Los tres modos son los siguientes:</p><ol><li>Modo comando.</li><li>Modo edición.</li><li>Modo Visual.</li></ol><p><strong>Modo Comando.</strong> Cuando comienzas con Vim, llegas al modo comando por defecto. Este modo te permite acceder a otros módulos.</p><p>⚠ Para cambiar a otros modos, necesitas estar presente en el modo comando primero.</p><p><strong>Modo edición</strong></p><p>Este modo te permite hacer cambios al archivo. Para entrar el modo edición, presiona <code>I</code> mientras estás en modo comando. Fíjate el conmutador <code>'-- INSERT'</code> al final de la pantalla.</p><figure class="kg-card kg-image-card"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1719392526710/d44cecd7-64be-4c89-9a31-dbf395b77fcb.png" class="kg-image" alt="Insert mode in Vim" width="433" height="345" loading="lazy"></figure><p><strong>Modo visual</strong></p><p>Este modo te permite trabajar en un solo caracter, un bloque de texto, o líneas de texto. Vamos a descomponerlo en pasos sencillos. Recuerda, usa las combinaciones de abajo cuando estés en modo comando.</p><ul><li><code>Shift + V</code> → Selecciona múltiples líneas.</li><li><code>Ctrl + V</code> → Modo bloque.</li><li><code>V</code> → Mode caracter.</li></ul><p>El modo visual viene bien cuando necesitas copiar y pegar o editar líneas en masa.</p><figure class="kg-card kg-image-card"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1719392557097/b61a1515-cac0-4470-856b-b2c15de581e8.gif" class="kg-image" alt="Selectind text using visual mode" width="673" height="422" loading="lazy"></figure><p><strong>Modo comando extendido.</strong></p><p>El modo comando extendido te permite realizar operaciones avanzadas como buscar, establecer números de líneas, y resaltar texto. Cubriremos el modo extendido en la próxima sección.</p><p>¿Cómo mantener el rumbo? Si te olvidas de tu modo actual, solo presiona <code>ESC</code> dos veces y estarás de vuelta en Modo Comando.</p><h4 id="editando-eficientemente-en-vim-copiar-pegar-y-buscar">Editando eficientemente en Vim: Copiar/pegar y buscar</h4><p><strong>1. Cómo copiar y pegar en Vim</strong></p><p>Copiar-pegar es conocido como 'yank' y 'put' en términos de Linux. Para copiar-pegar, sigue estos pasos:</p><ul><li>Selecciona texto en modo visual.</li><li>Presiona <code>'y'</code> para copiar/ yank.</li><li>Mueve tu cursor a la posición requerida y presiona <code>'p'</code>.</li></ul><p><strong>2. Cómo buscar texto en Vim</strong></p><p>Cualquier serie de cadenas puede ser buscado con Vim usando el <code>/</code> en modo comando. Para buscar, usa <code>/string-to-match</code>.</p><p>En el modo comando, escribe <code>:set hls</code> y presiona <code>enter</code>. Busca usando <code>/string-to-match</code>. Esto resaltará las búsquedas.</p><p>Busqueamos unas pocas cadenas:</p><figure class="kg-card kg-image-card"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1719392684097/11c4a45e-0698-4fb7-bef7-f193684ea21a.gif" class="kg-image" alt="Highlighting searches in Vim" width="800" height="409" loading="lazy"></figure><p><strong>3. Cómo salir de Vim</strong></p><p>Primero, pásate a modo comando (presionando escape dos veces) y luego usa estos argumentos:</p><ul><li>Salir sin guardar → <code>:q!</code></li><li>Salir y guardar → <code>:wq!</code></li></ul><h4 id="atajos-en-vim-haciendo-la-edici-n-m-s-r-pido">Atajos en Vim: Haciendo la edición más rápido</h4><p>Nota: todos estos atajos funcionan solamente en el modo comando.</p><ul><li><strong>Navegación básica</strong></li><li><code>h</code>: Mover a la izquierda</li><li><code>j</code>: Mover hacia abajo</li><li><code>k</code>: Mover hacia arriba</li><li><code>l</code>: Mover a la derecha</li><li><code>0</code>: Mover al principio de la línea</li><li><code>$</code>: Mover al final de la línea</li><li><code>gg</code>: Mover al principio del archivo</li><li><code>G</code>: Mover al final del archivo</li><li><code>Ctrl+d</code>: Mover media página hacia abajo</li><li><code>Ctrl+u</code>: Mover media página hacia arriba</li><li><strong>Editando</strong></li><li><code>i</code>: Ingresa modo insertar antes del cursor</li><li><code>I</code>: Ingresa el modo instertar al principio de la línea</li><li><code>a</code>: Ingresa el modo insertar después del cursor</li><li><code>A</code>: Ingresa el modo insertar al final de la línea</li><li><code>o</code>: Abre una nueva línea debajo de la línea actual e ingresa el modo insertar</li><li><code>O</code>: Abre una nueva línea arriba de la línea actual e ingresa el modo insertar</li><li><code>x</code>: Elimina el caracter debajo del cursor</li><li><code>dd</code>: Elimina la línea actual</li><li><code>yy</code>: Yank (copia) la línea actual (usa esto en modo visual)</li><li><code>p</code>: Pegar debajo del cursor</li><li><code>P</code>: Pegar arriba del cursor</li><li><strong>Buscando y Reemplazando</strong></li><li><code>/</code>: Buscar un patrón el cual te llevará a la próxima ocurriencia</li><li><code>?</code>: Buscar un patrón que te llevará a la ocurrencia previa</li><li><code>n</code>: Repite la última búsqueda en la misma dirección</li><li><code>N</code>: Repite la última búsqueda en la dirección opuesta</li><li><code>:%s/old/new/g</code>: Reemplaza todas las ocurrencias de <code>old</code> con <code>new</code> en el archivo</li><li><strong>Saliendo</strong></li><li><code>:w</code>: Guarda el archivo pero no sale</li><li><code>:q</code>: Sale de Vim (falla si hay cambios no guardados)</li><li><code>:wq</code> or <code>:x</code>: Guardar y sale</li><li><code>:q!</code>: Sale sin guardar</li><li><strong>Múltiples Ventanas</strong></li><li><code>:split</code> or <code>:sp</code>: Divide la ventana horizontalmente</li><li><code>:vsplit</code> or <code>:vsp</code>: Divide la ventana verticalmente</li><li><code>Ctrl+w followed by h/j/k/l</code>: Navega entre ventanas divididas	</li></ul><!--kg-card-begin: html--><h3 id="dominando-nano">5.2. Dominando Nano</h3><!--kg-card-end: html--><h4 id="comenzando-con-nano-el-editor-de-texto-amigable">Comenzando con Nano: El editor de texto amigable</h4><p>Nano es un editor de texto amigable que es fácil de usar y es perfecto para los principiantes. Está pre-instalado en la mayoría de las distribuciones de Linux.</p><p>Para crear un nuevo archivo usando Nano, usa el siguiente comando:</p><pre><code class="language-bash">nano
</code></pre><p>Para empezar a editar un archivo existente con Nano, usa el siguiente comando:</p><pre><code class="language-bash">nano filename
</code></pre><h4 id="lista-de-combinaciones-de-tecla-en-nano">Lista de combinaciones de tecla en Nano</h4><p>Estudiemos las combinaciones de tecla más importantes en Nano. Usará las combinaciones de tecla para realizar varias operaciones como guardar, salir, copiar, pegar, y más.</p><p><strong>Escribir a un archivo y guardar</strong></p><p>Una vez que abres Nano usando el comando <code>nano</code>, puedes comenzar con escribir texto. Para guardar el archivo, presiona <code>Ctrl+O</code>. Te aparecerá una ventana para que ingreses el nombre del archivo. Presiona <code>Enter</code> para guardar el archivo.</p><p><strong>Salir de nano</strong></p><p>Puedes salir de Nano presionando <code>Ctrl+X</code>. Si tienes cambios no guardados, Nano te mostrará una ventana para guardar los cambios antes de salir.</p><p><strong>Copiar y pegar</strong></p><p>Para seleccionar una región, usa <code>ALT+A</code>. Un marcador aparecerá. Usa las flechas para seleccionar el texto. Una vez seleccionado, sale del marcador con <code>ALT+^</code>.</p><p>Para copiar el texto seleccionado, presiona <code>Ctrl+K</code>. Para guardar el texto copiado, presiona <code>Ctrl+U</code>.</p><p><strong>Cortar y pegar</strong></p><p>Selecciona la región con <code>ALT+A</code>. Una vez seleccionado, corta el texto con <code>Ctrl+K</code>. Para pegar el texto cortado, presiona <code>Ctrl+U</code>.</p><p><strong>Navegación</strong></p><p>Usa <code>Alt \</code> para moverte al principio del archivo.</p><p>Usa <code>Alt /</code> para moverte al final del archivo.</p><p><strong>Viendo números de línea</strong></p><p>Cuando abres un archivo con <code>nano -l filename</code>, puedes ver los números de línea en el lado izquierdo del archivo.</p><p><strong>Buscando</strong></p><p>Puedes buscar un número de línea específico con <code>ALt + G</code>. Ingresa el número de línea al prompt y presiona <code>Enter</code>.</p><p>También puedes iniciar una búsqueda de una cadena con <code>CTRL + W</code> y presiona Enter. Si quieres buscar hacia atrás, puedes presionar <code>Alt + W</code> después de iniciar la búsqueda con <code>Ctrl + W</code>.</p><h4 id="resumen-de-combinaciones-de-tecla-en-nano">Resumen de combinaciones de tecla en Nano</h4><ul><li><strong>General</strong></li><li><code>Ctrl+X</code>: Sale de Nano (sale una ventana para guarda si se hacen cambios)</li><li><code>Ctrl+O</code>: Guarda el archivo</li><li><code>Ctrl+R</code>: Lee un archivo en un archivo actual</li><li><code>Ctrl+G</code>: Muestra el texto de ayuda</li><li><strong>Editando</strong></li><li><code>Ctrl+K</code>: Corta la línea actual y lo almacena en el cutbuffer</li><li><code>Ctrl+U</code>: Guarda los contenidos del cutbuffer en la línea actual</li><li><code>Alt+6</code>: Copia la línea actual y lo almacena en el cutbuffer</li><li><code>Ctrl+J</code>: Justifica el párrafo actual</li><li><strong>Navigación</strong></li><li><code>Ctrl+A</code>: Se mueve al principio de la línea</li><li><code>Ctrl+E</code>: Se mueve al final de la línea</li><li><code>Ctrl+C</code>: Muestra el número de línea actual e información del archivo</li><li><code>Ctrl+_</code> (<code>Ctrl+Shift+-</code>): Va a un número de línea específica (y opcionalmente, una columna)</li><li><code>Ctrl+Y</code>: Se desplaza una página arriba</li><li><code>Ctrl+V</code>: Se desplaza una página abajo</li><li><strong>Buscar y Reemplazar</strong></li><li><code>Ctrl+W</code>: Buscar una cadena (luego <code>Enter</code> para búscar nuevamente)</li><li><code>Alt+W</code>: Repite la última búsqueda pero en la dirección opuesta</li><li><code>Ctrl+\</code>: Busca y reemplaza</li><li><strong>Misceláneos</strong></li><li><code>Ctrl+T</code>: Invoca el corrector ortográfico, si está disponible</li><li><code>Ctrl+D</code>: Elimina el caracter debajo del cursor (no lo corta)</li><li><code>Ctrl+L</code>: Refresca (redibuja) la ventana actual</li><li><code>Alt+U</code>: Deshace la última operación</li><li><code>Alt+E</code>: Rehace la última operación sin terminar</li></ul><!--kg-card-begin: html--><h2 id="parte-6-programacion-en-bash">Parte 6: La Programación en Bash</h2><!--kg-card-end: html--><!--kg-card-begin: html--><h3 id="definicion-de-los-scripts-bash">6.1. Definición de los scripts de Bash</h3><!--kg-card-end: html--><p>Un script de Bash es un archivo que contiene una secuencia de comandos que son ejecutados por el programa de bash línea por línea. Ter permite realizar una serie de acciones, tales como navegar a una carpeta específica, crear una carpeta, y lanzar un proceso usando la línea de comandos.</p><p>Al guardar comandos en un script, puedes repetir la misma secuencia de pasos múltiples veces y ejecutarlos al correr el script.</p><!--kg-card-begin: html--><h3 id="ventajas-scripts-bash">6.2. Ventajas de los scripts de Bash</h3><!--kg-card-end: html--><p>La programación en Bash es una herramienta poderosa y versátil para las tareas de administración de sistemas, gestionar los recursos del sistema, y realizar otras tareas de rutinas en sistemas Unix/Linux.</p><p>Algunas ventajas de la programación de scripts son:</p><ul><li><strong>Automatización</strong>: Los scripts de Shell te permiten automatizar tareas y procesos repetitivos, ahorrando tiempo y reducir el riesgo de errores que pueden ocurrir con la ejecución manual.</li><li><strong>Portabilidad</strong>: Los scripts de Shell pueden ser ejecutados en varias plataformas y sistemas operativos, incluyendo Unix, Linux, macOS, e inclusive Windows a través del uso de emuladores o máquinas virtuales.</li><li><strong>Flexibilidad</strong>: Los scripts de Shell son bastantes personalizables y pueden ser fácilmente modificados para adaptarse a requerimientos específicos. También pueden ser combinados con otros lenguajes de programación o utilidades para crear scripts más poderosos.</li><li><strong>Accesibilidad</strong>: Los scripts de Shell son fáciles de escribir y no requieren ninguna herramienta o software especial. Pueden ser editados usando cualquier editor de texto, y la mayoría de sistemas operativos tienen un intérprete de shell incorporado.</li><li><strong>Integración</strong>: Los scripts de Shell pueden ser integrados con otras herramientas y aplicaciones, tales como bases de datos, servidores web, y servicios de la nube, permitiendo automatización más complejo y tareas de gestión de sistema.</li><li><strong>Depuración</strong>: Los scripts de Shell son fáciles de depurar, y la mayoría de los shells tienen herramientas de depuración y reporte de errores incorporados que pueden ayudar a identificar y arreglar problemas rápidamente.</li></ul><!--kg-card-begin: html--><h3 id="vista-general-shell-bash-y-cli">6.3. Vista general del Shell de Bash y la Interfaz de Línea de Comandos</h3><!--kg-card-end: html--><p>Los términos "shell" y "bash" son frecuentemente usados de forma intercambiable. Pero hay una diferencia sutil entre los dos.</p><p>El término "shell" se refiere a un programa que provee una interfaz de línea de comandos para interactuar con un sistema operativo. Bash (Bourne-Again SHell) es uno de los shell de Unix/Linux más usado comúnmente y es la shell predeterminada en muchas distribuciones de Linux.</p><p>Hasta ahora, los comandos que has estado haciendo eran básicamente ingresados en un "shell".</p><p>Aunque Bash es un tipo de shell, hay otras shells disponibles también, tales como Korn shell (ksh), C shell (csh), y Z shell (zsh). Cada shell tiene su propia sintaxis y conjunto de características, pero todos comparten el mismo propósito común de proveer una interfaz de línea de comandos para interactuar con el sistema operativo.</p><p>Puedes determinar tu tipo de shell usando el comando <code>ps</code>:</p><pre><code class="language-markdown">ps
# output:

    PID TTY          TIME CMD
  20506 pts/0    00:00:00 bash &lt;--- the shell type
  20931 pts/0    00:00:00 ps
</code></pre><p>En resumen, mientras que "shell" es un término amplio que se refiere a cualquier programa que provee una interfaz de línea de comandos, "Bash" es un tipo específico de shell que es ampliamente usado en sistemas de Unix/Linux.</p><p>Nota: En esta sección, estaremos usando el shell "bash".</p><!--kg-card-begin: html--><h3 id="como-crear-y-ejecutar-scripts-bash">6.4. Cómo crear y ejecutar scripts de Bash</h3><!--kg-card-end: html--><p><strong>Convenciones de nombramiento de Script</strong></p><p>Por convención de nombramiento, los scripts de Bash terminan con <code>.sh</code>. Sin embargo, los scripts de bash se pueden ejecutar perfectamente sin la extensión <code>sh</code>.</p><p><strong>Agregando el Shebang</strong></p><p>Los scripts de Bash comienzan con un <code>shebang</code>. El <code>shebang</code> es una combinación de <code>bash #</code> y <code>bang !</code> seguido de la ruta del shell bash. Esta es la primer línea del script. El shebang le dice al shell para ejecutarlo a través del shell bash. Shebang es simplemente una ruta absoluta al intérprete del bash.</p><p>Abajo hay un ejemplo de la declaración del shebang.</p><pre><code class="language-bash">#!/bin/bash
</code></pre><p>Puedes encontrar tu ruta del shell bash (lo cual puede variar de lo de arriba) usando el comando:</p><pre><code class="language-bash">which bash
</code></pre><p><strong>Creando tu primer script de bash</strong></p><p>Nuestro primer script muesta un mensaje al usuario que ingrese una ruta. En retorno, sus contenidos serán listados.</p><p>Crea un archivo llamado <code>run_all.sh</code> usando cualquier editor de tu preferencia.</p><pre><code class="language-bash">vim run_all.sh
</code></pre><p>Agrega los siguientes comandos en tu archivo y guárdalo:</p><pre><code class="language-bash">#!/bin/bash
echo "Hoy es " `date`

echo -e "\ningresa la ruta a la carpeta"
read the_path

echo -e "\n tu ruta tiene los siguientes archivos y carpetas: "
ls $the_path
</code></pre><p>Echemos un vistazo más profundamente al script línea por línea. Estoy mostrando el mismo script nuevamente, pero esta vez con números de líneas.</p><pre><code class="language-bash">  1 #!/bin/bash
  2 echo "Hoy es " `date`
  3
  4 echo -e "\ningresa la ruta a la carpeta"
  5 read the_path
  6
  7 echo -e "\n tu ruta tiene los siguientes archivos y carpetas: "
  8 ls $the_path
</code></pre><ul><li><strong>Línea #1</strong>: El shebang (<code>#!/bin/bash</code>) apunta a la ruta del shell bash.</li><li><strong>Línea #2</strong>: El comando <code>echo</code> muestra la fecha y el tiempo actual en la terminal. Fíjate que el <code>date</code> está en comillas invertidas.</li><li><strong>Línea #4</strong>: Queremos que el usuario ingrese una ruta válida.</li><li><strong>Línea #5</strong>: El comando <code>read</code> lee la entrada y lo almacena en la variable <code>the_path</code>.</li><li><strong>Línea #8</strong>: El comando <code>ls</code> toma la variable con la ruta almacenada y muestra los archivos y las carpetas actuales.</li></ul><p><strong>Ejecutando el script de bash</strong></p><p>Para hacer que el script sea ejecutable, asigna permisos de ejecución a tu usuario usando este comando:</p><pre><code class="language-bash">chmod u+x run_all.sh
</code></pre><p>Aquí,</p><ul><li><code>chmod</code> modifica la propiedad de un archivo para el usuario actual :<code>u</code>.</li><li><code>+x</code> agrega los derechos de ejecución al usuario actual. Esto significa que el usuario quien es el propietario ahora puede ejecutar el script.</li><li><code>run_all.sh</code> es el archivo que deseamos ejecutar.</li></ul><p>Puedes ejecutar el script usando cualquier de los métodos mencionados:</p><ul><li><code>sh run_all.sh</code></li><li><code>bash run_all.sh</code></li><li><code>./run_all.sh</code></li></ul><p>Veámoslo la ejecución en acción 🚀</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2023/03/run-script-bash-2.gif" class="kg-image" alt="Running a bash script" width="600" height="400" loading="lazy"></figure><!--kg-card-begin: html--><h3 id="basico-programacion-bash">6.5. Lo básico de la Programación en Bash</h3><!--kg-card-end: html--><h4 id="comentarios-en-la-programaci-n-de-bash">Comentarios en la programación de bash</h4><p>Los comentarios comienzan con un <code>#</code> en la programación de bash. Esto significa que cualquier línea que comience con un <code>#</code> es un comentario y será ignorado por el intérprete.</p><p>Los comentarios son muy útiles en la documentación del código, y es una buena práctica agregarlos para ayudar a otros que entiendan el código.</p><p>Estos son ejemplos de comentarios:</p><pre><code class="language-bash"># Este es un comentario de ejemplo
# Estas dos líneas serán ignorados por el intérprete
</code></pre><h4 id="variables-y-tipos-de-datos-en-bash">Variables y tipos de datos en Bash</h4><p>Las variables te permiten almacenar datos. Puedes usar variables para leer, acceder, y manipular datos en tu script.</p><p>No hay tipos de datos en Bash. En Bash, una variable es capaz de almacenar valores numéricos, caracteres individuales, o cadenas de caracteres.</p><p>En Bash, puedes usar y establecer los valores de variable en las siguientes formas:</p><ol><li>Asignar el valor directamente:</li></ol><pre><code class="language-bash">country=Netherlands
</code></pre><p>2. &nbsp;Asignar el valor basado en la salida obtenido de un programa o comando, usando substitución de comando. Fíjate que <code>$</code> es requerido para acceder al valor de una variable existente.</p><pre><code class="language-bash">same_country=$country
</code></pre><p>Esto asigna el valor de <code>country</code> a la nueva variable <code>same_country</code>.</p><p>Para acceder el valor de la variable, adjunta <code>$</code> al nombre de la variable.</p><pre><code class="language-bash">country=Netherlands
echo $country
# salida
Netherlands
new_country=$country
echo $new_country
# salida
Netherlands
</code></pre><p>Arriba, puedes ver un ejemplo de asignamiento e impresión de valores de variable.</p><h4 id="convenciones-de-nombramiento-de-variable">Convenciones de nombramiento de Variable</h4><p>En la programación de Bash, lo siguiente son convenciones de nombramiento de variable:</p><ol><li>Los nombres de variables deberían comenzar con una letra o un guión bajo (<code>_</code>).</li><li>Los nombres de variables pueden contener letras, números, y guiones bajos (<code>_</code>).</li><li>Los nombres de variables son distinguen mayúsculas y minúsculas.</li><li>Los nombres de variables no deberían contener espacios o caracteres especiales.</li><li>Una nombres descriptivos que reflejan el propósito de la variable.</li><li>Evita usar palabras claves reservadas, tales como <code>if</code>, <code>then</code>, <code>else</code>, <code>fi</code>, y así sucesivamente como nombres de variables.</li></ol><p>Aquí hay algunos ejemplos de nombres de variables válidos en Bash:</p><pre><code class="language-bash">name
count
_var
myVar
MY_VAR
</code></pre><p>Y aquí hay algunos ejemplos de nombres de variables inválidos:</p><pre><code class="language-bash"># Nombres de variables inválidos

2ndvar (nombre de variable comienza con un número)
my var (nombre de variable contiene un espacio)
my-var (nombre de variable contains un guión)
</code></pre><p>Siguiendo estas convenciones de nombramiento ayudan en hacer que los scripts de Bash sean más legibles y más fáciles de mantener.</p><h4 id="entradas-y-salidas-en-scripts-de-bash">Entradas y salidas en scripts de Bash</h4><h4 id="recopilaci-n-de-entradas">Recopilación de entradas</h4><p>En esta sección, discutiremos algunos métodos para proveer entradas a nuestros scripts.</p><ol><li>Leer las entradas de usuario y almacenarlos en una variable</li></ol><p>Podemos leer la entrada de usuario usando el comando <code>read</code>.</p><pre><code class="language-bash">#!/bin/bash
echo "What's your name?"
read entered_name
echo -e "\nWelcome to bash tutorial" $entered_name
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2023/03/name-sh.gif" class="kg-image" alt="Reading the name from a script" width="600" height="400" loading="lazy"></figure><p>2. &nbsp; Leer de un archivo</p><p>Este código lee cada línea de un archivo llamado <code>input.txt</code> y lo imprime a la terminal. Estudiaremos los bucles while más tarde en esta sección.</p><pre><code class="language-bash">while read line
do
  echo $line
done &lt; input.txt
</code></pre><p>3. &nbsp; Argumentos de línea de comandos</p><p>En un script de bash o función, <code>$1</code> denota el argumento inicial pasado, <code>$2</code> denota el segundo argumento pasado, y así sucesivamente.</p><p>Este script toma un nombre como argumento de línea de comandos e imprime un saludo personalizado.</p><pre><code class="language-bash">#!/bin/bash
echo "Hello, $1!"
</code></pre><p>Hemos suplido <code>Zaira</code> como nuestro argumento al script.</p><p><strong>Salida:</strong></p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2023/03/name-sh-1.gif" class="kg-image" alt="Providing arguments to the bash script" width="600" height="400" loading="lazy"></figure><h4 id="mostrando-la-salida-">Mostrando la salida:</h4><p>Aquí discutiremos algunos métodos para recibir salidas de los scripts.</p><ol><li>Imprimiendo a la terminal:</li></ol><pre><code class="language-bash">echo "Hello, World!"
</code></pre><p>Esto imprime el texto "Hello, World!" a la terminal.</p><p>2. &nbsp; Escribiendo a un archivo:</p><pre><code class="language-bash">echo "This is some text." &gt; output.txt
</code></pre><p>Esto escribe el teto "This is some text." a un archivo llamado <code>output.txt</code>. Fíjate que el operador <code>&gt;</code> sobreescribe un archivo si éste ya tenía algo de contenido.</p><p>3. &nbsp; Adjuntando a un file:</p><pre><code class="language-bash">echo "More text." &gt;&gt; output.txt
</code></pre><p>Esto adjunta el texto "More text." al final del archivo <code>output.txt</code>.</p><p>4. &nbsp; Redireccionando la salida:</p><pre><code class="language-bash">ls &gt; files.txt
</code></pre><p>Esto lista los archivos en la carpeta actual y escribela salida a un archivo llamado <code>files.txt</code>. Puede redireccionar la salida de cualquier comando a un archivo de esta forma.</p><p>Aprenderás sobre redirección de salida en detalle en la sección 8.5.</p><h4 id="declaraciones-condicionales-if-else-">Declaraciones condicionales (if/else)</h4><p>Las expresiones que producen un resultado booleano, sea verdadero o falso, son llamados condiciones. Hay varias formas de evaluar condiciones, incluyendo <code>if</code>, <code>if-else</code>, <code>if-elif-else</code>, y condicionales anidadas.</p><p><strong>Sintaxis</strong>:</p><pre><code class="language-bash">if [[ condition ]];
then
    statement
elif [[ condition ]]; then
    statement 
else
    do this by default
fi
</code></pre><h4 id="sintaxis-de-las-declaraciones-condicionales-de-bash">Sintaxis de las declaraciones condicionales de bash</h4><p>Podemos usar operadores lógicos tales como AND <code>-a</code> y OR <code>-o</code> para hacer comparaciones que tienen más significado.</p><pre><code class="language-bash">if [ $a -gt 60 -a $b -lt 100 ]
</code></pre><p>Esta declaración verifica si ambas condiciones son <code>true</code>: <code>a</code> es más grande que <code>60</code> Y <code>b</code> es menor que <code>100</code>.</p><p>Veamos un ejemplo de un script de Bash que usa declaraciones <code>if</code>, <code>if-else</code>, y <code>if-elif-else</code> para determinar si un número ingresado por el usuario es positivo, negativo, o cero:</p><pre><code class="language-bash">#!/bin/bash

# Script to determine if a number is positive, negative, or zero

echo "Please enter a number: "
read num

if [ $num -gt 0 ]; then
  echo "$num is positive"
elif [ $num -lt 0 ]; then
  echo "$num is negative"
else
  echo "$num is zero"
fi
</code></pre><p>El script primero muestra un mensaje al usuario para que ingrese un número. Luego, usa una declaración <code>if</code> para verificar si el número es más grande que <code>0</code>. Si lo es, el script muestra que el número es positivo. Si el número no es más grande que <code>0</code>, el script se mueve a la siguiente declaración, el cual es una declaración <code>if-elif</code>.</p><p>Aquí, el script verifica si el número es menor que <code>0</code>. Si lo es, el script muestra que el número es negativo.</p><p>Finalmente, si el número no es más grande que <code>0</code> ni menor que <code>0</code>, el script usa una declaración <code>else</code> para mostrar que el número es cero.</p><p>Viéndolo en acción 🚀</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2023/03/test-odd.gif" class="kg-image" alt="Checking if a number is even or odd" width="600" height="400" loading="lazy"></figure><h4 id="bucles-y-ramificaci-n-en-bash">Bucles y ramificación en Bash</h4><p><strong>Bucle while</strong></p><p>Los bucles while verifica una condición y un bucle hasta que la condición permanece <code>true</code>. Necesitamos proveer una declaración counter que incrementa el contador para controlar la ejecución del bucle.</p><p>En el ejemplo abajo, <code>(( i += 1 ))</code> es la declaración del counter que incrementa el valor de <code>i</code>. El bucle ejecutará exactamente 10 veces.</p><pre><code class="language-bash">#!/bin/bash
i=1
while [[ $i -le 10 ]] ; do
   echo "$i"
  (( i += 1 ))
done
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2023/03/image-187.png" class="kg-image" alt="Looping from 1 to 10 using " width="600" height="400" loading="lazy"></figure><p><strong>Bucle For</strong></p><p>El bucle <code>for</code>, así como el bucle <code>while</code>, te permite ejecutar declaraciones en un número específico de veces. Cada bucle difiere en su sintaxis y uso.</p><p>En el ejemplo de abajo, el bucle iterará 5 veces.</p><pre><code class="language-bash">#!/bin/bash

for i in {1..5}
do
    echo $i
done
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2023/03/image-186.png" class="kg-image" alt="Looping from 1 to 10 using " width="600" height="400" loading="lazy"></figure><p><strong>Declaraciones Case</strong></p><p>En Bash, las declaraciones case son usados para comparar un número dado contra una lista de patrones y ejecutar un bloque de código basado en el primer patrón que coincida. La sintaxis para una declaración case en Bash es como sigue:</p><pre><code class="language-bash">case expression in
    pattern1)
        # código para ejecutar si la expresión coincide con el patrón1
        ;;
    pattern2)
        # código para ejecutar si la expresión coincide con el patrón2
        ;;
    pattern3)
        # código para ejecutar si la expresión coincide con el patrón3
        ;;
    *)
        # código para ejecutar si ninguno de los patrones de arriba coinciden con la expresión
        ;;
esac
</code></pre><p>Aquí, "expression" es el valor que queremos comparar, y "pattern1", "pattern2", "pattern3", y así sucesivamente son los patrones con las que queremos comparar.</p><p>El doble punto y coma ";;" separa cada bloque de código para ejecutar cada patrón. El asterisco "*" representa el case por defecto, el cual se ejecuta si ninguno de los patrones especificados coinciden con la expresión.</p><p>Veamos un ejemplo:</p><pre><code class="language-bash">fruit="apple"

case $fruit in
    "apple")
        echo "This is a red fruit."
        ;;
    "banana")
        echo "This is a yellow fruit."
        ;;
    "orange")
        echo "This is an orange fruit."
        ;;
    *)
        echo "Unknown fruit."
        ;;
esac
</code></pre><p>En este ejemplo, ya que el valor de <code>fruit</code> es <code>apple</code>, el primer patrón ocincide, y el bloque de código que imprime <code>This is a red fruit.</code> se ejecuta. Si el valor de <code>fruit</code> era <code>banana</code>, el segundo patrón coincidiría y el bloque de código que imprime <code>This is a yellow fruit.</code> se ejecutaría, etcétera.</p><p>Si el valor de <code>fruit</code> no coincide con ninguno de los patrones especificados, el caso predeterminado se ejecuta, el cual imprime <code>Unknown fruit.</code>.</p><!--kg-card-begin: html--><h2 id="parte-7-manejo-paquetes-software-linux">Parte 7: Manejo de Paquetes de Software en Linux</h2><!--kg-card-end: html--><p>Linux viene con varios programas incorporados. Pero podrías necesitar instalar nuevos programas basado en tus necesidades. También podrías necesitar actualizar las aplicaciones existentes.</p><!--kg-card-begin: html--><h3 id="paquetes-y-gestion-paquetes">7.1. Paquetes y Gestión de Paquetes</h3><!--kg-card-end: html--><h4 id="-qu-es-un-paquete">¿Qué es un paquete?</h4><p>Un paquete es una colección de archivos que se empaquetan juntos. Estos archivos son esenciales para que un programa en particular se ejecute. Estos archivos contienen los archivos ejecutables del programa, librerías, y otros recursos.</p><p>Además de estos archivos requeridos para el programa para que se ejecute, los paquetes también contienen scripts de instalación, los cuales copian los archivo a donde se les necesita. Un programa podría contener muchos archivos y dependencias. Con los paquetes, es más fácil de manejar todos los archivos y dependencias de una sola vez.</p><h4 id="-cu-l-es-la-diferencia-entre-fuente-y-binario">¿Cuál es la diferencia entre fuente y binario?</h4><p>Los programadores escriben código fuente en un lenguaje de programación. Este código fuente luego se compila en código máquina el cual la computadora puede entender. El código compilado se llama código binario.</p><p>Cuando descargas un paquete, puedes obtener el <em>código fuente</em> o el <em>código binario</em>. El código fuente es el código legible para los humanos que puede ser compilado en código binario. El código binario es el código compilado que la computadora puede entender.</p><p>Los paquetes fuentes pueden ser usados con cualquier tipo de máquina si el código fuente se compila apropiadamente. El binario, por otro lado, es código compilado que es específico a un tipo particular de máquina o arquitectura.</p><p>Puedes encontrar la arquitectura de tu máquina usando el comando <code>uname -m</code>.</p><pre><code class="language-bash">uname -m
# output
x86_64
</code></pre><h4 id="dependencias-de-un-paquete">Dependencias de un paquete</h4><p>Los programas frecuentemente comparten archivos. En vez de incluir estos archivos en cada paquete, un paquete separado puede proveerlos para todos los programas.</p><p>Para instalar un programa que necesita estos archivo, también debes instalar el paquete que los contiene. Esto se llama una dependencia de paquete. Especificando las dependencias hacen a los paquetes más pequeños y más sencillo al reducir los duplicados.</p><p>Cuando instalas un programa, sus dependencias también deben ser instalados. Las dependencias más requeridas usualmente ya están instaladas, pero unos pares extas podrían ser necesarios. Así que, no te sorprendas si varios paquetes son instalados juntamente con tu paquete deseado. Estos son dependencias necesarias.</p><h4 id="gestores-de-paquetes">Gestores de Paquetes</h4><p>Linux ofrece un sistema comprensivo de gestión de paquetes para instalar, actualizar, configurar, y quitar software.</p><p>Con un gestor de paquetes, puedes obtener acceso a una base organizada de miles de paquetes de software juntamente teniendo la habilidad de resolver dependencias y verificar actualizaciones de software.</p><p>Los paquetes pueden ser manejados usando utilidades de línea de comando que pueden ser fácilmente automatizados por los administradores de sistema, o a través de una interfaz gráfica.</p><h4 id="canales-repositorios-de-software">Canales/Repositorios de Software</h4><p>⚠️ La gestión de paquetes es distinto para diferentes distros. Aquí, estamos usando Ubuntu.</p><p>Instalando software es un poco distinto en Linux comparado a Windows y Mac.</p><p>Linux usa repositorios para almacenar paquetes de software. Un repositorio es una colección de paquetes de software que están disponibles para instalación a través de un gestor de paquetes.</p><p>Un gestor de paquetes también almacena un índice de todos los paquetes disponibles de un repo. A veces el índice se reconstruye para asegurarse que está al día y para saber qué paquetes han sido actualizados o agregados al canal desde la última vez que fue verificado.</p><p>El proceso genérico de descargar software de un repo se parece algo así:</p><figure class="kg-card kg-image-card"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1719313472889/f4961606-b9c4-4ed7-8edc-61e0fc6908e4.png" class="kg-image" alt="Rrocess of downloading software from a remote repo" width="1080" height="1080" loading="lazy"></figure><p>Si hablamos específicamente sobre Ubuntu,</p><ol><li>El índice se busca usando <code>apt update.</code> (<code>apt</code> se explica en la próxima sección).</li><li>Los archivos/dependencias requeridas se solicitan según el índice usando <code>apt install</code></li><li>Los paquetes y las dependencias se instalan de manera local.</li><li>Actualiza las dependencias y los paquetes cuando se requiere usando <code>apt update</code> y <code>apt upgrade</code></li></ol><p>En distros basados en Debian, puedes encontrar la lista de repos (repositorios) en &nbsp;<code>/etc/apt/sources.list</code>.</p><!--kg-card-begin: html--><h3 id="instalando-paquete-a-traves-cli">7.2. Instalando un paquete a través de la Línea de Comandos</h3><!--kg-card-end: html--><p>El comando <code>apt</code> es una herramienta de línea de comando poderosa, la cual es parte de Ubuntu y significa "Herramienta de Empaquetamiento Avanzado" ("Advanced Packaging Toll - APT").</p><p><code>apt</code>, junto con los comandos que se empaquetan, provee los medios para instalar nuevos paquetes de software, actualizar paquetes de software existentes, actualizar el índice de lista de paquetes, e inclusive actualizar el sistema de Ubuntu completo.</p><p>Para ver los archivos log de la instalación usando <code>apt</code>, puedes ver el archivo <code>/var/log/dpkg.log</code>.</p><p>Lo siguiente son los usos del comando <code>apt</code>:</p><h4 id="instalando-paquetes">Instalando paquetes</h4><p>Por ejemplo, para instalar el paquete <code>htop</code>, puedes usar el siguiente comando:</p><pre><code class="language-bash">sudo apt install htop
</code></pre><h4 id="actualizando-el-ndice-de-la-lista-de-paquetes">Actualizando el índice de la lista de paquetes</h4><p>El índice de lista de paquetes es una lista de todos los paquetes disponibles en los repositorios. Para actualizar el índice de la lista de paquetes local, puedes usar el siguiente comando:</p><pre><code class="language-bash">sudo apt update
</code></pre><h4 id="actualizando-los-paquetes">Actualizando los paquetes</h4><p>Los paquetes instalados en tu sistema puede obtener actualizaciones que contienen correcciones de errores, parches de seguridad, y nuevas características.</p><p>Para actualizar los paquetes, puedes usar el siguiente comando:</p><pre><code class="language-bash">sudo apt upgrade
</code></pre><h4 id="quitando-los-paquetes">Quitando los paquetes</h4><p>Para quitar un paquete, como <code>htop</code>, puedes usar el siguiente comando:</p><pre><code class="language-bash">sudo apt remove htop
</code></pre><!--kg-card-begin: html--><h3 id="instalando-paquete-a-traves-gui-synaptic">7.3. Instalando un paquete a través de un Método Gráfico Avanzado – Synaptic</h3><!--kg-card-end: html--><p>Si no estás cómodo con la línea de comando, puedes usar una aplicación GUI para instalar paquetes. Puedes alcanzar los mismos resultado como con la línea de comandos, pero con una interfaz gráfica.</p><p>Synaptic es una aplicación GUI de gestión de paquetes que ayuda en lista los paquetes instalados, su estado, actualizaciones pendientes, y así sucesivamente. Ofrece filtros personalizables para ayudarte en reducir los resultados de búsqueda.</p><figure class="kg-card kg-image-card"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1719313599636/0f362ed7-c371-4a58-96c2-c359178cdbd9.png" class="kg-image" alt="0f362ed7-c371-4a58-96c2-c359178cdbd9" width="1356" height="868" loading="lazy"></figure><p>También puedes hacer clic derecho en un paquete y ver más detalles como las dependencias, el mantenedor, y los archivos instalados.</p><figure class="kg-card kg-image-card"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1719313607397/33b7ad76-2492-4805-8133-35c8cd3c4a0a.png" class="kg-image" alt="View a package's detail" width="560" height="634" loading="lazy"></figure><!--kg-card-begin: html--><h3 id="instalando-paquetes-descargados">7.4. Instalando paquetes descargados de un sitio web</h3><!--kg-card-end: html--><p>Podrías querer instalar un paquete que has descargado de un sitio web, en vez de un repositorio de software. Estos paquetes se llaman archivos <code>.deb</code>.</p><p><strong>Usando <code>dpkg</code> para instalar paquetes</strong>: &nbsp;<code>dpkg</code> es una herramienta de línea de comando que se usa para instalar paquetes. Para instalar un paquete con <strong>dpkg</strong>, abre la Terminal y escribe lo siguiente:</p><pre><code class="language-bash">cd directory
sudo dpkg -i package_name.deb
</code></pre><p>Nota: Reemplazar "directory" con la carptea donde el paquete se almacena y "package_name" con el nombre del archivo del paquete.</p><p>De forma alternativa, puedes hacer clic derecho, selecciona "Open With Other Application", y elige una app GUI de tu gusto.</p><figure class="kg-card kg-image-card"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1719322161581/f16d83ac-ca9a-4502-a80c-e6a25dee5c68.png" class="kg-image" alt="Installing a software using an app" width="534" height="505" loading="lazy"></figure><p>💡 <strong>Consejo:</strong> En Ubuntu, puedes ver una lista de paquetes instalados con <code>dpkg --list</code>.</p><!--kg-card-begin: html--><h2 id="parte-8-temas-linux-avanzados">Parte 8: Temas de Linux Avanzados</h2><!--kg-card-end: html--><!--kg-card-begin: html--><h3 id="gestion-del-usuario">8.1. Gestión de Usuario</h3><!--kg-card-end: html--><p>Pueden haber múltiples usuario con niveles variantes de acceso en un sistema. En Linux, el usuario root tiene el nivel más alto de acceso y puede realizar cualquier operación en el sistema. Los usuarios regulares tienen acceso limitado y solamente puede realizar operaciones de las que se les ha dado permiso para hacer.</p><h4 id="-qu-es-un-usuario">¿Qué es un usuario?</h4><p>Una cuenta de usuario provee separación entre distintas personas y programas que pueden ejecutar comandos.</p><p>Los humanos identifican a los usuarios por nombre, ya que los nombres son fáciles con los que trabajar. Pero el sistema identifica a los usuarios por un número único llamado el ID de usuario (UID).</p><p>Cuando los usuarios humano inician sesión usando el nombre de usuario provisto, tienen que usar una contraseña para autorizarse a ellos mismos.</p><p>Las cuentas de usuario forman los fundamentos de la seguridad del sistema. La propiedad de archivo también está asociado con las cuentas de usuario y refuerza el control de acceso a los archivos. Cada proceso tiene una cuenta de usuario asociado que provee una capa de control para los administradores.</p><p>Hay tres tipos principales de cuentas de usuario:</p><ol><li><strong>Superusuario</strong>: El superusuario tiene acceso completo al sistema. El nombre del superusuario es <code>root</code>. Tiene un <code>UID</code> de 0.</li><li><strong>Usuario de sistema</strong>: El usuario de sistema tiene cuentas de usuario que se usan para ejecutar servicios de sistema. Estas cuentas se usan para ejecutar servicios de sistema y no están destinados para la interacción humana.</li><li><strong>Usuario regular</strong>: Los usuarios regulares son usuarios humanos que tienen acceso al sistema.</li></ol><p>El comando <code>id</code> muestra el ID de usuario y el ID de grupo del usuario actual.</p><pre><code class="language-bash">id
uid=1000(john) gid=1000(john) groups=1000(john),4(adm),24(cdrom),27(sudo),30(dip)... output truncated
</code></pre><p>Para ver las información básica de otro usuario, pasa el nombre de usuario como argumento al comando <code>id</code>.</p><pre><code class="language-bash">id username
</code></pre><p>Para ver la información relacionado al usuario para los procesos, usa el comando <code>ps</code> con el argumento <code>-u</code>.</p><pre><code class="language-bash">ps -u
# Salida
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1  16968  3920 ?        Ss   18:45   0:00 /sbin/init splash
root         2  0.0  0.0      0     0 ?        S    18:45   0:00 [kthreadd]
</code></pre><p>Por defecto, los sistemas usan el archivo <code>/etc/passwd</code> para almacenar información de usuario.</p><p>Aquí hay una línea del archivo <code>/etc/passwd</code>:</p><pre><code class="language-bash">root:x:0:0:root:/root:/bin/bash
</code></pre><p>El archivo <code>/etc/passwd</code> contiene la siguiente información sobre cada usuario:</p><ol><li>Nombre de usuario: <code>root</code> – El nombre de usuario de la cuenta de usuario.</li><li>Contraseña: <code>x</code> – La contraseña en formato encriptado para la cuenta de usuario que se almacena en el archivo <code>/etc/shadow</code> por razones de seguridad.</li><li>ID de Usuario (UID): <code>0</code> – El identificador numérico único para la cuenta de usuario.</li><li>ID de Grupo (GID): <code>0</code> – El identificador del grupo primario para la cuenta de usuario.</li><li>Información de Usuario: <code>root</code> – El nombre real para la cuenta de usuario.</li><li>Carpeta Home: <code>/root</code> – The home directory for the user account.</li><li>Shell: <code>/bin/bash</code> – El shell predeterminado para la cuenta de usuario. Un usuario de sistema podría usar <code>/sbin/nologin</code> si los inicios de sesión interactivos no están permitidos para ese usuario.</li></ol><h4 id="-qu-es-un-grupo">¿Qué es un grupo?</h4><p>Un grupo es una colección de cuentas de usuario que comparten acceso compartido y recursos. Los grupos tienen nombres de grupo para identificarlos. El sistema identifica a los grupos por un número único llamado el ID del Grupo (GID).</p><p>Por defecto, la información sobre los grupos se almacenan en el archivo <code>/etc/group</code>.</p><p>Aquí hay una entrada del archivo <code>/etc/group</code>:</p><pre><code class="language-bash">adm:x:4:syslog,john
</code></pre><p>Aquí está el desglose de los campos en la entrada dada:</p><ol><li>Nombre de Grupo: <code>adm</code> – El nombre del grupo.</li><li>Contraseña: <code>x</code> – La contraseña para el grupo se almacena en el archivo <code>/etc/gshadow</code> por razones de seguridad. La contraseña es opcional y aparece vacío si no se pone una.</li><li>ID del Grupo (GID): <code>4</code> – El identificador numérico único para el grupo.</li><li>Miembros del Grupo: <code>syslog,john</code> – La lista de nombres de usuario que son miembros del grupo. En este caso, el grupo <code>adm</code> tiene dos miembros: <code>syslog</code> y <code>john</code>.</li></ol><p>En esta entrada específica, el nombre del grupo es <code>adm</code>, el ID del grupo es <code>4</code>, y el grupo tiene dos miembros: <code>syslog</code> y <code>john</code>. El campo contraseña es normalmente puesto a <code>x</code> para indicar que la contraseña del grupo se almacena en el archivo <code>/etc/gshadow</code>.</p><p>Los grupos están divididos en grupos '<em>primario</em>' y '<em>suplementario</em>'.</p><ul><li>Grupo primario: Cada usuario es asignado un grupo primario por defecto. Este grupo usualmente tiene el mismo nombre como el usuario y se crea cuando la cuenta de usuario se crea. Los archivos y las carpetas creadas por el usuario son normalmente propiedad de este grupo primario.</li><li>Grupos Suplementarios: Estos son grupos extras a los que un usuario puede pertenecer además de su grupo primario. Los usuarios pueden ser miembros de múltiples grupos suplementarios. Estos grupos permiten a usuario que tenga permisos para los recursos compartidos entre esos grupos. Ayudan a proveer acceso a recursos compartidos sin afectar los permisos del archivo de sistema y manteniendo la seguridad intacta. Mientras que usuario debe pertenecer a un grupo primario, pertenecer a grupos suplementarios is opcional.</li></ul><h4 id="control-de-acceso-encontrar-y-entender-permisos-de-archivo">Control de acceso: encontrar y entender permisos de archivo</h4><p>La propiedad de archivo puede ser visto usando el comando <code>ls -l</code>. La primera columna en la salida del comando <code>ls -l</code> muestra los permisos del archivo. Otras columnas muestra al propietario del archivo y el grupo al que el archivo pertenece.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/04/image-146.png" class="kg-image" alt="Detailed output of ls -l" width="600" height="400" loading="lazy"></figure><p>Echemos un vistazo más cercano en la columna <code>mode</code>:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/04/image-147.png" class="kg-image" alt="Permission classes and file types" width="600" height="400" loading="lazy"></figure><p><strong>Mode</strong> define dos cosas:</p><ul><li><strong>Tipo de archivo:</strong> El tipo de archivo define el tipo de archivo. Para archivos regulares que contienen un dato simple está en blanco <code>-</code>. Para otros tipos de archivos especiales el símbolo es distinto. Para una carpeta el cual es un archivo especial, es <code>d</code>. Los archivos especiales son tratados de forma diferente por el SO.</li><li><strong>Clases de Permiso:</strong> El próximo conjunto de caracteres define los permisos para el usuario, el grupo y para otros respectivamente..– <strong>User</strong>: Este es el propietario de un archivo y el propietario del archivo pertenece a esta clase.– <strong>Group</strong>: Los miembros del grupo del archivo pertenecen a esta clase– <strong>Other</strong>: Cualquier usuario que no son parte de las clases del usuario o del grupo pertenecen a esta clase.</li></ul><p>💡<strong>Consejo:</strong> La propiedad de la carpeta se puede ver usando el comando <code>ls -ld</code>.</p><h5 id="c-mo-leer-permisos-simb-licos-o-los-permisos-de-rwx">Cómo leer permisos simbólicos o los permisos de <code>rwx</code></h5><p>La representación de <code>rwx</code> es conocido como la representación Simbólca de los permisos. En el conjunto de permisos,</p><ul><li><code>r</code> significa <strong>read (leer)</strong>. Se indica en el primer caracter de la tríada.</li><li><code>w</code> significa <strong>write (escribir)</strong>. Se indica en el segundo caracter de la tríada.</li><li><code>x</code> significa <strong>execution (ejecución)</strong>. Se indica en el tercer caracter de la tríada.</li></ul><p><strong>Leer:</strong></p><p>Para archivos regulares, los permisos de lectura permiten al archivo que se abra y sea leído solamente. Los usuarios no pueden modificar el archivo.</p><p>De forma similar para las carpetas, los permisos de lectura permiten el listado del contenido de la carpeta sin ninguna modificación en la carpeta.</p><p><strong>Escribir:</strong></p><p>Cuando los archivos tienen permisos, el usuario puede modificar (editar, eliminar) el archivo y guardarlo.</p><p>Para las carpetas, los permisos de escritura permiten a un usuario a modificar su contenido (crear, eliminar, y renombrar los archivos que contiene), y modificar el contenido de los archivos de los que el usuario tiene permiso.</p><p><strong>Ejemplos de permisos en Linux</strong></p><p>Ahora que sabemos cómo leer permisos, veamos algunos ejemplos.</p><p><code>-rwx------</code>: Un archivo que es accesible y ejecutable solamente por su propietario.</p><p><code>-rw-rw-r--</code>: Un archivo que está abierto a modificaciones por su propietario y su grupo pero no por otros.</p><p><code>drwxrwx---</code>: Una carpeta que puede ser modificado por su propietario y su grupo.</p><p><strong>Ejecutar:</strong></p><p>Para los archivos, los permisos de ejecución permiten al usuario ejecutar un script ejecutable. Para las carpetas, el usuario los puede acceder, y acceder a detalles sobre los archivos en la carpeta.</p><h5 id="c-mo-cambiar-los-permisos-de-archivo-y-propiedad-en-linux-usando-chmod-y-chown">Cómo cambiar los permisos de archivo y propiedad en Linux usando <code>chmod</code> y <code>chown</code></h5><p>Ahora que sabemos las bases de propiedad y permisos, veamos cómo podemos modificar los permisos usando el comando <code>chmod</code>.</p><p><strong>Sintaxis de</strong> <code>chmod</code>:</p><pre><code class="language-bash">chmod permissions filename
</code></pre><p>Donde,</p><ul><li><code>permissions</code> puede ser leído, escrito, ejecutado o una combinación de ellos.</li><li><code>filename</code> es el nombre del archivo para los cuales los permisos necesitan para cambiar. Este parámetro también puede ser una lista &nbsp;de archivos para cambiar permisos en masa.</li></ul><p>Podemos cambiar los permisos usando dos modos:</p><ol><li><strong>Modo simbólico</strong>: este método usa símbolos como <code>u</code>, <code>g</code>, <code>o</code> para representar a los usuarios, a los grupos, y a los otros. Los permisos son representados como <code>r, w, x</code> para lectura, escritura, y ejecución, respectivamente. Puedes modificar los permisos usando +, - y =.</li><li><strong>Modo absoluto</strong>: este método representa los permisos como números octales de 3 dígitos que van desde 0-7.</li></ol><p>Ahora, veámoslos en detalle.</p><h5 id="c-mo-cambiar-los-permisos-usando-el-modo-simb-lico">Cómo cambiar los permisos usando el Modo Simbólico</h5><p>La tabla de abajo resume la representación del usuario:</p><!--kg-card-begin: html--><table>
<thead>
<tr>
<th><strong>REPRESENTACION DEL USUARIO</strong></th>
<th><strong>DESCRIPCION</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>u</td>
<td>usuario/propietario</td>
</tr>
<tr>
<td>g</td>
<td>grupo</td>
</tr>
<tr>
<td>o</td>
<td>otro</td>
</tr>
</tbody>
</table><!--kg-card-end: html--><p>Podemos usar operadores matemáticos para agregar, quitar, y asignar permisos. La tabla de abajo muestra el resumen:</p><!--kg-card-begin: html--><table>
<thead>
<tr>
<th><strong>OPERADOR</strong></th>
<th><strong>DESCRIPCION</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>+</td>
<td>Agrega un permiso a un archivo o carpeta</td>
</tr>
<tr>
<td>–</td>
<td>Quita el permiso</td>
</tr>
<tr>
<td>=</td>
<td>Establece el permiso si no estaba presente antes. También sobreescribe los permisos si se pusieron anteriormente.</td>
</tr>
</tbody>
</table><!--kg-card-end: html--><p><strong>Ejemplo:</strong></p><p>Supongamos que tengo un script y quiero hacerlo ejecutable para el propietario del archivo <code>zaira</code>.</p><p>Los permisos de archivos actuales son como sigue:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/04/image-161.png" class="kg-image" alt="image-161" width="600" height="400" loading="lazy"></figure><p>Dividamos los permisos así:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/04/image-160.png" class="kg-image" alt="Splitting file permissions" width="600" height="400" loading="lazy"></figure><p>Para agregar los derechos de ejecución (<code>x</code>) al propietario (<code>u</code>) usando el modo simbólico, podemos usar el comando de abajo:</p><pre><code class="language-bash">chmod u+x mymotd.sh
</code></pre><p><strong>Salida:</strong></p><p>Ahora, podemos ver que los permisos de ejecución han sido agregados al propietario <code>zaira</code>.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/04/image-162.png" class="kg-image" alt="Permission updated" width="600" height="400" loading="lazy"></figure><p><strong>Ejemplos adicionales para cambiar los permisos a través del método simbólico:</strong></p><ul><li>Quitar los permisos de <code>read</code> y <code>write</code> para <code>group</code> y <code>others</code>: <code>chmod go-rw</code>.</li><li>Quitar los permisos de <code>read</code> para <code>others</code>: <code>chmod o-r</code>.</li><li>Asignando los permisos de <code>write</code> a <code>group</code> y sobreescribir el permiso existente: <code>chmod g=w</code>.</li></ul><h5 id="c-mo-cambiar-los-permisos-usando-el-modo-absoluto">Cómo cambiar los permisos usando el Modo Absoluto</h5><p>El modo absoluto usa los números para representar los permisos y operadores matemáticos para modificarlos.</p><p>La tabla de abajo muestra cómo podemos asignar permisos relevantes:</p><!--kg-card-begin: html--><table>
<thead>
<tr>
<th><strong>PERMISO</strong></th>
<th><strong>PROVEER PERMISO</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>lectura</td>
<td>add 4</td>
</tr>
<tr>
<td>escritura</td>
<td>add 2</td>
</tr>
<tr>
<td>ejecución</td>
<td>add 1</td>
</tr>
</tbody>
</table><!--kg-card-end: html--><p>Los permisos pueden ser revocados usando la resta. La tabla de abajo muestra cómo quitar los permisos relevantes.</p><!--kg-card-begin: html--><table>
<thead>
<tr>
<th><strong>PERMISO</strong></th>
<th><strong>QUITAR PERMISO</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>lectura</td>
<td>subtract 4</td>
</tr>
<tr>
<td>escritura</td>
<td>subtract 2</td>
</tr>
<tr>
<td>ejecución</td>
<td>subtract 1</td>
</tr>
</tbody>
</table><!--kg-card-end: html--><p><strong>Ejemplo</strong>:</p><ul><li>Poner <code>read</code> (agregar 4) para <code>user</code>, <code>read</code> (agregar 4) y <code>execute</code> (agregar 1) para el grupo, y solamente <code>execute</code> (agregar 1) para los demás.</li></ul><pre><code>chmod 451 file-name
</code></pre><p>Así es como ejecutamos el cálculo:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/04/image-163.png" class="kg-image" alt="Calculation breakdown for adding permissions" width="600" height="400" loading="lazy"></figure><p>Fíjate que esto es lo mismo que <code>r--r-x--x</code>.</p><ul><li>Quitar derechos de <code>execution</code> desde <code>other</code> y <code>group</code>.</li></ul><p>Para quitar la ejecución de <code>other</code> y <code>group</code>, resta 1 de la parte de ejecución de los 2 últimos octatos.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/04/image-164.png" class="kg-image" alt="Calculation breakdown for removing permissions" width="600" height="400" loading="lazy"></figure><ul><li>Asigna <code>read</code>, <code>write</code> y <code>execute</code> a <code>user</code>, <code>read</code> y <code>execute</code> a <code>group</code> y solamente <code>read</code> a los demás.</li></ul><p>Esto debería ser lo mismo que <code>rwxr-xr--</code>.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/04/image-165.png" class="kg-image" alt="Calculation breakdown for adding permissions" width="600" height="400" loading="lazy"></figure><h5 id="c-mo-cambiar-la-propiedad-usando-el-comando-chown">Cómo cambiar la Propiedad usando el comando <code>chown</code></h5><p>Luego, aprenderemos cómo cambiar la propiedad de un archivo. Puedes cambiar la propiedad de un archivo o carpeta usando el comando <code>chown</code>. En algunos casos, cambiar la propiedad requiere permisos <code>sudo</code>.</p><p>Sintaxis de <code>chown</code>:</p><pre><code class="language-bash">chown user filename
</code></pre><h5 id="c-mo-cambiar-la-propiedad-de-usuario-con-chown">Cómo cambiar la propiedad de usuario con <code>chown</code></h5><p>Vamos a transferir la propiedad del usuario <code>zaira</code> al usuario <code>news</code>.</p><pre><code>chown news mymotd.sh
</code></pre><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/04/image-167.png" class="kg-image" alt="view current owner" width="600" height="400" loading="lazy"></figure><p>El comando para cambiar la propiedad: <code>sudo chown news mymotd.sh</code>.</p><p><strong>Salida:</strong></p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/04/image-168.png" class="kg-image" alt="Ownership changed" width="600" height="400" loading="lazy"></figure><h5 id="c-mo-cambiar-la-propiedad-del-usuario-y-del-grupo-simult-neamente">Cómo cambiar la propiedad del usuario y del grupo simultáneamente</h5><p>También podemos usar <code>chown</code> para cambiar el usuario y el grupo simultáneamente.</p><pre><code class="language-bash">chown user:group filename
</code></pre><h5 id="c-mo-cambiar-la-propiedad-de-carpeta">Cómo cambiar la propiedad de carpeta</h5><p>Puedes cambiar la propiedad recursivamente para los contenidos en una carpeta. El ejemplo de abajo cambia la propiedad de la carpeta <code>/opt/script</code> para permitir al usuario ser <code>admin</code>.</p><pre><code class="language-bash">chown -R admin /opt/script
</code></pre><h5 id="c-mo-cambiar-la-propiedad-de-grupo">Cómo cambiar la propiedad de grupo</h5><p>En caso que solo necesitemos cambiar el propietario del grupo, podemos usar <code>chown</code> al predecir el nombre de grupo con un dos puntos <code>:</code>.</p><pre><code class="language-bash">chown :admins /opt/script
</code></pre><h5 id="c-mo-cambiar-entre-usuarios">Cómo cambiar entre usuarios</h5><p>Podemos cambiar entre usuarios usando el comando <code>su</code>.</p><pre><code class="language-bash">[user01@host ~]$ su user02
Password:
[user02@host ~]$
</code></pre><h5 id="c-mo-ganar-acceso-de-superusuario">Cómo ganar acceso de superusuario</h5><p>El super usuario o el usuario root tiene el nivel de acceso másalto en un sistema Linux. El usuario root puede realizar cualquier operación en el sistema. El usuario root puede acceder a todos los archivos y carpetas, instalar y quitar software, y modificar o sobreescribir configuraciones de sistema.</p><p>Un gran poder conlleva una gran responsabilidad. Si el usuario root está comprometido, alguien puede ganar control completo sobre el sistema. Es aconsejable usar las cuentas de usuario root solamente cuando sea necesario.</p><p>Si omites el nombre de usuario, el comando <code>su</code> cambia a la cuenta de usuario root por defecto.</p><pre><code class="language-bash">[user01@host ~]$ su
Password:
[root@host ~]#
</code></pre><p>Otra variante del comando <code>su</code> es <code>su -</code>. El comando <code>su</code> cambia a la cuenta de usuario root pero no cambia las variables de entorno. El comando <code>su -</code> cambia a la cuenta de usuario root y cambia las variables de entorno a los del usuario objetivo.</p><h5 id="ejecutar-comandos-con-sudo">Ejecutar comandos con sudo</h5><p>Para ejecutar comandos como el usuario <code>root</code> sin cambiar a la cuenta de usuario <code>root</code>, puedes usar el comando <code>sudo</code>. El comando <code>sudo</code> te permite ejecutar comandos con privilegios elevados.</p><p>Ejecutar comandos con <code>sudo</code> es una opción más segura que ejecutar los comandos como usuario <code>root</code>. Esto es porque, solamente un conjunto específico de usuarios se les da el permiso de ejecutar comandos con <code>sudo</code>. Esto se define en el archivo <code>/etc/sudoers</code>.</p><p>También, <code>sudo</code> muestra en un archivo log todos los comandos con los que ejecuto, proveyendo una pista de auditoría de quién ejecutó qué comando y cuándo.</p><p>En Ubuntu, puedes encontrar los archivos log de auditoría aquí:</p><pre><code class="language-bash">cat /var/log/auth.log | grep sudo
</code></pre><p>Para un usuario que no tiene acceso a <code>sudo</code>, se marca en los registros y muestra un mensaje así:</p><pre><code class="language-bash">user01 is not in the sudoers file.  This incident will be reported.
</code></pre><h4 id="manejar-cuentas-de-usuario-locales">Manejar cuentas de usuario locales</h4><h5 id="crear-usuarios-desde-la-l-nea-de-comandos">Crear usuarios desde la línea de comandos</h5><p>El comando usado para agregar un nuevo usuario es:</p><pre><code class="language-bash">sudo useradd username
</code></pre><p>Este comando configura un directorio home del usuario y crea un grupo privado designado por el nombre de usuario del usuario. Actualmente, a la cuenta le falta una contraseña válida, previniendo al usuario de iniciar sesión hasta que una contraseña se cree.</p><h5 id="modificar-los-usuarios-existentes">Modificar los usuarios existentes</h5><p>El comando <code>usermod</code> se usa para modificar usuarios existentes. Aquí hay algunas de las opciones comunes usados con el comando <code>usermod</code>:</p><p>Aquí algunos de los ejemplos del comando <code>usermod</code> en Linux:</p><p><strong>Cambiar un nombre de inicio de sesión del usuario:</strong></p><pre><code class="language-bash"> sudo usermod -l newusername oldusername
</code></pre><p><strong>Cambiar una carpeta de inicio del usuario:</strong></p><pre><code class="language-bash"> sudo usermod -d /new/home/directory -m username
</code></pre><p><strong>Agregar un usuario a un grupo suplementario:</strong></p><pre><code class="language-bash"> sudo usermod -aG groupname username
</code></pre><p><strong>Cambiar un shell del usuario:</strong></p><pre><code class="language-bash"> sudo usermod -s /bin/bash username
</code></pre><p><strong>Bloquear una cuenta de usuario:</strong></p><pre><code class="language-bash"> sudo usermod -L username
</code></pre><p><strong>Desbloquear una cuenta de usuario:</strong></p><pre><code class="language-bash"> sudo usermod -U username
</code></pre><p><strong>Establecer una fecha de vencimiento para una cuenta de usuario:</strong></p><pre><code class="language-bash"> sudo usermod -e YYYY-MM-DD username
</code></pre><p><strong>Cambiar el ID del usuario (UID):</strong></p><pre><code class="language-bash"> sudo usermod -u newUID username
</code></pre><p><strong>Cambiar el grupo primario del usuario:</strong></p><pre><code class="language-bash"> sudo usermod -g newgroup username
</code></pre><p><strong>Quitar un usuario de un grupo suplementario:</strong></p><pre><code class="language-bash">sudo gpasswd -d username groupname
</code></pre><h5 id="eliminar-usuarios">Eliminar usuarios</h5><p>El comando <code>userdel</code> se usa para eliminar una cuenta de usuario y archivos relacionados desde el sistema.</p><ul><li><code>sudo userdel username</code>: quita los detalles del usuario desde <code>/etc/passwd</code> pero mantiene la carpeta de inicio del usuario.</li><li>El comando <code>sudo userdel -r username</code> quita los detalles del usuario desde <code>/etc/passwd</code> y también elimina la carpeta de inicio del usuario.</li></ul><h5 id="cambiar-las-contrase-as-de-usuario">Cambiar las contraseñas de usuario</h5><p>El comando <code>passwd</code> se usa para cambiar la contraseña de usuario.</p><ul><li><code>sudo passwd username</code>: pone la contraseña inicial o cambia la contraseña existente de nombre de usuario. También se usa para cambiar la contraseña del usuario actual que inició sesión.</li></ul><!--kg-card-begin: html--><h3 id="conectandose-sevidores-remotos-a-traves-ssh">8.2 Conectándose a Servidores Remotos a través de SSH</h3><!--kg-card-end: html--><p>Accediendo a los servidores remotos es una de las tareas esenciales para administradores de sistema. Puedes conectarte a distintos servidores o acceder a bases de datos a través de tu máquina local y ejecutar comandos, todos usando SSH.</p><p><strong>¿Qué es el protocol SSH?</strong></p><p>SSH significa Shell Seguro (Secure Shell). Es un protocolo de red criptográfico que permite la comunicación segura entre dos sistemas.</p><p>El puerto predeterminado para SSH es <code>22</code>.</p><p>Los dos participantes mientras se comunican a través de SSH son:</p><ul><li>El servidor: la máquina a la que quieres acceder.</li><li>El cliente: El sistema desde el que estás accediendo al servidor.</li></ul><p>La conexión a un servidor sigue estos pasos:</p><ol><li>Iniciar una Conexión: El cliente envía una petición de conexión al servidor.</li><li>Intercambio de Claves: El servidor envía su clave pública al cliente. Ambos se ponen de acuerdo en el método de encripción a usar.</li><li>Generación de Clave de Sesión: El cliente y el servidor usan el intercambio de claves Diffie-Hellman para crear una clave de sesión compartida.</li><li>Autenticación de Cliente: El Cliente inicia sesión en el servidor usando una contraseña, clave privada, u otro método.</li><li>Comunicación Segura: Después de la autenticación, el cliente y el servidor se comunican de forma segura con encriptación.</li></ol><p><strong>¿Cómo conectarse a un servidor remoto usando SSH?</strong></p><p>El comando <code>ssh</code> es una utilidad incorporada en Linux y también el predeterminado. Hace que el acceso a los servidores bastante fácil y seguro.</p><p>Aquí, estamos hablando sobre cómo el cliente haría una conexión al servidor.</p><p>Antes de conectarse a un servidor, necesitas tener la siguiente información:</p><ul><li>La dirección IP o el nombre de dominio del servidor.</li><li>El nombre de usuario y contraseña del servidor.</li><li>El número de puerto del que tienes acceso en el servidor.</li></ul><p>La sintaxis básica del comando <code>ssh</code> es:</p><pre><code class="language-bash">ssh username@server_ip
</code></pre><p>Por ejemplo, si tu nombre de usuario es <code>john</code> y la IP del servidor es <code>192.168.1.10</code>, el comando sería:</p><pre><code class="language-bash">ssh john@192.168.1.10
</code></pre><p>Después de eso, se te mostrará un mensaje para que ingreses la contraseña secreta. Tu pantalla se verá similar a esto:</p><pre><code class="language-bash">john@192.168.1.10's password: 
Welcome to Ubuntu 20.04.2 LTS (GNU/Linux 5.4.0-70-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  System information as of Fri Jun  5 10:17:32 UTC 2024

  System load:  0.08               Processes:           122
  Usage of /:   12.3% of 19.56GB   Users logged in:     1
  Memory usage: 53%                IP address for eth0: 192.168.1.10
  Swap usage:   0%

Last login: Fri Jun  5 09:34:56 2024 from 192.168.1.2
john@hostname:~$ # start entering commands
</code></pre><p>Ahora puedes ejecutar los comandos relevantes en el servidor <code>192.168.1.10</code>.</p><p>⚠️ El puerto predeterminado para ssh es <code>22</code> pero también es vulnerable, ya que los hackers probablemente intentarán aquí primero. Tu servidor puede exponer otro puerto y compartir el acceso contigo. Para conectarse a un puerto distinto, usa el argumento <code>-p</code>.</p><pre><code class="language-bash">ssh -p port_number username@server_ip
</code></pre><!--kg-card-begin: html--><h3 id="analisis-sintactico-y-analisis-log-avanzado">8.3. Análisis Sintáctico y Análisis de Archivos Log Avanzado</h3><!--kg-card-end: html--><p>Los archivos log, cuando se configuren, son generados por tu sistema por una variedad de razones. Pueden ser usado para rastrear eventos de sistema, monitorear el rendimiento del sistema, y solventar problemas. Son útiles especialmente para los administradores de sistema cuando pueden rastrear errores de aplicación, eventos de red, y actividad de usuario.</p><p>Aquí hay un ejemplo de un archivo log:</p><pre><code class="language-bash"># ejemplo de un archivo log
2024-04-25 09:00:00 INFO Startup: Application starting
2024-04-25 09:01:00 INFO Config: Configuration loaded successfully
2024-04-25 09:02:00 DEBUG Database: Database connection established
2024-04-25 09:03:00 INFO User: New user registered (UserID: 1001)
2024-04-25 09:04:00 WARN Security: Attempted login with incorrect credentials (UserID: 1001)
2024-04-25 09:05:00 ERROR Network: Network timeout on request (ReqID: 456)
2024-04-25 09:06:00 INFO Email: Notification email sent (UserID: 1001)
2024-04-25 09:07:00 DEBUG API: API call with response time over threshold (Duration: 350ms)
2024-04-25 09:08:00 INFO Session: User session ended (UserID: 1001)
2024-04-25 09:09:00 INFO Shutdown: Application shutdown initiated
</code></pre><p>Un archivo log usualmente contiene las siguientes columnas:</p><ul><li>Marca de tiempo: La fecha y el tiempo cuando el evento ocurrió.</li><li>Nivel de Log: La severidad del evento (INFO, DEBUG, WARN, ERROR).</li><li>Componente: El componente del sistema que generó el evento (Startup, Config, Database, User, Security, Network, Email, API, Session, Shutdown).</li><li>Mensaje: Una descripción del evento que ocurrió.</li><li>Información adicional: Información adicional relacionado al evento.</li></ul><p>En sistemas de tiempo real, los archivos log tienden an ser miles de líneas de largo y son generados a cada segundo. Pueden ser verbosos dependiendo de la configuración. Cada columna en un archivo log es una pieza de información que puede ser usado para rastrear problemas. Esto hace que los archivos log sean difíciles de leer y de entender manualmente.</p><p>Aquí es donde viene el análisis de archivos log. El análisis estático de archivos log es el proceso de extraer información útil de los archivos log. Involucra descomponer los archivos log en piezas pequeñas más manejables, y extraer la información relevante.</p><p>La información filtrada también puede ser útil para crear alertas, reportes y paneles.</p><p>En esta sección, explorarás algunas de las técnicas para análisis de archivos log en Linux.</p><h4 id="extracci-n-de-texto-usando-grep">Extracción de texto usando <code>grep</code></h4><p>Grep es una utilidad incorporada de bash. Significa "Búsqueda global de expresiones regulares". Grep se usa para hacer coincidir cadenas en archivos.</p><p>Aquí hay algunos usos comunes de <code>grep</code>:</p><p><strong>Buscar una cadena específica en un archivo:</strong></p><pre><code class="language-bash"> grep "search_string" filename
</code></pre><p>Este comando busca "search_string" en el archivo llamado <code>filename</code>.</p><p><strong>Buscar de forma recursiva en las carpetas:</strong></p><pre><code class="language-bash"> grep -r "search_string" /path/to/directory
</code></pre><p>Este comando busca "<code>search_string</code>" en todos los archivos dentro de la carpeta especificada y sus sub-carpetas.</p><p><strong>Ignorar mayúsculas y minúsculas mientras se busca:</strong></p><pre><code class="language-bash"> grep -i "search_string" filename
</code></pre><p>Este comando realiza una búsqueda sin importar mayúsculas o minúsculas de "search_string" en el archivo llamado <code>filename</code>.</p><p><strong>Mostrar números de línea con líneas coincidentes:</strong></p><pre><code class="language-bash"> grep -n "search_string" filename
</code></pre><p>Este comando muestra los números de línea juntamente con las líneas coincidentes en el archivo llamado <code>filename</code>.</p><p><strong>Cuenta el número de líneas coincidentes:</strong></p><pre><code class="language-bash"> grep -c "search_string" filename
</code></pre><p>Este comando cuenta el número de líneas que contiene "search_string" en el archivo llamado <code>filename</code>.</p><p><strong>Invertir las coincidencias para mostrar líneas que no coinciden:</strong></p><pre><code class="language-bash"> grep -v "search_string" filename
</code></pre><p>Este comando muestra todas las líneas que no contienen "search_string" en el archivo llamado <code>filename</code>.</p><p><strong>Busca una palabra entera:</strong></p><pre><code class="language-bash"> grep -w "word" filename
</code></pre><p>Este comando busca la palabra "word" entera en el archivo llamado <code>filename</code>.</p><p><strong>Usar expresiones regulares extendidas:</strong></p><pre><code class="language-bash"> grep -E "pattern" filename
</code></pre><p>Este comando permite el uso de las expresiones regulares extendidas para una coincidencia de patrón más complejo en el archivo llamado <code>filename</code>.</p><p><strong>💡 Consejo:</strong> Si hay múltiples archivos en una carpeta, puedes usar el comando de abajo para encontrar la lista de archivos que contienen las cadenas deseadas.</p><pre><code class="language-bash"># encuentra la lista de archivos que contienen las cadenas deseadas
grep -l "String to Match" /path/to/directory
</code></pre><h4 id="extracci-n-de-texto-usando-sed">Extracción de texto usando <code>sed</code></h4><p><code>sed</code> significa "editor de stream". Procesa flujo de datos, lo que significa que lee datos una línea a la vez. <code>sed</code> te permite buscar patrones y realizar acciones en las líneas que coinciden con esos patrones.</p><p><strong>Sintaxis básica de </strong><code>sed</code>:</p><p>La sintaxis básica de <code>sed</code> es como sigue:</p><pre><code class="language-bash">sed [options] 'command' file_name
</code></pre><p>Aquí, <code>command</code> se usa para realizar operaciones como substitución, eliminación, inserción, y así sucesivamente, en los datos de texto. El nombre de archivo es el nombre del archivo que quieres procesar.</p><p><strong>Uso de </strong><code>sed</code>:</p><p><strong>1. Substitución:</strong></p><p>El argumento <code>s</code> se usa para reemplazar texto. El <code>old-text</code> se reemplaza con <code>new-text</code>:</p><pre><code class="language-bash">sed 's/old-text/new-text/' filename
</code></pre><p>Por ejemplo, para cambiar todas las instancias de "error" a "warning" en el archivo log <code>system.log</code>:</p><pre><code class="language-bash">sed 's/error/warning/' system.log
</code></pre><p><strong>2. Imprimiendo líneas que contienen un patrón específico:</strong></p><p>Usando <code>sed</code> para filtrar y mostrar las líneas que coinciden con un patrón específico:</p><pre><code class="language-bash">sed -n '/pattern/p' filename
</code></pre><p>Por ejemplo, para encontrar todas las líneas que contienen "ERROR":</p><pre><code class="language-bash">sed -n '/ERROR/p' system.log
</code></pre><p><strong>3. Eliminar líneas que contienen un patrón específico:</strong></p><p>Puedes eliminar líneas desde la salida que coinciden un patrón específico:</p><pre><code class="language-bash">sed '/pattern/d' filename
</code></pre><p>Por ejemplo, para quitar todas las líneas que contienen "DEBUG":</p><pre><code class="language-bash">sed '/DEBUG/d' system.log
</code></pre><p><strong>4. Extrayendo campos específicos desde una línea log:</strong></p><p>Puedes usar expresiones regulares para extraer partes de líneas. Supón que cada línea del archivo log comienza con una fecha en el formato "YYYY-MM-DD". Podrías extraer sólo la fecha de cada línea:</p><pre><code class="language-bash">sed -n 's/^\([0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}\).*/\1/p' system.log
</code></pre><h4 id="an-lisis-de-texto-con-awk">Análisis de Texto con <code>awk</code></h4><p><code>awk</code> tiene la habilidad de separar cada línea fácilmente en los campos. Es adecuado para procesar texto estructurado como archivos log.</p><p><strong>Sintaxis Básica de </strong><code>awk</code></p><p>La sintaxis básica de <code>awk</code> es:</p><pre><code class="language-bash">awk 'pattern { action }' file_name
</code></pre><p>Aquí, <code>pattern</code> es una condición que se debe cumplir para que <code>action</code> se ejecute. Si el patrón se omite, la acción se ejecuta en cada línea.</p><p>En los próximos ejemplos, usarás este archivo de log como ejemplo:</p><pre><code class="language-bash">2024-04-25 09:00:00 INFO Startup: Application starting
2024-04-25 09:01:00 INFO Config: Configuration loaded successfully
2024-04-25 09:02:00 INFO Database: Database connection established
2024-04-25 09:03:00 INFO User: New user registered (UserID: 1001)
2024-04-25 09:04:00 INFO Security: Attempted login with incorrect credentials (UserID: 1001)
2024-04-25 09:05:00 INFO Network: Network timeout on request (ReqID: 456)
2024-04-25 09:06:00 INFO Email: Notification email sent (UserID: 1001)
2024-04-25 09:07:00 INFO API: API call with response time over threshold (Duration: 350ms)
2024-04-25 09:08:00 INFO Session: User session ended (UserID: 1001)
2024-04-25 09:09:00 INFO Shutdown: Application shutdown initiated
  INFO
</code></pre><ul><li><strong>Accediendo a columnas usando </strong><code>awk</code></li></ul><p>Los campos en <code>awk</code> (separados por espacio de forma predeterminada) pueden ser accedidos usando <code>$1</code>, <code>$2</code>, <code>$3</code>, y así sucesivamente.</p><pre><code class="language-bash">zaira@zaira-ThinkPad:~$ awk '{ print $1 }' sample.log
# salida
2024-04-25
2024-04-25
2024-04-25
2024-04-25
2024-04-25
2024-04-25
2024-04-25
2024-04-25
2024-04-25
2024-04-25

zaira@zaira-ThinkPad:~$ awk '{ print $2 }' sample.log
# salida
09:00:00
09:01:00
09:02:00
09:03:00
09:04:00
09:05:00
09:06:00
09:07:00
09:08:00
09:09:00
</code></pre><ul><li><strong>Imprimir líneas que contienen un patrón específico (por ejemplo, ERROR)</strong></li></ul><pre><code class="language-bash">awk '/ERROR/ { print $0 }' logfile.log

# salida
2024-04-25 09:05:00 ERROR Network: Network timeout on request (ReqID: 456)
</code></pre><p>Esto imprime todas las líneas que contienen "ERROR".</p><ul><li><strong>Extraer el primer campo (Fecha y Hora)</strong></li></ul><pre><code class="language-bash">awk '{ print $1, $2 }' logfile.log
# salida
2024-04-25 09:00:00
2024-04-25 09:01:00
2024-04-25 09:02:00
2024-04-25 09:03:00
2024-04-25 09:04:00
2024-04-25 09:05:00
2024-04-25 09:06:00
2024-04-25 09:07:00
2024-04-25 09:08:007
2024-04-25 09:09:00
</code></pre><p>Esto extraerá los dos primeros campos de cada línea, el cual en este caso sería la fecha y hora.</p><ul><li><strong>Resumir las ocurrencias de cada nivel de log</strong></li></ul><pre><code class="language-bash">awk '{ count[$3]++ } END { for (level in count) print level, count[level] }' logfile.log

# output
 1
WARN 1
ERROR 1
DEBUG 2
INFO 6
</code></pre><p>La salida será un resumen del número de ocurrencias de cada nivel de log.</p><ul><li><strong>Filtra campos específicos (por ejemplo, donde el 3er campo es INFO)</strong></li></ul><pre><code class="language-bash">awk '{ $3="INFO"; print }' sample.log

# salida
2024-04-25 09:00:00 INFO Startup: Application starting
2024-04-25 09:01:00 INFO Config: Configuration loaded successfully
2024-04-25 09:02:00 INFO Database: Database connection established
2024-04-25 09:03:00 INFO User: New user registered (UserID: 1001)
2024-04-25 09:04:00 INFO Security: Attempted login with incorrect credentials (UserID: 1001)
2024-04-25 09:05:00 INFO Network: Network timeout on request (ReqID: 456)
2024-04-25 09:06:00 INFO Email: Notification email sent (UserID: 1001)
2024-04-25 09:07:00 INFO API: API call with response time over threshold (Duration: 350ms)
2024-04-25 09:08:00 INFO Session: User session ended (UserID: 1001)
2024-04-25 09:09:00 INFO Shutdown: Application shutdown initiated
  INFO
</code></pre><p>Este comando extraerá todas las líneas donde el 3er campo es "INFO".</p><p>💡 <strong>Consejo:</strong> El separador predeterminado en <code>awk</code> es un espacio. Si tu archivo log usa un separador distinto, puedes especificarlo usando la opción <code>-F</code>. Por ejemplo, si tu archivo log usa un dos puntos como separador, puedes usar <code>awk -F: '{ print $1 }' logfile.log</code> para extraer el primer campo.</p><h4 id="an-lisis-de-archivos-log-con-cut">Análisis de archivos log con <code>cut</code></h4><p>El comando <code>cut</code> es una comando sencillo aunque potente usado para extraer secciones de texto de cada línea de la entrada. Siempre y cuando los archivos estén estructurados y cada campo esté delimitado por un caracter específico, tales como un espacio, tabulación, o un delimitador personalizado, <code>cut</code> hace un muy buen trabajo al extraer esos campos específicos.</p><p>La sintaxis básica del comando <code>cut</code> es:</p><pre><code class="language-bash">cut [opciones] [archivo]
</code></pre><p>Algunas de las opciones usados comúnmente para el comando <code>cut</code>:</p><ul><li><code>-d</code> : Especifica un delimitador usado como el separador de campo.</li><li><code>-f</code> : Selecciona los campos para que se muestren.</li><li><code>-c</code> : Especifica las posiciones de cada caracter.</li></ul><p>Por ejemplo, el comando de abajo extraería el primer campo (separado por un espacio) de cada línea del archivo log:</p><pre><code class="language-bash">cut -d ' ' -f 1 logfile.log
</code></pre><p><strong>Ejemplos de uso de </strong><code>cut</code> <strong>para análisis de archivos log</strong></p><p>Digamos que tienes un archivo log estructurado como sigue, donde los campos están separados por espacio:</p><pre><code class="language-bash">2024-04-25 08:23:01 INFO 192.168.1.10 User logged in successfully.
2024-04-25 08:24:15 WARNING 192.168.1.10 Disk usage exceeds 90%.
2024-04-25 08:25:02 ERROR 10.0.0.5 Connection timed out.
...
</code></pre><p><code>cut</code> puede ser usado de las siguientes formas:</p><ol><li><strong>Extraer la hora de cada entrada del archivo log</strong>:</li></ol><pre><code class="language-bash">cut -d ' ' -f 2 system.log

# Output
08:23:01
08:24:15
08:25:02
...
</code></pre><p>Este comando usa un espacio como un delimitador y selecciona el segundo campo, el cual es el componente hora de cada entrada del archivo log.</p><p><strong>2. &nbsp;Extraer las direcciones IP de los archivos log</strong>:</p><pre><code class="language-bash">cut -d ' ' -f 4 system.log

# Output
192.168.1.10
192.168.1.10
10.0.0.5
</code></pre><p>Este comando extraer el cuarto campo, el cual es la dirección IP de cada entrada del log.</p><p><strong>3. &nbsp;Extraer niveles de log (INFO, WARNING, ERROR)</strong>:</p><pre><code class="language-bash">cut -d ' ' -f 3 system.log

# Salida
INFO
WARNING
ERROR
</code></pre><p>Esto extrae el tercer campo el cual contiene el nivel log.</p><p><strong>4. &nbsp;Combinando</strong> <code>cut</code> <strong>con otros comandos:</strong></p><p>La salida de otros comandos puede ser canalizado al comando <code>cut</code>. Digamos que quieres filtrar los logs antes de cortar. Puedes usar <code>grep</code> para extraer las líneas que contienen "ERROR" y luego usa <code>cut</code> para obtener información específica de esas líneas:</p><pre><code class="language-bash">grep "ERROR" system.log | cut -d ' ' -f 1,2 

# Output
2024-04-25 08:25:02
</code></pre><p>Este comando primero filtra las líneas que incluyen "ERROR", luego extrae la fecha y hora de estas líneas.</p><p><strong>5. &nbsp;Extraer múltiples campos</strong>:</p><p>Es posible extraer múltiples campos a la vez al especificar un rango o una lista de campos separado por coma:</p><pre><code class="language-bash">cut -d ' ' -f 1,2,3 system.log` 

# Salida
2024-04-25 08:23:01 INFO
2024-04-25 08:24:15 WARNING
2024-04-25 08:25:02 ERROR
...
</code></pre><p>El comando de arriba extrae los tres primeros campos de cada entrada log que son la fecha, hora, y nivel log.</p><h4 id="an-lisis-sint-ctico-de-archivos-log-con-sort-y-uniq">Análisis sintáctico de archivos log con <code>sort</code> y <code>uniq</code></h4><p>Ordenar y quitar duplicados son operaciones comunes cuando se trabaja con archivos log. Los comandos <code>sort</code> y <code>uniq</code> son comandos poderosos usados para ordenar y quitar duplicados de las entradas, respectivamente.</p><p><strong>Sintaxis básica de sort</strong></p><p>El comando <code>sort</code> organiza las líneas de texto de forma alfabética o numérica.</p><pre><code class="language-bash">sort [opciones] [archivo]
</code></pre><p>Algunas opciones claves para el comando sort:</p><ul><li><code>-n</code>: Ordena el archivo asumiendo que los contenidos son numéricos.</li><li><code>-r</code>: Invierte el orden de sort.</li><li><code>-k</code>: Especifica una clave o número de columna con el cual ordena.</li><li><code>-u</code>: Ordena y quita líneas duplicadas.</li></ul><p>El comando <code>uniq</code> se usa para filtrar o contar y reportar líneas repetidas en un archivo.</p><p>La sintaxis de <code>uniq</code> es:</p><pre><code class="language-bash">uniq [opciones] [archivo_entrada] [archivo_salida]
</code></pre><p>Algunas opciones claves para el comando <code>uniq</code> son:</p><ul><li><code>-c</code>: Prefija líneas por el número de ocurrencias.</li><li><code>-d</code>: Solamente imprime líneas duplicadas.</li><li><code>-u</code>: Solamente imprime líneas únicas.</li></ul><h4 id="ejemplos-de-usar-sort-y-uniq-juntos-para-an-lisis-de-archivos-log">Ejemplos de usar <code>sort</code> y <code>uniq</code> juntos para análisis de archivos log</h4><p>Asumamos las siguientes de entradas de registro de ejemplo para estas demostraciones:</p><pre><code class="language-bash">2024-04-25 INFO User logged in successfully.
2024-04-25 WARNING Disk usage exceeds 90%.
2024-04-26 ERROR Connection timed out.
2024-04-25 INFO User logged in successfully.
2024-04-26 INFO Scheduled maintenance.
2024-04-26 ERROR Connection timed out.
</code></pre><ol><li><strong>Ordenar entradas log por fecha</strong>:</li></ol><pre><code class="language-bash">sort system.log

# Salida
2024-04-25 INFO User logged in successfully.
2024-04-25 INFO User logged in successfully.
2024-04-25 WARNING Disk usage exceeds 90%.
2024-04-26 ERROR Connection timed out.
2024-04-26 ERROR Connection timed out.
2024-04-26 INFO Scheduled maintenance.
</code></pre><p>Esto ordena las entradas log de forma alfabética, el cual ordena efectivamente por fecha si la fecha es el primer campo.</p><p><strong>2. &nbsp;Ordenar y quitar duplicados</strong>:</p><pre><code class="language-bash">sort system.log | uniq

# Salida
2024-04-25 INFO User logged in successfully.
2024-04-25 WARNING Disk usage exceeds 90%.
2024-04-26 ERROR Connection timed out.
2024-04-26 INFO Scheduled maintenance.
</code></pre><p>Este comando ordena el archivo log y lo canaliza a <code>uniq</code>, quitando líneas duplicadas.</p><p><strong>3. &nbsp;Contando ocurrencias de cada línea</strong>:</p><pre><code class="language-bash">sort system.log | uniq -c

# Salida
2 2024-04-25 INFO User logged in successfully.
1 2024-04-25 WARNING Disk usage exceeds 90%.
2 2024-04-26 ERROR Connection timed out.
1 2024-04-26 INFO Scheduled maintenance.
</code></pre><p>Ordena las entradas de log y luego cuenta cada línea única. Según la salida, la línea <code>'2024-04-25 INFO User logged in successfully.'</code> apareció 2 veces en el archivo.</p><p><strong>4. &nbsp;Identificar entradas de log únicas</strong>:</p><pre><code class="language-bash">sort system.log | uniq -u

# Salida

2024-04-25 WARNING Disk usage exceeds 90%.
2024-04-26 INFO Scheduled maintenance.
</code></pre><p>Este comando muestra las líneas que son únicas.</p><p><strong>5. &nbsp;Ordenar por nivel de by log level</strong>:</p><pre><code class="language-bash">sort -k2 system.log

# Salida
2024-04-26 ERROR Connection timed out.
2024-04-26 ERROR Connection timed out.
2024-04-25 INFO User logged in successfully.
2024-04-25 INFO User logged in successfully.
2024-04-26 INFO Scheduled maintenance.
2024-04-25 WARNING Disk usage exceeds 90%.
</code></pre><p>Ordena las entradas basado en el segundo campo, el cual es el nivel de registro.</p><!--kg-card-begin: html--><h3 id="gestionando-procesos-de-linux">8.4. Gestionando procesos de Linux a través de la Línea de Comandos</h3><!--kg-card-end: html--><p>Un proceso es una instancia de un programa en ejecución. Un proceso consiste de:</p><ul><li>Un espacio de dirección de la memora alojada.</li><li>Estado del Proceso.</li><li>Propiedades tales como propiedad, atributos de seguridad, y uso de recursos.</li></ul><p>Un proceso también tiene un entorno que consiste de:</p><ul><li>Variables locales y globales</li><li>El contexto de programación actual</li><li>Recursos de sistema alojados, tales como puertos de red o descriptores de archivo.</li></ul><p>Cuando ejecutes el comando <code>ls -l</code>, el sistema operativo crea un nuevo proceso para ejecutar el comando. El proceso tiene un ID, un estado, y ejecuta hasta que el comando se complete.</p><h4 id="entendiendo-la-creaci-n-de-procesos-y-el-ciclo-de-vida">Entendiendo la creación de procesos y el ciclo de vida</h4><p>En Ubuntu, todos los procesos se originan desde el proceso del sistema inicial llamado <code>systemd</code>, el cual el primer proceso comenzó por el kernel durante el arrnque.</p><p>El proceso <code>systemd</code> tiene un ID de proceso (PID) de <code>1</code> y es responsable por inicializar el sistema, comenzar y gestionar otros procesos, y manejar servicios de sistema. Todos los otros procesos en el sistema son descendientes de <code>systemd</code>.</p><p>Un proceso padre duplica su propio espacio de dirección (fork) para crear una nueva estructura de proceso. Cada nuevo proceso se le asigna un ID de proceso único (PID) para rastrear y por propósitos de seguridad. El PID y el ID del proceso del padre (PPID) son parte del nuevo entorno del proceso. Cualquier proceso puede crear un proceso hijo.</p><figure class="kg-card kg-image-card"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1719584071059/f24fac4b-18f3-4a39-8659-93d32c533256.png" class="kg-image" alt="Process and its initialization to parent and child" width="473" height="649" loading="lazy"></figure><p>A través de la rutina de fork, un proceso hijo hereda identidades de seguridad, descriptores de archivo previos y actuales, puertos y privilegios de recursos, variables de entorno, y código de programa. Un proceso hijo podría ejecutar su propio código de programa.</p><p>Típicamente, un proceso padre se duerme mientras el proceso hijo se ejecuta, estableciendo una petición (wait) para ser notificado cuando el hijo se completa.</p><p>Al salir, el proceso hijo ya se cerrado o descartado sus recursos y entorno. El único recurso que permanece, conocido como un zombie, es una entrada en la table del proceso. El padre, señalado como despierto cuando el hijo termina, limpia la tabla del proceso de la entrada del hijo, de esa forma liberando el último recurso del proceso hijo. El proceso padre luego continua ejecutando su propio código de programa.</p><h4 id="entendiendo-los-estados-del-proceso">Entendiendo los estados del proceso</h4><p>Los procesos en Linux asumen distintos estados durante sus ciclos de vida. El estado de un proceso indica que está haciendo actualmente el proceso y cómo interactúan con el sistema. La transición de procesos entre estados basados en su estado de ejecución y el algoritmo de programación del sistema.</p><figure class="kg-card kg-image-card"><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1719584116150/3054dfe2-c42c-4d62-9e12-e3aec479d53a.png" class="kg-image" alt="Linux process states and transitions" width="1079" height="742" loading="lazy"></figure><p>Los procesos en un sistema Linux puede ser uno de los siguientes estados:</p><!--kg-card-begin: html--><table>
<thead>
<tr>
<th><strong>Estado</strong></th>
<th><strong>Descripción</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>(new)</strong></td>
<td>El estado inicial cuando un proceso es creado por medio de una llamada del sistema fork.</td>
</tr>
<tr>
<td><strong>Runnable (ready) (R)</strong></td>
<td>El proceso está listo para ejecutarse y esperando a ser programado en una CPU.</td>
</tr>
<tr>
<td><strong>Running (user) (R)</strong></td>
<td>El proceso se ejecuta en modo usuario, ejecutando aplicaciones de usuario.</td>
</tr>
<tr>
<td><strong>Running (kernel) (R)</strong></td>
<td>El proceso se ejecuta en modo kernel, manejando las llamadas de sistema o interrupciones de hardware.</td>
</tr>
<tr>
<td><strong>Sleeping (S)</strong></td>
<td>El proceso está esperando un evento (por ejemplo, operaciones I/O) para completar y puede ser fácilmente despertado.</td>
</tr>
<tr>
<td><strong>Sleeping (uninterruptible) (D)</strong></td>
<td>El proceso está en un estado de sueño ininterruptible, esperando una condición específica (usualmente I/O) que se complete, y no puede ser interrumpido por señales.</td>
</tr>
<tr>
<td><strong>Sleeping (disk sleep) (K)</strong></td>
<td>El proceso está esperando que las operaciones I/O de disco se completen.</td>
</tr>
<tr>
<td><strong>Sleeping (idle) (I)</strong></td>
<td>El proceso está inactivo, no haciendo ningún trabajo, y esperando que un evento ocurra.</td>
</tr>
<tr>
<td><strong>Stopped (T)</strong></td>
<td>La ejecución del proceso ha sido detenido, típicamente por una señal, y puede ser reanudado luego.</td>
</tr>
<tr>
<td><strong>Zombie (Z)</strong></td>
<td>El proceso tiene la ejecución completada pero todavía tiene una entrada en la tabla del proceso, esperando que su antecesor lea su estado de salida.</td>
</tr>
</tbody>
</table><!--kg-card-end: html--><p>La transición de los procesos entre estos estados de las siguientes formas:</p><!--kg-card-begin: html--><table>
<thead>
<tr>
<th><strong>Transición</strong></th>
<th><strong>Descripción</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Fork</strong></td>
<td>Crea un nuevo proceso desde un proceso antecesor, transicionando de (new) a Runnable (ready) (R).</td>
</tr>
<tr>
<td><strong>Schedule</strong></td>
<td>El scheduler selecciona un proceso ejecutable, transicionándolo del estado Running (user) o Running (kernel).</td>
</tr>
<tr>
<td><strong>Run</strong></td>
<td>Las transiciones de proceso desde Runnable (ready) (R) a Running (kernel) (R) cuando se programa para ejecución.</td>
</tr>
<tr>
<td><strong>Preempt or Reschedule</strong></td>
<td>El proceso puede ser preempted o reprogramado, moviéndolo nuevamente al estado Runnable (ready) (R).</td>
</tr>
<tr>
<td><strong>Syscall</strong></td>
<td>El proceso hace una llamada de sistema, transicionando de Running (user) (R) a Running (kernel) (R).</td>
</tr>
<tr>
<td><strong>Return</strong></td>
<td>El proceso completa una llamada de sistema y regresa a Running (user) (R).</td>
</tr>
<tr>
<td><strong>Wait</strong></td>
<td>El proceso espera un evento, transicionando de Running (kernel) (R) a uno de los estados de sueño (S, D, K, or I).</td>
</tr>
<tr>
<td><strong>Event o Signal</strong></td>
<td>El proceso se despierta por un evento o señal, cambiándolo de un estado de sueño devuelta a Runnable (ready) (R).</td>
</tr>
<tr>
<td><strong>Suspend</strong></td>
<td>Process is suspended, transitioning from Running (kernel) or Runnable (ready) to Stopped (T).</td>
</tr>
<tr>
<td><strong>Resume</strong></td>
<td>El proceso se reanuda, cambiando de Stopped (T) devuelta a Runnable (ready) (R).</td>
</tr>
<tr>
<td><strong>Exit</strong></td>
<td>El proceso termina, transicionando de Running (user) o Running (kernel) a Zombie (Z).</td>
</tr>
<tr>
<td><strong>Reap</strong></td>
<td>El proceso antecesor lee el estado de salida del proceso zombie, quitándolo de la tabla de proceso.</td>
</tr>
</tbody>
</table><!--kg-card-end: html--><h4 id="c-mo-ver-los-procesos">Cómo ver los procesos</h4><p>Puedes usar el comando <code>ps</code> juntamente con una combinación de opciones para ver los procesos en un sistema Linux. El comando <code>ps</code> se usado para mostrar información sobre una selección de procesos activos. Por ejemplo, <code>ps aux</code> muestra todos los procesos que se ejecutan en el sistema.</p><pre><code class="language-bash">zaira@zaira:~$ ps aux
# Salida
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.0 168140 11352 ?        Ss   May21   0:18 /sbin/init splash
root           2  0.0  0.0      0     0 ?        S    May21   0:00 [kthreadd]
root           3  0.0  0.0      0     0 ?        I&lt;   May21   0:00 [rcu_gp]
root           4  0.0  0.0      0     0 ?        I&lt;   May21   0:00 [rcu_par_gp]
root           5  0.0  0.0      0     0 ?        I&lt;   May21   0:00 [slub_flushwq]
root           6  0.0  0.0      0     0 ?        I&lt;   May21   0:00 [netns]
root          11  0.0  0.0      0     0 ?        I&lt;   May21   0:00 [mm_percpu_wq]
root          12  0.0  0.0      0     0 ?        I    May21   0:00 [rcu_tasks_kthread]
root          13  0.0  0.0      0     0 ?        I    May21   0:00 [rcu_tasks_rude_kthread]
*... output truncated ....*
</code></pre><p>La salida de arriba muestra un instantáneo de los procesos actuales en ejecución del sistema. Cada fila representa un proceso con las siguientes columnas:</p><ol><li><code>USER</code>: El usuario quien posee el proceso.</li><li><code>PID</code>: El ID del proceso.</li><li><code>%CPU</code>: El uso del CPU del proceso.</li><li><code>%MEM</code>: El uso de memoria del proceso.</li><li><code>VSZ</code>: El tamaño de la memoria virtual del proceso.</li><li><code>RSS</code>: El tamaño del conjunto residente, que es la memoria física no intercambiada que una tarea ha usado.</li><li><code>TTY</code>: La terminal de control del proceso. Un <code>?</code> indica una terminal de sin control.</li><li><code>STAT</code>: El estado del proceso.</li></ol><ul><li><code>R</code>: Running (ejecutando)</li><li><code>I</code> o <code>S</code>: Sueño interrumpible (esperando que un evento se complete)</li><li><code>D</code>: Sueño ininterrumpible (usualmente IO)</li><li><code>T</code>: Detenido (sea por una señal de control de un trabajo o porque está siendo trazado)</li><li><code>Z</code>: Zombie (terminado pero no repetido por su padre)</li><li><code>Ss</code>: Líder de sesión. Este es un proceso que ha comenzado una sesión, y es un líder de un grupo de procesos y puede controlar señales de la terminal. El primer <code>S</code> indica el estado de dormir, y el segundo <code>s</code> indica que es un líder de sesión.</li></ul><ol><li><code>START</code>: El tiempo de comienzo o fecha del proceso.</li><li><code>TIME</code>: El tiempo de CPU acumulativo.</li><li><code>COMMAND</code>: El comando que comenzó el proceso.</li></ol><h4 id="procesos-de-segundo-y-primer-plano">Procesos de segundo y primer plano</h4><p>En esta sección, aprenderás cómo puedes controlar trabajas al ejecutarlos en segundo o primer plano.</p><p>Un trabajo (job) es un proceso que comienza por una shell. Cuando ejecutas un comando en la terminal, se considera un trabajo. Un trabajo puede ejecutarse en primer o segundo plano.</p><p>Para demostrar el control, primero crearás 3 procesos y luego los ejecutarás en segundo plano. Después de eso, listarás los procesos y los alternarás entre primer y segundo plano. Verás cómo se los pone a dormir o salir completamente.</p><ol><li>Crea tres procesos</li></ol><p>Abre una terminal y comienza tres procesos de larga duración. usa el comando <code>sleep</code>, que mantiene el proceso ejecutándose por un número especificado de segundos.</p><pre><code class="language-bash"># ejecuta el comando sleep por 300, 400, y 500 segundos
sleep 300 &amp;
sleep 400 &amp;
sleep 500 &amp;
</code></pre><p>El <code>&amp;</code> al final de cada comando mueve el proceso a segundo plano.</p><p>2. &nbsp; Muestra trabajos en segundo plano</p><p>Usa el comando <code>jobs</code> para mostrar la lista de trabajos en segundo plano.</p><pre><code class="language-bash">jobs
</code></pre><p>La salida debería verse así:</p><pre><code class="language-bash">jobs
[1]   Running                 sleep 300 &amp;
[2]-  Running                 sleep 400 &amp;
[3]+  Running                 sleep 500 &amp;
</code></pre><p>3. &nbsp; Traer un trabajo en segundo plano a primer plano</p><p>Para traer un trabajo en segundo plano al primer plano, usa el comando <code>fg</code> seguido del número del trabajo. Por ejemplo, para traer el primer trabajo (<code>sleep 300</code>) al primer plano:</p><pre><code class="language-bash">fg %1
</code></pre><p>Esto traerá el trabajo <code>1</code> al primer plano.</p><p>4. &nbsp; Mueve el trabajo en primero plano nuevamente a segundo plano</p><p>Mientras el trabajo se ejecuta en el primer plano, puedes suspenderlo y llevarlo nuevamente al segundo plano al presionar <code>Ctrl+Z</code> para suspender el trabajo.</p><p>Un trabajo suspendido se verás de esta forma:</p><pre><code class="language-bash">zaira@zaira:~$ fg %1
sleep 300

^Z
[1]+  Stopped                 sleep 300

zaira@zaira:~$ jobs
# trabajo suspendido 
[1]+  Stopped                 sleep 300
[2]   Running                 sleep 400 &amp;
[3]-  Running                 sleep 500 &amp;
</code></pre><p>Ahora usa el comando <code>bg</code> para reanudar el trabajo con ID 1 en el segundo plano.</p><pre><code class="language-bash"># Presiona Ctrl+Z para suspender el trabajo de primer plano
# Luego, reanúdalo en segundo plano
bg %1
</code></pre><ol><li>Muestra los trabajos nuevamente</li></ol><pre><code class="language-bash">jobs
[1]   Running                 sleep 300 &amp;
[2]-  Running                 sleep 400 &amp;
[3]+  Running                 sleep 500 &amp;
</code></pre><p>En este ejercicio, vos:</p><ul><li>Comenzaste tres proceso en segundo plano usando comandos sleep.</li><li>Usaste trabajos para mostrar la lista de trabajos en segundo plano.</li><li>Trajiste un trabajo a primer plano con <code>fg %job_number</code>.</li><li>Suspendiste el trabajo con <code>Ctrl+Z</code> y lo regresaste al segundo plano con <code>bg %job_number</code>.</li><li>Usaste los trabajos nuevamente para verificar el estado de los trabajos en segundo plano.</li></ul><p>Ahora sanes cómo controlar los trabajos.</p><h4 id="matando-procesos">Matando procesos</h4><p>Es posible terminar un proceso que no responde o no querido usando el comando <code>kill</code>. El comando <code>kill</code> envía una señal a un ID de proceso, pidiéndole que termine.</p><p>Un número de opciones están disponibles con el comando <code>kill</code>.</p><pre><code class="language-bash"># Opciones disponibles con kill

kill -l
 1) SIGHUP     2) SIGINT     3) SIGQUIT     4) SIGILL     5) SIGTRAP
 6) SIGABRT     7) SIGBUS     8) SIGFPE     9) SIGKILL    10) SIGUSR1
11) SIGSEGV    12) SIGUSR2    13) SIGPIPE    14) SIGALRM    15) SIGTERM
16) SIGSTKFLT    17) SIGCHLD    18) SIGCONT    19) SIGSTOP    20) SIGTSTP
21) SIGTTIN    22) SIGTTOU    23) SIGURG    24) 
...terminated
</code></pre><p>Aquí hay algunos ejemplos del comando <code>kill</code> en Linux:</p><p><strong>Matar un proceso por PID (ID del proceso):</strong></p><pre><code class="language-bash"> kill 1234
</code></pre><p>Este comando envía la señal <code>SIGTERM</code> predeterminada al proceso con un PID de 1234, solicitándole que termine.</p><p><strong>Matar un proceso por nombre:</strong></p><pre><code class="language-bash"> pkill process_name
</code></pre><p>Este comando envía la señal <code>SIGTERM</code> predeterminada a todos los procesos con el nombre especificado.</p><p><strong>Matar un proceso a la fuerza:</strong></p><pre><code class="language-bash"> kill -9 1234
</code></pre><p>Este comando envía la señal <code>SIGKILL</code> al proceso con el PID 1234, terminándolo a la fuerza.</p><p><strong>Envía una señal específica a un proceso:</strong></p><pre><code class="language-bash"> kill -s SIGSTOP 1234
</code></pre><p>Este comando envía la señal <code>SIGSTOP</code> al proceso con el PID 1234, deteniéndolo.</p><p><strong>Matar a todos los procesos que pertenecen a un usuario específico:</strong></p><pre><code class="language-bash"> pkill -u username
</code></pre><p>Este comando envía la señal <code>SIGTERM</code> predeterminada a todos los procesos que pertenecen al usuario especificado.</p><p>Estos ejemplos demuestran varias formas de usar el comando <code>kill</code> para gestionar procesos en un entorno de Linux.</p><p>Aquí esta la información sobre las opciones &nbsp;y señales del comando <code>kill</code> de una forma tabular: Esta tabla resumen las opciones y señales más comunes del comando <code>kill</code> usados para gestionar los procesos.</p><!--kg-card-begin: html--><table>
<thead>
<tr>
<th>Comando / Opción</th>
<th>Señal</th>
<th>Descripción</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>kill &lt;pid&gt;</code></td>
<td><code>SIGTERM</code></td>
<td>Solicita al proceso que termina correctamente (señal predeterminada).</td>
</tr>
<tr>
<td><code>kill -9 &lt;pid&gt;</code></td>
<td><code>SIGKILL</code></td>
<td>Forza al proceso que termine inmediatamente sin limpiar.</td>
</tr>
<tr>
<td><code>kill -SIGKILL &lt;pid&gt;</code></td>
<td><code>SIGKILL</code></td>
<td>Forza al proceso que termine inmediatamente sin limpiar.</td>
</tr>
<tr>
<td><code>kill -15 &lt;pid&gt;</code></td>
<td><code>SIGTERM</code></td>
<td>Envía explícitamente la señal <code>SIGTERM</code> para solicitar la terminación correcta.</td>
</tr>
<tr>
<td><code>kill -SIGTERM &lt;pid&gt;</code></td>
<td><code>SIGTERM</code></td>
<td>Envía explícitamente la señal <code>SIGTERM</code> para solicitar la terminación correcta.</td>
</tr>
<tr>
<td><code>kill -1 &lt;pid&gt;</code></td>
<td><code>SIGHUP</code></td>
<td>Tradicionalmente significa "colgarse"; puede ser usado para recargar archivos de configuración.</td>
</tr>
<tr>
<td><code>kill -SIGHUP &lt;pid&gt;</code></td>
<td><code>SIGHUP</code></td>
<td>Tradicionalmente significa "colgarse"; puede ser usado para recargar archivos de configuración.</td>
</tr>
<tr>
<td><code>kill -2 &lt;pid&gt;</code></td>
<td><code>SIGINT</code></td>
<td>Solicita al proceso que termine (lo mismo que presionar <code>Ctrl+C</code> en la terminal).</td>
</tr>
<tr>
<td><code>kill -SIGINT &lt;pid&gt;</code></td>
<td><code>SIGINT</code></td>
<td>Solicita al proceso que termine (lo mismo que presione <code>Ctrl+C</code> en la terminal).</td>
</tr>
<tr>
<td><code>kill -3 &lt;pid&gt;</code></td>
<td><code>SIGQUIT</code></td>
<td>Hace que el proceso termine y produzca un core dump para depuración.</td>
</tr>
<tr>
<td><code>kill -SIGQUIT &lt;pid&gt;</code></td>
<td><code>SIGQUIT</code></td>
<td>Hace que el proceso termine y produzca un core dump para depuración.</td>
</tr>
<tr>
<td><code>kill -19 &lt;pid&gt;</code></td>
<td><code>SIGSTOP</code></td>
<td>Pausa el proceso.</td>
</tr>
<tr>
<td><code>kill -SIGSTOP &lt;pid&gt;</code></td>
<td><code>SIGSTOP</code></td>
<td>Pausa el proceso.</td>
</tr>
<tr>
<td><code>kill -18 &lt;pid&gt;</code></td>
<td><code>SIGCONT</code></td>
<td>Reanuda un proceso pausado.</td>
</tr>
<tr>
<td><code>kill -SIGCONT &lt;pid&gt;</code></td>
<td><code>SIGCONT</code></td>
<td>Reanuda un proceso pausado.</td>
</tr>
<tr>
<td><code>killall &lt;nombre&gt;</code></td>
<td>Varios</td>
<td>Envía una señal a todos los procesos con el nombre provisto.</td>
</tr>
<tr>
<td><code>killall -9 &lt;nombre&gt;</code></td>
<td><code>SIGKILL</code></td>
<td>Forza que mate a todos los procesos con el nombre provisto.</td>
</tr>
<tr>
<td><code>pkill &lt;patron&gt;</code></td>
<td>Varios</td>
<td>Envía una señal a los procesos basado en una coincidencia de patrón.</td>
</tr>
<tr>
<td><code>pkill -9 &lt;patron&gt;</code></td>
<td><code>SIGKILL</code></td>
<td>Forza que mate a todos los procesos que coincida con el patrón.</td>
</tr>
<tr>
<td><code>xkill</code></td>
<td><code>SIGKILL</code></td>
<td>Utilidad gráfica que permite hacer clic en una ventana para que mate al proceso correspondiente.</td>
</tr>
</tbody>
</table><!--kg-card-end: html--><!--kg-card-begin: html--><h3 id="flujos-entrada-y-salida-estandar-en-linux">8.5. Flujos de Entrada y Salida Estándar en Linux</h3><!--kg-card-end: html--><p>Leer una entrada y escribir una entrada es una parte esencial de entender la línea de comandos y la programación de scripts. En Linux, cada proceso tiene tres flujos predeterminados:</p><p>Entrada Estándar (<code>stdin</code>): Este flujo se usa para entradas, típicamente desde el teclado. Cuando un programa lee desde el <code>stdin</code>, recibe datos ingresados por el usuario o redireccionado desde un archivo. Un descriptor de archivo es un identificador único que el sistema operativo asigna a un archivo abierto para mantener un rastro de archivos abiertos.</p><p>El descriptor de archivo para <code>stdin</code> es <code>0</code>.</p><p>Salida Estándar (<code>stdout</code>): Este es el flujo de salida predeterminado donde un proceso escribe su salida. Por defecto, la salida estándar es la terminal. La salida también puede ser redireccionado a un archivo u otro programa. El descriptor de archivo para <code>stdout</code> es <code>1</code>.</p><p>Error Estándar (<code>stderr</code>): Este es el flujo de error estándar donde un proceso escribe sus mensajes de error. Por defecto, el error estándar es la terminal, permitiendo que los mensajes de error sea visto inclusive si <code>stdout</code> es redireccionado. El descriptor de archivo para <code>stderr</code> es <code>2</code>.</p><h4 id="redirecci-n-y-tuber-as">Redirección y Tuberías</h4><p><strong>Redirección:</strong> Puedes redireccionar el error y los flujos de salida a los archivos u otros comandos. Por ejemplo:</p><pre><code class="language-bash"># Redireccionando stdout a un archivo
ls &gt; output.txt

# Redireccionando stderr a un archivo
ls non_existent_directory 2&gt; error.txt

# Redireccionando stdout y stderr a un archivo
ls non_existent_directory &gt; all_output.txt 2&gt;&amp;1
</code></pre><p>En el último comando,</p><ul><li><code>ls non_existent_directory</code>: lista los contenidos de una carpeta llamada non_existent_directory. Ya que esta carpeta no existe, <code>ls</code> generará un mensaje de error.</li><li><code>&gt; all_output.txt</code>: El operador <code>&gt;</code> redirecciona la salida estándar (<code>stdout</code>) del comando <code>ls</code> al archivo <code>all_output.txt</code>. Si el archivo no existe, será creado. Si existe, su contenido será sobrescrito.</li><li><code>2&gt;&amp;1:</code>: Aquí, <code>2</code> representa el descriptor del archivo para el error estándar (<code>stderr</code>). <code>&amp;1</code> representa el descriptor del archivo para la salida estándar (<code>stdout</code>). El caracter <code>&amp;</code> se usa para especificar que <code>1</code> no es el nombre del archivo sino un descriptor del archivo.</li></ul><p>Así que, <code>2&gt;&amp;1</code> significa "redirecciona stderr (2) a donde sea que stdout (1) esté yendo actualmente", el cual en este caso es el archivo <code>all_output.txt</code>. Por lo tanto, la salida (si hay uno) y el mensaje de error de <code>ls</code> será escrito a <code>all_output.txt</code>.</p><p><strong>Tuberías:</strong></p><p>Puedes usar tuberías (<code>|</code>) para pasar la salida de un comando como la entrada a otro:</p><pre><code class="language-bash">ls | grep image
# Salida
image-10.png
image-11.png
image-12.png
image-13.png
... Output truncated ...
</code></pre><!--kg-card-begin: html--><h3 id="automatizacion-linux-automatizar-tareas-cron-jobs">8.6 Automatización en Linux – Automatizar Tareas con Tareas de Cron</h3><!--kg-card-end: html--><p>Cron es una utilidad poderosa para programar trabajos que está disponible en sistemas operativos de Unix. Al configurar un cron, puedes configurar trabajos automatizados para ejecutar diariamente, mensualmente, u otro tiempo específico. Las capacidades de automatización provisto por cron juega un rol crucial en la administración de sistema de Linux.</p><p>El <a href="https://es.wikipedia.org/wiki/Daemon_(inform%C3%A1tica)">daemon</a> <code>crond</code> (un tipo de programa de computadora que se ejecuta en segundo plano) permite la funcionalidad de cron. El cron lee el <strong>crontab</strong> (tablas de cron) para ejecutar scripts predefinidos.</p><p>Al usar una sintaxis específica, puedes configurar un trabajo cron para programar scripts u otros comandos para ejecutarlos automáticamente.</p><p><strong>¿Qué son los trabajos cron en Linux?</strong></p><p>Cualquier tarea que programes a través de crons se llama un trabajo de cron.</p><p>Ahora, veamos cómo los trabajos de cron funcionan.</p><h4 id="c-mo-controlar-el-acceso-a-los-crons">Cómo controlar el acceso a los crons</h4><p>Para usar los trabajos de cron, un administrador necesita permitir a los trabajos de cron que sean agregados para los usuarios en el archivo <code>/etc/cron.allow</code>.</p><p>Si obtienes un mensaje como este, significa que no tienes permiso para usar cron.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/11/image-51.png" class="kg-image" alt="Cron job addition denied for user John." width="600" height="400" loading="lazy"></figure><p>Para permitir a John que use crons, incluye su nombre en <code>/etc/cron.allow</code>. Crea el archivo si no existe. Esto permitirá a John que cree y edite trabajos de cron.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/11/image-52.png" class="kg-image" alt="Allowing John in file cron.allow" width="600" height="400" loading="lazy"></figure><p>Los usuarios también se les puede denegar el acceso a trabajos de cron al ingresar sus nombres de usuario en el archivo <code>/etc/cron.d/cron.deny</code>.</p><h4 id="c-mo-agrega-trabajos-de-cron-en-linux">Cómo agrega trabajos de cron en Linux</h4><p>Primero, para usar los trabajos de cron, necesitarás verificar el estado del servicio de cron. Si cron no está instalado, puedes descargarlo fácilmente a través del gestor de paquetes. Solo usa esto para verificar:</p><pre><code class="language-bash"># Check cron service on Linux system
sudo systemctl status cron.service
</code></pre><h4 id="sintaxis-de-trabajos-de-cron">Sintaxis de trabajos de Cron</h4><p>Los crontabs usan los siguientes argumentos para agregar y listar trabajos de cron:</p><ul><li><code>crontab -e</code>: edita las entradas de crontab para agregar, eliminar, o editar trabajos de cron.</li><li><code>crontab -l</code>: listar todos los trabajos de cron para el usuario actual.</li><li><code>crontab -u nombre-usuario -l</code>: lista los crons de otro usuario.</li><li><code>crontab -u nombre-usuario -e</code>: edita los crons de otro usuario.</li></ul><p>Cuando listas los crons y existen, verás algo como esto:</p><pre><code class="language-bash"># Cron job example
* * * * * sh /path/to/script.sh
</code></pre><p>En el ejemplo de arriba,</p><ul><li><code>*</code> representa minuto(s) hora(s) día(s) mes(es) semana(s), respectivamente. Ve los detalles de estos valores abajo:</li></ul><!--kg-card-begin: html--><table>
<thead>
<tr>
<th></th>
<th><strong>VALOR</strong></th>
<th><strong>DESCRIPCIÓN</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>Minutos</td>
<td>0-59</td>
<td>El comando será ejecutado en el minuto específico.</td>
</tr>
<tr>
<td>Horas</td>
<td>0-23</td>
<td>El comando será ejecutado en la hora específica.</td>
</tr>
<tr>
<td>Días</td>
<td>1-31</td>
<td>Los comandos serán ejecutados en estos días de los meses.</td>
</tr>
<tr>
<td>Meses</td>
<td>1-12</td>
<td>El mes en el que las tareas necesitan ser ejecutados.</td>
</tr>
<tr>
<td>Días de la semana</td>
<td>0-6</td>
<td>Días de la semana donde los comandos se ejecutarán. Aquí, 0 es Domingo.</td>
</tr>
</tbody>
</table><!--kg-card-end: html--><ul><li><code>sh</code> representa que el script es un script de bash y debería ser ejecutado desde <code>/bin/bash</code>.</li><li><code>/path/to/script.sh</code> especifica la ruta al script.</li></ul><p>Abajo hay un resumen de la sintaxis de los trabajos de cron:</p><pre><code class="language-markdown">*   *   *   *   *  sh /path/to/script/script.sh
|   |   |   |   |              |
|   |   |   |   |      Comando o Script a ejecutarse        
|   |   |   |   |
|   |   |   |   |
|   |   |   |   |
|   |   |   | Día de la Semana(0-6)
|   |   |   |
|   |   | Mes del Año(1-12)
|   |   |
|   | Día del Mes(1-31)  
|   |
| Hora(0-23)  
|
Min(0-59)
</code></pre><h4 id="ejemplos-de-trabajos-de-cron">Ejemplos de Trabajos de Cron</h4><p>Abajo hay algunos ejemplos de programación de trabajos de cron.</p><!--kg-card-begin: html--><table>
<thead>
<tr>
<th><strong>PROGRAMACIÓN</strong></th>
<th><strong>VALOR DE LA PROGRAMACIÓN</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td><code>5 0 * 8 *</code></td>
<td>A las 00:05 en Agosto.</td>
</tr>
<tr>
<td><code>5 4 * * 6</code></td>
<td>A las 04:05 el Sábado.</td>
</tr>
<tr>
<td><code>0 22 * * 1-5</code></td>
<td>A las 22:00 cada día de la semana desde Lunes hasta Viernes.</td>
</tr>
</tbody>
</table><!--kg-card-end: html--><p>No hay problema si no logras comprender todo esto de una vez. Puedes practicar y generar cronogramas con el sitio web <a href="https://crontab.guru/">crontab guru</a>.</p><h4 id="c-mo-configurar-un-trabajo-cron">Cómo configurar un trabajo cron</h4><p>En esta sección, veremos un ejemplo de cómo programar un script sencillo con un trabajo cron.</p><ol><li>Crea un script llamado <code>date-script.sh</code> el cual imprime la fecha y hora del sistema y lo adjunta a un archivo. El script se muestra abajo:</li></ol><pre><code class="language-bash">#!/bin/bash

echo `date` &gt;&gt; date-out.txt
</code></pre><p>2. &nbsp; Haz que el script sea ejecutable al darle derechos de ejecución.</p><pre><code class="language-bash">chmod 775 date-script.sh
</code></pre><p>3. &nbsp; Agrega el script en el crontab usando <code>crontab -e</code>.</p><p>Aquí, lo hemos programado para que se ejecute por minuto.</p><pre><code class="language-bash">*/1 * * * * /bin/sh /root/date-script.sh
</code></pre><p>4. &nbsp; Verifica la salida del archivo <code>date-out.txt</code>. Según el script, la fecha del sistema debería ser impreso a este archivo cada minuto.</p><pre><code class="language-bash">cat date-out.txt
# Salida
Wed 26 Jun 16:59:33 PKT 2024
Wed 26 Jun 17:00:01 PKT 2024
Wed 26 Jun 17:01:01 PKT 2024
Wed 26 Jun 17:02:01 PKT 2024
Wed 26 Jun 17:03:01 PKT 2024
Wed 26 Jun 17:04:01 PKT 2024
Wed 26 Jun 17:05:01 PKT 2024
Wed 26 Jun 17:06:01 PKT 2024
Wed 26 Jun 17:07:01 PKT 2024
</code></pre><p><strong>Cómo solucionar problemas de crons</strong></p><p>Los crons son realmente útiles, pero no podrían funcionar siempre como se espera. Afortunadamente, hay algunos métodos efectivos que puedes usar para solucionar problemas.</p><p><strong>1. Verifica la programación.</strong></p><p>Primero, puedes intentar verificar la programación que fue hecho para el cron. Puedes hacer eso con la sintaxis que viste en las secciones de arriba.</p><p><strong>2</strong>. <strong>Verificar archivos log de cron.</strong></p><p>Primero, necesita verificar si el con se ha ejecutado en el tiempo previsto o no. En Ubuntu, puedes verificarlo desde los logs de cron localizado en <code>/var/log/syslog</code>.</p><p>Si hay una entrada en estos logs en el tiempo correcto, significa que el cron se ha ejecutado según la planificación que estableciste.</p><p>Abajo están los logs de nuestro ejemplo de un trabajo de cron. Fíjate que la primer columna el cual muestra la marca de tiempo. La ruta del script también se menciona al final de la línea. Línea #1, 3, y 5 muestra que el script se ejecutó como se esperaba.</p><pre><code class="language-bash">1 Jun 26 17:02:01 zaira-ThinkPad CRON[27834]: (zaira) CMD (/bin/sh /home/zaira/date-script.sh)
2 Jun 26 17:02:02 zaira-ThinkPad systemd[2094]: Started Tracker metadata extractor.
3 Jun 26 17:03:01 zaira-ThinkPad CRON[28255]: (zaira) CMD (/bin/sh /home/zaira/date-script.sh)
4 Jun 26 17:03:02 zaira-ThinkPad systemd[2094]: Started Tracker metadata extractor.
5 Jun 26 17:04:01 zaira-ThinkPad CRON[28538]: (zaira) CMD (/bin/sh /home/zaira/date-script.sh)
</code></pre><p><strong>3. Redireccionar la salida del cron a un archivo.</strong></p><p>Puedes redireccionar una salida del cron a un archivo y verificar si el archivo tiene algún error posible.</p><pre><code class="language-bash"># Redirige la salida de cron a un archivo
* * * * * sh /path/to/script.sh &amp;&gt; log_file.log
</code></pre><!--kg-card-begin: html--><h3 id="conceptos-basicos-de-redes-de-linux">8.7. Conceptos Básicos de Redes de Linux</h3><!--kg-card-end: html--><p>Linux ofrece un número de comandos para ver la información relacionado a la red. En esta sección discutiremos brevemente algunos de los comandos.</p><h4 id="ver-interfaces-de-red-con-ifconfig">Ver interfaces de red con <code>ifconfig</code></h4><p>El comando <code>ifconfig</code> provee información sobre las interfaces de red. Aquí hay un ejemplo de salida:</p><pre><code class="language-bash">ifconfig

# Salida
eth0: flags=4163&lt;UP,BROADCAST,RUNNING,MULTICAST&gt;  mtu 1500
        inet 192.168.1.100  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 fe80::a00:27ff:fe4e:66a1  prefixlen 64  scopeid 0x20&lt;link&gt;
        ether 08:00:27:4e:66:a1  txqueuelen 1000  (Ethernet)
        RX packets 1024  bytes 654321 (654.3 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 512  bytes 123456 (123.4 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73&lt;UP,LOOPBACK,RUNNING&gt;  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10&lt;host&gt;
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 256  bytes 20480 (20.4 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 256  bytes 20480 (20.4 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
</code></pre><p>La salida del comando <code>ifconfig</code> muestra las interfaces de red configurados en el sistema, juntamente con detalles tales como direcciones IP, direcciones MAC, estadísticas de paquetes, y más.</p><p>Estas interfaces pueden ser dispositivos físicos o virtuales.</p><p>Para extraer las direcciones IPv4 y IPv6, puedes usar <code>ip -4 addr</code> y <code>ip -6 addr</code>, respectivamente.</p><p><strong>Ver la actividad de red con</strong> <code>netstat</code></p><p>El comando <code>netstat</code> muestra las estadísticas y la actividad de la red al dar la siguiente información:</p><p>Aquí hay algunos ejemplos al usar el comando <code>netstat</code> en la línea de comandos:</p><p><strong>Muestra todos los sockets de escucha y no escucha:</strong></p><pre><code class="language-bash"> netstat -a
</code></pre><p><strong>Muestra solamente los puertos en escucha:</strong></p><pre><code class="language-bash"> netstat -l
</code></pre><p><strong>Muestra las estadísticas de red:</strong></p><pre><code class="language-bash"> netstat -s
</code></pre><p><strong>Muestra la tabla de enrutamiento:</strong></p><pre><code class="language-bash"> netstat -r
</code></pre><p><strong>Muestra las conexiones TCP:</strong></p><pre><code class="language-bash"> netstat -t
</code></pre><p><strong>Muestra las conexiones UDP:</strong></p><pre><code class="language-bash"> netstat -u
</code></pre><p><strong>Muestra las interfaces de red:</strong></p><pre><code class="language-bash"> netstat -i
</code></pre><p><strong>Muestra el PID y los nombres de programa para las conexiones:</strong></p><pre><code class="language-bash"> netstat -p
</code></pre><p><strong>Muestra las estadísticas para un protocolo específico (por ejemplo, TCP):</strong></p><pre><code class="language-bash"> netstat -st
</code></pre><p><strong>Mostrar información extendida:</strong></p><pre><code class="language-bash">netstat -e
</code></pre><h4 id="verifica-la-conectividad-de-red-entre-dos-dispositivos-usando-ping">Verifica la conectividad de red entre dos dispositivos usando <code>ping</code></h4><p><code>ping</code> se usa para probar la conectividad de red entre dos dispositivos. Envía paquetes ICMP al dispositivo objetivo y espera una respuesta.</p><pre><code class="language-bash">ping google.com
</code></pre><p><code>ping</code> prueba si obtienes una respuesta sin recibir un tiempo de espera.</p><pre><code class="language-bash">ping google.com
PING google.com (142.250.181.46) 56(84) bytes of data.
64 bytes from fjr04s06-in-f14.1e100.net (142.250.181.46): icmp_seq=1 ttl=60 time=78.3 ms
64 bytes from fjr04s06-in-f14.1e100.net (142.250.181.46): icmp_seq=2 ttl=60 time=141 ms
64 bytes from fjr04s06-in-f14.1e100.net (142.250.181.46): icmp_seq=3 ttl=60 time=205 ms
64 bytes from fjr04s06-in-f14.1e100.net (142.250.181.46): icmp_seq=4 ttl=60 time=100 ms
^C
--- google.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3001ms
rtt min/avg/max/mdev = 78.308/131.053/204.783/48.152 ms
</code></pre><p>Puedes detener la respuesta con <code>Ctrl + C</code>.</p><h4 id="probando-recursos-con-el-comando-curl">Probando recursos con el comando <code>curl</code></h4><p>El comando <code>curl</code> significa "URL del cliente". Se usa para transferir datos a un o de un servidor. También puede ser usado para probar recursos de una API lo que ayuda en solucionar errores de sistema y de aplicaciones.</p><p>Como un ejemplo, puedes usar <a href="http://www.official-joke-api.appspot.com/"><code>http://www.official-joke-api.appspot.com/</code></a> para experimentar con el comando <code>curl</code>.</p><ul><li>El comando <code>curl</code> sin ninguna opción usa el método GET por defecto.</li></ul><pre><code class="language-bash">curl http://www.official-joke-api.appspot.com/random_joke
{"type":"general",
"setup":"What did the fish say when it hit the wall?","punchline":"Dam.","id":1}
</code></pre><ul><li><code>curl -o</code> guarda la salida al archivo mencionado.</li></ul><pre><code class="language-bash">curl -o random_joke.json http://www.official-joke-api.appspot.com/random_joke
# saves the output to random_joke.json
</code></pre><ul><li><code>curl -I</code> busca solamente las cabeceras.</li></ul><pre><code class="language-bash">curl -I http://www.official-joke-api.appspot.com/random_joke
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Vary: Accept-Encoding
X-Powered-By: Express
Access-Control-Allow-Origin: *
ETag: W/"71-NaOSpKuq8ChoxdHD24M0lrA+JXA"
X-Cloud-Trace-Context: 2653a86b36b8b131df37716f8b2dd44f
Content-Length: 113
Date: Thu, 06 Jun 2024 10:11:50 GMT
Server: Google Frontend
</code></pre><!--kg-card-begin: html--><h3 id="solucionando-problemas-linux-herramientas-y-tecnicas">8.8. Solucionando problemas de Linux: Herramientas y Técnicas</h3><!--kg-card-end: html--><h4 id="reporte-de-actividad-del-sistema-con-sar">Reporte de actividad del Sistema con <code>sar</code></h4><p>El comando <code>sar</code> en Linux es una herramienta poderosa para recolectar, reportar, y guardar información de estadísticas del sistema. Es parte del paquete <code>sysstat</code> y es ampliamente usado para monitorear el rendimiento del sistema con el tiempo.</p><p>Para usar <code>sar</code> primero necesitas instalar <code>sysstat</code> usando <code>sudo apt install sysstat</code>.</p><p>Una vez instalado, comienza el servicio con <code>sudo systemctl start sysstat</code>.</p><p>Verifica el estado con <code>sudo systemctl status sysstat</code>.</p><p>Una vez que el estado esté activo, el sistema comenzará a recolectar varias estadísticas que puedes usar para acceder y analizar datos históricos. Veremos eso en detalle pronto.</p><p>La sintaxis del comando <code>sar</code> es como sigue:</p><pre><code class="language-bash">sar [opciones] [intervalo] [cuenta]
</code></pre><p>Por ejemplo, <code>sar -u 1 3</code> mostrará el uso de estadísticas del CPU por segundo tres veces.</p><pre><code class="language-bash">sar -u 1 3
# Salida
Linux 6.5.0-28-generic (zaira-ThinkPad)     04/06/24     _x86_64_    (12 CPU)

19:09:26        CPU     %user     %nice   %system   %iowait    %steal     %idle
19:09:27        all      3.78      0.00      2.18      0.08      0.00     93.96
19:09:28        all      4.02      0.00      2.01      0.08      0.00     93.89
19:09:29        all      6.89      0.00      2.10      0.00      0.00     91.01
Average:        all      4.89      0.00      2.10      0.06      0.00     92.95
</code></pre><p>Aquí hay algunos de los casos de uso comunes y ejemplos de cómo usar el comando <code>sar</code>.</p><p><code>sar</code> puede ser usado para una variedad de propósitos:</p><h5 id="1-uso-de-memoria">1. Uso de Memoria</h5><p>Para verificar el uso de memoria (libre y usado), usa:</p><pre><code class="language-bash">sar -r 1 3

Linux 6.5.0-28-generic (zaira-ThinkPad)     04/06/24     _x86_64_    (12 CPU)

19:10:46    kbmemfree   kbavail kbmemused  %memused kbbuffers  kbcached  kbcommit   %commit  kbactive   kbinact   kbdirty
19:10:47      4600104   8934352   5502124     36.32    375844   4158352  15532012     65.99   6830564   2481260       264
19:10:48      4644668   8978940   5450252     35.98    375852   4165648  15549184     66.06   6776388   2481284        36
19:10:49      4646548   8980860   5448328     35.97    375860   4165648  15549224     66.06   6774368   2481292       116
Average:      4630440   8964717   5466901     36.09    375852   4163216  15543473     66.04   6793773   2481279       139
</code></pre><p>Este comando muestra las estadísticas de memoria cada segundo tres veces.</p><h5 id="2-utilizaci-n-del-espacio-de-intercambio-swap-">2. Utilización del espacio de intercambio (Swap)</h5><p>Para ver las estadísticas del uso del espacio de swap, usa:</p><pre><code class="language-bash">sar -S 1 3

sar -S 1 3
Linux 6.5.0-28-generic (zaira-ThinkPad)     04/06/24     _x86_64_    (12 CPU)

19:11:20    kbswpfree kbswpused  %swpused  kbswpcad   %swpcad
19:11:21      8388604         0      0.00         0      0.00
19:11:22      8388604         0      0.00         0      0.00
19:11:23      8388604         0      0.00         0      0.00
Average:      8388604         0      0.00         0      0.00
</code></pre><p>Este comando ayuda en monitorear el uso de swap, lo cual es crucial para los sistemas que quedan sin espacio de memoria física.</p><h5 id="3-carga-de-dispositivos-i-o">3. Carga de dispositivos I/O</h5><p>Para reportar actividad de dispositivos de bloque y particiones de dispositivos de bloque:</p><pre><code class="language-bash">sar -d 1 3
</code></pre><p>Este comando provee estadísticas detallados sobre las transferencias de datos de los dispositivos de bloque, y es útil para diagnosticar cuellos de botella de I/O.</p><h5 id="5-estad-sticas-de-red">5. Estadísticas de Red</h5><p>Para ver las estadísticas de red, como el número de paquetes recibidos (transmitidos) por la interfaz de red:</p><pre><code class="language-bash">sar -n DEV 1 3
# -n DEV le dice a sar que reporte interfaces de dispositivos de red
sar -n DEV 1 3
Linux 6.5.0-28-generic (zaira-ThinkPad)     04/06/24     _x86_64_    (12 CPU)

19:12:47        IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
19:12:48           lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
19:12:48       enp2s0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
19:12:48       wlp3s0     10.00      3.00      1.83      0.37      0.00      0.00      0.00      0.00
19:12:48    br-5129d04f972f      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
.
.
.

Average:        IFACE   rxpck/s   txpck/s    rxkB/s    txkB/s   rxcmp/s   txcmp/s  rxmcst/s   %ifutil
Average:           lo      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
Average:       enp2s0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00
...output truncated...
</code></pre><p>Esto muestra las estadísticas de red cada segundo por tres segundos, lo que ayuda en monitorear el tráfico de red.</p><h5 id="6-datos-hist-ricos">6. Datos históricos</h5><p>Recuerda que instalamos el paquete <code>sysstat</code> previamente &nbsp;y ejecutamos el servicio. Sigue los pasos de abajo para permitir y acceder a los datos históricos.</p><p><strong>Permitir recolección de datos:</strong> Edita el archivo de configuración <code>sysstat</code> para permitir la recolección de datos.</p><pre><code class="language-bash"> sudo nano /etc/default/sysstat
</code></pre><p>Cambia <code>ENABLED="false"</code> a <code>ENABLED="true"</code>.</p><pre><code class="language-bash"> vim /etc/default/sysstat
 #
 # Configuraciones predeterminadas para los archivos /etc/init.d/sysstat, /etc/cron.d/sysstat
 # y /etc/cron.daily/sysstat
 #

 # ¿Debería sadc recolectar información de la actividad del sistema? Valores válidos
 # son "true" y "false". Por favor no pongas otros valores, serán
 # anulados por debconf!
 ENABLED="true"
</code></pre><p><strong>Configura el intervalo de recolección de datos:</strong> Edita la configuración del trabajo de cron para poner el intervalo de recolección de datos.</p><pre><code class="language-bash"> sudo nano /etc/cron.d/sysstat
</code></pre><p>Por defecto, recolecta datos cada 10 minutos. Puedes ajustar el intervalo al modificar la planificación del trabajo de cron. Los archivos relevantes irán a la carpeta <code>/var/log/sysstat</code>.</p><p><strong>Ver los datos históricos:</strong> Usa el comando <code>sar</code> para ver los datos históricos. Por ejemplo, para ver el uso del CPU para el día actual:</p><pre><code class="language-bash"> sar -u
</code></pre><p>Para ver los datos desde una fecha específica:</p><pre><code class="language-bash"> sar -u -f /var/log/sysstat/sa&lt;DD&gt;
</code></pre><p>Reemplaza <code>&lt;DD&gt;</code> con el día del mes con el cual quieres ver los datos.</p><p>En el comando de abajo, <code>/var/log/sysstat/sa04</code> provee estadísticas para el cuarto día del mes actual.</p><pre><code class="language-bash">sar -u -f /var/log/sysstat/sa04
Linux 6.5.0-28-generic (zaira-ThinkPad)     04/06/24     _x86_64_    (12 CPU)

15:20:49     LINUX RESTART    (12 CPU)

16:13:30     LINUX RESTART    (12 CPU)

18:16:00        CPU     %user     %nice   %system   %iowait    %steal     %idle
18:16:01        all      0.25      0.00      0.67      0.08      0.00     99.00
Average:        all      0.25      0.00      0.67      0.08      0.00     99.00
</code></pre><h5 id="7-interrupciones-de-la-cpu-en-tiempo-real">7. Interrupciones de la CPU en tiempo real</h5><p>Para observar interrupciones en tiempo real por segundo servido por la CPU, usa este comando:</p><pre><code class="language-bash">sar -I SUM 1 3

# Salida
Linux 6.5.0-28-generic (zaira-ThinkPad)     04/06/24     _x86_64_    (12 CPU)

19:14:22         INTR    intr/s
19:14:23          sum   5784.00
19:14:24          sum   5694.00
19:14:25          sum   5795.00
Average:          sum   5757.67
</code></pre><p>Este comando ayuda a monitorear con cuanta frecuencia la CPU maneja las interrupciones, lo cual puede ser crucial para ajuste de rendimiento en tiempo real.</p><p>Estos ejemplos ilustran cómo puedes usar <code>sar</code> para monitorear varios aspectos del rendimiento de sistema. El uso regular de <code>sar</code> puede ayudar a identificar los cuellos de botella del sistema y asegurar que las aplicaciones se mantenga ejecutando de forma eficiente.</p><!--kg-card-begin: html--><h3 id="estrategia-general-para-solucionar-problemas-servidores">8.9. Estrategia General para Solucionar Problemas para los Servidores</h3><!--kg-card-end: html--><p><strong>¿Por qué necesitamos entender sobre monitoreo?</strong></p><p>El monitoreo de sistema es un aspecto importante de la administración de sistema. Las aplicaciones críticas demandan un alto nivel de proactividad para prevenir fallas y reducir el impacto de cortes.</p><p>Linux ofrece herramientas muy potentes para medir la salud del sistema. En esta sección, aprenderás sobre los varios métodos disponibles para verificar la salud del sistema e identificar los cuellos de botella.</p><h4 id="encontrar-el-promedio-de-carga-y-tiempo-de-actividad-del-sistema">Encontrar el promedio de carga y tiempo de actividad del sistema</h4><p>Los reinicios de sistema podría ocurrir lo cual puede a veces arruinar algunas configuraciones. Para verificar cuánto tiempo la máquina estuvo activa, usa el comando: <code>uptime</code>. Además del tiempo de actividad, el comando también muestra el promedio de carga.</p><pre><code class="language-bash">[user@host ~]$ uptime 19:15:00 up 1:04, 0 users, load average: 2.92, 4.48, 5.20
</code></pre><p>El promedio de carga es la carga del sistema durante los minutos 1, 5 y 15. Un vistazo rápido indica si la carga de sistema está en incremento o disminuyendo con el tiempo.</p><p>Nota: la cola de CPU ideal es <code>0</code>. Esto es posible solamente cuando no hay colas de espera para la CPU.</p><p>Cada carga de CPU puede ser calculado al dividir el promedio de carga con el número total de CPUs disponibles.</p><p>Para encontrar el número de CPUs, usa el comando <code>lscpu</code>.</p><pre><code class="language-bash">lscpu
# Salida
Architecture:            x86_64
  CPU op-mode(s):        32-bit, 64-bit
  Address sizes:         48 bits physical, 48 bits virtual
  Byte Order:            Little Endian
CPU(s):                  12
  On-line CPU(s) list:   0-11
.
.
.
Salida omitido
</code></pre><p>Si el promedio de carga parece incrementar y no se va para abajo, los CPUs están sobrecargados. Hay algún proceso que está estancado o hay fuga de memoria.</p><h4 id="calculando-memoria-libre">Calculando memoria libre</h4><p>A veces, el alto uso de memoria podría causar problemas. Para verificar la memoria disponible y la memoria en uso, usa el comando <code>free</code>.</p><pre><code class="language-bash">free -mh
# Salida
               total        used        free      shared  buff/cache   available
Mem:            14Gi       3.5Gi       7.7Gi       109Mi       3.2Gi        10Gi
Swap:          8.0Gi          0B       8.0Gi
</code></pre><h4 id="calculando-el-espacio-de-disco">Calculando el espacio de disco</h4><p>Para asegurarse que el sistema está saludable, no te olvides sobre el espacio de disco. Para listar todos los puntos de montaje disponible y su porcentaje usado respectivamente, usa el comando de abajo. Idealmente, los espacios de disco utilizados no deberían exceder un 80%.</p><p>El comando <code>df</code> provee espacios de disco detallados.</p><pre><code class="language-bash">df -h
Filesystem      Size  Used Avail Use% Mounted on
tmpfs           1.5G  2.4M  1.5G   1% /run
/dev/nvme0n1p2  103G   34G   65G  35% /
tmpfs           7.3G   42M  7.2G   1% /dev/shm
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
efivarfs        246K   93K  149K  39% /sys/firmware/efi/efivars
/dev/nvme0n1p3  130G   47G   77G  39% /home
/dev/nvme0n1p1  511M  6.1M  505M   2% /boot/efi
tmpfs           1.5G  140K  1.5G   1% /run/user/1000
</code></pre><h4 id="determinando-los-estados-de-proceso">Determinando los estados de proceso</h4><p>Los estados de proceso pueden ser monitoreados para ver cualquier proceso estancado con un alto uso de memoria o de CPU.</p><p>Vimos anteriormente que el comando <code>ps</code> nos da información útil sobre un proceso. Pega un vistazo a las columnas <code>CPU</code> y <code>MEM</code>.</p><pre><code class="language-bash">[user@host ~]$ ps aux
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
 runner         1  0.1  0.0 1535464 15576 ?       S  19:18   0:00 /inject/init
 runner        14  0.0  0.0  21484  3836 pts/0    S   19:21   0:00 bash --norc
 runner        22  0.0  0.0  37380  3176 pts/0    R+   19:23   0:00 ps aux
</code></pre><h4 id="monitoreo-del-sistema-en-tiempo-real">Monitoreo del sistema en tiempo real</h4><p>El monitoreo en tiempo real provee una ventana en el estado del sistema en tiempo real.</p><p>Una utilidad que puedes usar para hacer esto es el comando <code>top</code>.</p><p>El comando de arriba muestra una vista dinámica de los procesos del sistema, mostrando un resumen de la cabecera seguido de un proceso o una lista de hilos. A diferencia de su contraparte estática <code>ps</code>, <code>top</code> refresca continuamente las estadísticas del sistema.</p><p>Con <code>top</code>, puedes ver detalles bien organizados en una ventana compacta. Hay un número de argumentos, atajos y métodos resaltados que vienen junto con <code>top</code>.</p><p>También puedes matar procesos usando <code>top</code>. Para eso, presiona <code>k</code> y luego ingresa el id del proceso.</p><h4 id="interpretando-archivos-log">Interpretando archivos log</h4><p>Los archivos log de sistema y de aplicaciones conllevan muchísima información sobre el cual el sistema está pasando. Contienen información útil y códigos de error que apuntan a errores. Si buscas códigos de errores en los archivos log, la identificación de problemas y el tiempo de rectificación pueden ser reducidos enormemente.</p><h4 id="an-lisis-de-puertos-de-red">Análisis de puertos de Red</h4><p>El aspecto de red no debería ser ignorado ya que los fallos de red son comunes y podrían impactar en el sistema y en el flujo de tráfico. Problemas de red comunes incluyen agotamiento de puerto, asfixia de puerto, recursos sin liberarse, etcétera.</p><p>Para identificar tales problemas, necesitamos entender los estados de puerto.</p><p>Algunos de los estados de puertos son explicados de forma breve aquí:</p><!--kg-card-begin: html--><table>
<thead>
<tr>
<th><strong>Estado</strong></th>
<th><strong>Descripción</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td>LISTEN</td>
<td>Representa a los puertos que están esperando una solicitud de conexión de cualquier TCP y puerto remoto.</td>
</tr>
<tr>
<td>ESTABLISHED</td>
<td>Representa a las conexiones que están abiertas y los datos recibidos pueden ser entregados a su destino.</td>
</tr>
<tr>
<td>TIME WAIT</td>
<td>Representa el tiempo de espera para asegurar el reconocimiento de su solicitud de terminación de la conexión.</td>
</tr>
<tr>
<td>FIN WAIT2</td>
<td>Representa la espera de una solicitud de terminación de conexión del TCP remoto.</td>
</tr>
</tbody>
</table><!--kg-card-end: html--><p>Exploremos cómo podemos analizar la información relacionado a los puertos en Linux.</p><p><strong>Rangos de Puerto:</strong> Los rangos de puerto son definidos en el sistema, y los rangos pueden ser aumentados/disminuidos respectivamente. En el fragmento de abajo, el rango es desde <code>15000</code> a <code>65000</code>, lo cual hace un total de <code>50000</code> (65000 - 15000) de puertos disponibles. Si los puertos utilizados están alcanzando o excediendo este límite, entonces hay un problema.</p><pre><code class="language-bash">[user@host ~]$ /sbin/sysctl net.ipv4.ip_local_port_range
net.ipv4.ip_local_port_range = 15000    65000
</code></pre><p>El error reportado en los archivos log en tales casos puede ser <code>Failed to bind to port</code> o <code>Too many connections</code>.</p><h4 id="identificando-p-rdidas-de-paquetes">Identificando pérdidas de paquetes</h4><p>En el monitoreo de sistema, necesitamos asegurarnos que la comunicación entrante y saliente está intacto.</p><p>Un comando útil es <code>ping</code>. <code>ping</code> llega al sistema destinatario y trae de vuelta la respuesta. Fíjate que las últimas pocas líneas de estadísticas que muestran el porcentaje y tiempo de la pérdida de los paquetes.</p><pre><code class="language-bash"># ping IP destinatario
[user@host ~]$ ping 10.13.6.113
 PING 10.13.6.141 (10.13.6.141) 56(84) bytes of data.
 64 bytes from 10.13.6.113: icmp_seq=1 ttl=128 time=0.652 ms
 64 bytes from 10.13.6.113: icmp_seq=2 ttl=128 time=0.593 ms
 64 bytes from 10.13.6.113: icmp_seq=3 ttl=128 time=0.478 ms
 64 bytes from 10.13.6.113: icmp_seq=4 ttl=128 time=0.384 ms
 64 bytes from 10.13.6.113: icmp_seq=5 ttl=128 time=0.432 ms
 64 bytes from 10.13.6.113: icmp_seq=6 ttl=128 time=0.747 ms
 64 bytes from 10.13.6.113: icmp_seq=7 ttl=128 time=0.379 ms
 ^C
 --- 10.13.6.113 ping statistics ---
 7 packets transmitted, 7 received,0% packet loss, time 6001ms
 rtt min/avg/max/mdev = 0.379/0.523/0.747/0.134 ms
</code></pre><p>Los paquetes también pueden ser capturados en tiempo de ejecución usando <code>tcpdump</code>. Veremos esto más adelante.</p><h4 id="reuniendo-estad-sticas-para-problemas-cr-ticos">Reuniendo estadísticas para problemas críticos</h4><p>Siempre es una buena práctica reunir ciertas estadísticas que sería útil para identificar la causa raíz luego. Usualmente, después del reinicio del sistema o del reinicio de los servicios, perdemos los instantáneos y archivos log previos del sistema.</p><p>Abajo hay algunos de los métodos para capturar el instantáneo del sistema.</p><ul><li><strong>Copia de seguridad de los Archivos Log</strong></li></ul><p>Antes de hacer cualquier cambio, copia los archivos log a otra ubicación. Esto es crucial para entender en qué condición estaba el sistema durante el tiempo del problema. A veces los archivos de registro son la única ventana para ver los estados anteriores del sistema ya que se pierden otras estadísticas de tiempo de ejecución.</p><ul><li><strong>TCP Dump</strong></li></ul><p>Tcpdump es una utilidad de línea de comandos que te permiten capturar y analizar tráfico de red entrante y saliente. Es mayormente usado para ayudar a solucionar problemas de red. Si sientes que el tráfico de sistema está siendo impactado, toma a <code>tcpdump</code> como sigue:</p><pre><code class="language-bash">sudo tcpdump -i any -w

# Donde,
# -i any captura tráfico de todas las interfaces
# -w especifica la salida del nombre de archivo

# Para el comando después de unos pocos mins ya que el tamaño del archivo podría incrementar
# usa la extensión de archivo como .pcap
</code></pre><p>Una vez que el <code>tcpdump</code> es capturado, puedes usar herramientas como Wireshark para analizar el tráfico de forma visual.</p><!--kg-card-begin: html--><h3 id="conclusion">Conclusión</h3><!--kg-card-end: html--><p>Gracias por leer el libro hasta el final. Si lo encontraste útil, considera compartirlo con los demás.</p><p>Este libro no termina aquí. Continuaré mejorándolo y agregando nuevos materiales en el futuro. Si encontraste algún problema o te gustaría sugerir alguna mejora, <a href="https://github.com/zairahira/Mastering-Linux-Handbook">no dudes en abrir una PR / Issue</a>.</p><p><strong>¡Manténte conectado y continúa tu jornada de aprendizaje!</strong></p><p>Tu jornada con Linux no tiene que terminar aquí. Manténte contectado y lleva tus habilidades al siguiente nivel:</p><ol><li><strong>Sígueme en las redes sociales</strong>:</li><li><a href="https://twitter.com/hira_zaira"><strong>X</strong></a>: Comparto contenido útil de forma corta allí. Mi DMs están siempre abiertos.</li><li><a href="https://www.linkedin.com/in/zaira-hira/"><strong>LinkedIn</strong></a>: Comparto artículos y posts sobre tech allí. Deja una recomendación en LinkedIn y apóyame en habilidades relevantes.</li><li><strong>Obtén acceso a contenido exclusivo</strong>: Para una ayuda personal y contenido exclusivo ve <a href="https://buymeacoffee.com/zairah/extras">aquí</a>.</li></ol><p>Mis <a href="https://www.freecodecamp.org/news/author/zaira/">artículos</a> y libros, como este, son parte de mi misión para aumentar el acceso a contenido de calidad para todos. Este libro también estará abierto para ser traducido a otros idiomas. Cada pieza toma mucho tiempo y esfuerzo para escribir. Este libro estará gratuito, para siempre. Si has disfrutado mi trabajo y quieres mantenerme motivado, considera <a href="https://buymeacoffee.com/zairah">comprarme un café</a>.</p><p>Gracias una vez más y, ¡feliz aprendizaje!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Cómo construir tu propia VPN en WireGuard en sólo 5 Minutos ]]>
                </title>
                <description>
                    <![CDATA[ Quizás ya comprendas lo importante que puede ser una buena VPN para mantener la seguridad y privacidad de tus comunicaciones móviles. Ya sea que necesites usar tu teléfono para realizar operaciones bancarias a través de una conexión WIFI del aeropuerto o de una cafetería pública, o estás preocupado porque alguna ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-construir/</link>
                <guid isPermaLink="false">66755a7ab6f94103d5aef997</guid>
                
                    <category>
                        <![CDATA[ vpn ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Linux ]]>
                    </category>
                
                    <category>
                        <![CDATA[ wireguard ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Diego Lopez ]]>
                </dc:creator>
                <pubDate>Mon, 08 Jul 2024 11:52:15 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2024/07/pexels-ibrahim-boran-339814.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/build-your-own-wireguard-vpn-in-five-minutes/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Build Your Own Wireguard VPN in Five Minutes</a>
      </p><p>Quizás ya comprendas lo importante que puede ser una buena VPN para mantener la seguridad y privacidad de tus comunicaciones móviles.</p><p>Ya sea que necesites usar tu teléfono para realizar operaciones bancarias a través de una conexión WIFI del aeropuerto o de una cafetería pública, o estás preocupado porque alguna persona equivocada esté escuchando tus interacciones en línea, la encriptación en túnel que brinda una buena VPN puede ser invaluable.</p><p>El truco, sin embargo, es encontrar una VPN que sea realmente "buena" - y una que sea conveniente y asequible.</p><p>Existen muchos servicios de VPN, y configurar una VPN en tu teléfono o laptop suele ser bastante sencillo.</p><p>Pero algunos servicios vienen con dos desventajas potenciales: son muy costosos, con pagos que promedian alrededor de los $10 mensuales, y nunca puedes estar 100% seguro que no estén (ya sea accidentalmente o a propósito) filtrando o haciendo un mal uso de tus datos.</p><p>Además, VPNs económicas a menudo limitan el uso de tus datos y el número de dispositivos que puedas conectar.</p><p>Si te gusta ver versiones en vídeo de tutoriales para complementar tu aprendizaje, no dudes en seguirlos aquí:</p><figure class="kg-card kg-embed-card" data-test-label="fitted">
        <div class="fluid-width-video-container">
          <div style="padding-top: 56.49999999999999%;" class="fluid-width-video-wrapper">
            <iframe width="200" height="113" src="https://www.youtube.com/embed/kxj8GMvnASE?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="" title="Build Your Own Wireguard VPN in 5 Minutes (some restrictions may apply)" name="fitvid0"></iframe>
          </div>
        </div>
      </figure><h2 id="lo-que-ofrece-wireguard">Lo que ofrece WireGuard</h2><p>Pero si de todos modos tienes un servidor Linux basado en la nube ejecutándose, construir una VPN en WireGuard puede ser una forma sencilla y gratuita para agregar algunas medidas serias, como seguridad y privacidad sin compromisos para tu vida.</p><p>Si planeas limitar la VPN para algunos dispositivos de tu propiedad y de algunos amigos, probablemente nunca jamás notarás una carga de recursos adicionales en tu servidor. Incluso si has activado y pagado por una instancia reservada en AWS EC2 tw.micro, los costos anuales deberían seguir siendo significativamente más baratos que los de la mayoría de las VPN comerciales. Y, como bono adicional, tendrás completo control sobre tus datos.</p><p>Ahora te voy a mostrar cómo todo eso debería funcionar usando un software de código abierto en WireGuard en un Servidor de Linux Ubuntu.</p><p>¿Porqué WireGuard? Porque es realmente fácil de usar, está diseñado para ser particularmente resistente a ataques, y es muy bueno en lo que hace que fue recientemente incorporado dentro del propio kernel de Linux.</p><p>El trabajo actual para que esto ocurra realmente tomará sólo cinco minutos - o menos. Una vez dicho esto, planear las cosas, solucionar los problemas de configuración inesperados y, si es necesario, lanzar un nuevo servidor podría agregar tiempo significante al proyecto.</p><h2 id="-c-mo-configurar-el-entorno">¿Cómo configurar el Entorno?</h2><p>Primero que nada, necesitas tener abierto el puerto UDP <code>51820</code> en cualquier firewall que estés utilizando. Así es como vería el grupo de seguridad asociado con una instancia AWS EC2:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2024/06/SG_rule-2.png" class="kg-image" alt="SG_rule-2" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2024/06/SG_rule-2.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2024/06/SG_rule-2.png 1000w" sizes="(min-width: 720px) 720px" width="1000" height="566" loading="lazy"></figure><p>Ahora, en el servidor de Linux, usando un comando de <code>sudo</code>, empezaremos instalando WireGuard y los paquetes de resolvconf.</p><p>Técnicamente o probablemente no necesitemos resolvconf aquí, pero como eso es lo que necesitarías si quisieras configurar una máquina virtual de Linux, como un cliente de WireGuard, pensé agregarlo aquí.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2024/06/Captura-de-pantalla-2024-06-27-124426.png" class="kg-image" alt="Captura-de-pantalla-2024-06-27-124426" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2024/06/Captura-de-pantalla-2024-06-27-124426.png 600w, https://www.freecodecamp.org/espanol/news/content/images/2024/06/Captura-de-pantalla-2024-06-27-124426.png 661w" width="661" height="82" loading="lazy"></figure><h2 id="-c-mo-generar-claves-de-cifrado">¿Cómo generar Claves de Cifrado?</h2><p>El comando <code>wg genkey</code> genera una nueva clave de cifrado privada y lo guarda como un archivo en el directorio <code>/etc/wireguard</code>. Este directorio fue automáticamente creado cuándo instalamos WireGuard.</p><p>El comando <code>chmod</code> establece los permisos de restricción apropiados para ese archivo de clave privada.</p><p>Como todo en Linux, hay otras manera de realizar esto, pero solo asegúrate de hacerlo bien.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2024/07/Captura-de-pantalla-2024-07-03-120402.png" class="kg-image" alt="Captura-de-pantalla-2024-07-03-120402" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2024/07/Captura-de-pantalla-2024-07-03-120402.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2024/07/Captura-de-pantalla-2024-07-03-120402.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/2024/07/Captura-de-pantalla-2024-07-03-120402.png 1074w" sizes="(min-width: 720px) 720px" width="1074" height="117" loading="lazy"></figure><p>A continuación, usaremos el valor de nuestra clave privada para generar una clave pública correspondiente, la cual también se guardará en el directorio <code>/etc/wireguard</code>. El objetivo es agregar la clave pública del servidor a la configuración de WireGuard en todos los dispositivos cliente que usaremos, y luego agregar las claves públicas de esos clientes a la configuración del servidor aquí.</p><p>Las claves privadas nunca deben salir de las máquinas para las que se crean, y siempre deben protegerse cuidadosamente.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2024/07/imagen-2.png" class="kg-image" alt="imagen-2" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2024/07/imagen-2.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2024/07/imagen-2.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/2024/07/imagen-2.png 1063w" sizes="(min-width: 720px) 720px" width="1063" height="79" loading="lazy"></figure><h2 id="c-mo-configurar-el-servidor-de-wireguard">Cómo configurar el Servidor de WireGuard</h2><p>Ya estamos listos para crear un archivo de configuración del servidor. Siguiendo la convención, nombraré el archivo <code>wg0.conf</code>, pero puedes darle el nombre que desees. También puedes tener múltiples configuraciones (con diferentes nombres de archivo) existiendo al mismo tiempo.</p><p>Así se verá nuestra configuración:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2024/07/imagen3.png" class="kg-image" alt="imagen3" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2024/07/imagen3.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2024/07/imagen3.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/2024/07/imagen3.png 1056w" sizes="(min-width: 720px) 720px" width="1056" height="579" loading="lazy"></figure><p>Ten en cuenta que este archivo tiene tres secciones: una Interfaz y dos pares. La sección Interfaz define la dirección de red privada NAT que usará nuestro servidor. Esta es la dirección privada a la que se conectarán los clientes, después de solicitar primero el acceso a través de la dirección IP pública del servidor, por supuesto.</p><p>No es necesario que sigas mi ejemplo de dirección, siempre y cuando uses un rango de IP privada válido que no se superponga con ningún bloque de red utilizado por tu servidor o cliente.</p><p>En concordancia con la regla del grupo de seguridad UDP que configuré anteriormente en AWS, estoy definiendo el ListenPort como <code>51820</code>. Sin embargo, podría elegir un puerto diferente para agregar un poco más de seguridad si lo desearas.</p><p>Finalmente, pegaría la Clave Privada del servidor como valor de PrivateKey para que WireGuard pueda autenticar las solicitudes entrantes de los clientes.</p><p>La primera sección <code>peer</code> no contiene nada más que la clave pública y la dirección IP privada asignada de un cliente. La segunda sección <code>peer</code> hace lo mismo para una segunda máquina cliente.</p><p>Obtener las claves públicas de los clientes es la tarea más manual en toda esta configuración. Pero, como se trata de tu propia VPN, normalmente puedes encontrar una forma de copiar y pegar directamente en la configuración de tu servidor para no tener que escribir todo dolorosamente a mano.</p><p>Eso debería ser todo. Usaré el comando <code>wg-quick</code> para activar la VPN. <code>up</code> le indica a WireGuard que lea la configuración <code>wg0.conf</code> que acabamos de crear y la use para construir una nueva interfaz VPN.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2024/07/imagen4.png" class="kg-image" alt="imagen4" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2024/07/imagen4.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2024/07/imagen4.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/2024/07/imagen4.png 1053w" sizes="(min-width: 720px) 720px" width="1053" height="82" loading="lazy"></figure><p>Ejecutar <code>wg</code> nos mostrará que funcionó. Finalmente, ejecutaré <code>systemctl enable &lt;nombre_del_servicio&gt;</code> para indicarle a Linux que cargue esta interfaz WireGuard automáticamente cada vez que el servidor se reinicie.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2024/07/imagen5.png" class="kg-image" alt="imagen5" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2024/07/imagen5.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2024/07/imagen5.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/2024/07/imagen5.png 1060w" sizes="(min-width: 720px) 720px" width="1060" height="79" loading="lazy"></figure><h2 id="c-mo-configurar-el-cliente-wireguard">Cómo configurar el Cliente WireGuard</h2><p>Eso es todo lo que necesitaremos del lado del servidor. Configurar tu dispositivo cliente con WireGuard será mucho más fácil o más o menos lo mismo.</p><p>¿A qué me refiero con más o menos lo mismo? Bueno, si estás trabajando con Windows, macOS, Android o iOS, entonces hay enlaces a aplicaciones GUI disponibles en esta página . Esas aplicaciones generarán pares de claves para ti. Sólo necesitarás ingresar la dirección IP o el dominio del servidor y su clave pública. Luego, tomarás la clave pública del cliente y la agregarás al archivo <code>wg0.conf</code> del servidor de la forma que te mostré anteriormente.</p><p>Sin embargo, si se trata de un cliente de PC o portátil Linux que deseas agregar, entonces es un poco más complicado. Básicamente, seguirás todos los pasos que viste para la configuración del servidor, incluida la generación de claves. Incluso crearás un archivo de configuración llamado <code>wg0.conf</code> (si ese es el nombre que te gusta). Pero así es como debería verse ese archivo de configuración:</p><pre><code>[Interface]
# La dirección que tu computadora usará en el VPN
Address = 10.5.5.2/32
DNS = 8.8.8.8
# Carga tu clave privada desde el archivo
PostUp = wg set %i private-key /etc/wireguard/privatekey
# También hace ping al servidor vpn para asegurarse que el túnel se inicializó
PostUp = ping -c1 10.47.47.1
[Peer]
# La clave pública de wireguard del servidor VPN
PublicKey = your_key
# Dirección de la IP Pública de tu servidor VPN (USA EL TUYO!)
Endpoint = 54.160.21.183:51820
# 10.0.0.0/24 es el subnet VPN
AllowedIPs = 10.47.47.0/24
# PersistentKeepalive = 25</code></pre><p>La sección <code>Interface</code> representa esta vez la máquina cliente, mientras que la sección <code>Peer</code> más abajo se refiere al servidor. Comencemos con <code>Interface</code>. La dirección IP privada debe coincidir con la dirección que le das a este cliente específico en la configuración del servidor.</p><p>Si necesitas que tu cliente evite un servidor DNS local, puedes especificar un servidor DNS personalizado allí. Este es el que proporciona Google.</p><p>En lugar de escribir tu clave privada local en tu archivo de configuración de la forma en que lo hicimos en el servidor, puedes decirle a WireGuard que lea el archivo <code>privateKey</code> cada vez que se cargue. Probablemente sea una práctica recomendada de seguridad, y también podríamos haberlo hecho en el servidor. Finalmente, el script de configuración probará nuestra conexión con el comando <code>PostUp ping</code>.</p><p>La configuración <code>Peer</code> - o del servidor - requiere la clave pública del servidor, la cual se agrega aquí.</p><p>El <code>Endpoint</code> es donde le dices a WireGuard dónde encontrar el servidor. ¡Nada funcionará sin esto! Aquí se requiere la IP pública del servidor, o su nombre de dominio, seguido del puerto que has elegido. Una vez más, <code>51820</code> es el predeterminado de WireGuard.</p><p>Finalmente, la configuración de <code>AllowedIPs</code> define el rango de direcciones de red que usarás, y el valor opcional <code>PersistentKeepalive</code> puede evitar que se pierdan las conexiones.</p><p>Inicias WireGuard en el cliente exactamente de la misma manera que lo hiciste en el servidor, usando <code>wg-quick up wg0</code>. Sin embargo, una vez más, todos esos pasos sólo serán necesarios para clientes Linux. Puedes usar las aplicaciones para otras plataformas.</p><h2 id="resumen">Resumen</h2><p>Y listo, eso es todo. Tal y como dije, una VPN funcional en unos cinco minutos de trabajo. Ahora no tienes excusa para proteger tu privacidad en línea y asegurar tus comunicaciones.</p><p>Para obtener más información sobre tecnología, suscríbete a mi <a href="https://www.youtube.com/@davidbclinton">canal de YouTube</a> y, cuando tengas un momento, echa un vistazo a los numerosos libros y cursos de Linux, seguridad, análisis de datos y AWS disponibles en mi sitio web <a href="https://bootstrap-it.com/"><em>bootstrap-it.com.</em></a></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Tutorial de programación de Bash: Script de Shell de Linux y línea de comandos para principiantes ]]>
                </title>
                <description>
                    <![CDATA[ En Linux, la automatización de procesos se basa fuertemente en la programación de intérprete de comandos (en inglés Shell). Esto involucra el crear un archivo conteniendo una serie de comandos que pueden ser ejecutados juntos. En este artículo, empezaremos con lo básico de programación de bash el cual incluye variables, ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/tutorial-de-programacion-de-bash-script-de-shell-de-linux-y-linea-de-comandos-para-principiantes/</link>
                <guid isPermaLink="false">65b83e2aaa1f2203f0eaff09</guid>
                
                    <category>
                        <![CDATA[ Linux ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Elias Ezequiel Pereyra Gomez ]]>
                </dc:creator>
                <pubDate>Thu, 28 Mar 2024 21:34:19 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2024/01/Copy-of-Cast-a-Function-in-SQL---Convert-Char-to-Int-SQL-Server-Example.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/bash-scripting-tutorial-linux-shell-script-and-command-line-for-beginners/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Bash Scripting Tutorial – Linux Shell Script and Command Line for Beginners</a>
      </p><p>En Linux, la automatización de procesos se basa fuertemente en la programación de intérprete de comandos (en inglés <strong>Shell</strong>). Esto involucra el crear un archivo conteniendo una serie de comandos que pueden ser ejecutados juntos.</p><p>En este artículo, empezaremos con lo básico de programación de bash el cual incluye variables, comandos, entradas/salidas, y depuración. También veremos ejemplos de cada uno a lo largo.</p><p>¡Comencemos! 🚀</p><h2 id="tabla-de-contenidos">Tabla de Contenidos</h2><ol><li><a href="#pre-requesites">Pre-requisitos</a></li></ol><p>2. <a href="#introduction">Introducción</a></p><ul><li><a href="#bash-definition">Definición de programación de Bash</a></li><li><a href="#bash-advantages">Ventajas de la programación de Bash</a></li><li><a href="#bash-cli-overview">Vista general de la terminal Bash y la interfaz de línea de comandos</a></li></ul><p>3. <a href="#get-started-bash">Cómo empezar con la programación de Bash</a></p><ul><li><a href="#execute-bash-commands">Cómo ejecutar comandos de Bash desde la Línea de Comandos</a></li><li><a href="#create-execute-bash">Cómo crear y ejecutar scripts de Bash</a></li></ul><p>4. <a href="#basics-bash-scripting">Lo esencial sobre Programación de Bash</a></p><ul><li><a href="#bash-scripting-comments">Comentarios en programación de bash</a></li><li><a href="#variables-datatypes-bash">Variables y tipos de datos en Bash</a></li><li><a href="#variable-naming-conventions">Convenciones de nomenclatura de variables</a></li><li><a href="#input-output-bash-scripts">Entradas y salidas en scripts de Bash</a></li><li><a href="#basic-bash-commands">Comandos básicos de Bash (echo, read, etc.)</a></li><li><a href="#conditional-statements">Declaraciones condicionales (if/else)</a></li></ul><p>5. <a href="#looping-branching-bash">Bucles y ramificación en Bash</a></p><ul><li><a href="#while-loop">Bucle While</a></li><li><a href="#for-loop">Bucle For</a></li><li><a href="#case-statements">Declaraciones Case</a></li></ul><p>6. <a href="#schedule-scripts-cron">Cómo programar Scripts usando cron</a></p><p>7. <a href="#debug-troubleshoot-bash-scripts">Cómo depurar y solucionar problemas de scripts de Bash</a></p><p>8. <a href="#conclusion">Conclusión</a></p><ul><li><a href="#resources-bash-scripting">Recursos para aprender más sobre programación de Bash</a></li></ul><!--kg-card-begin: html--><h2 id="pre-requesites">Pre-requisitos</h2><!--kg-card-end: html--><p>Para seguir este tutorial, deberías tener los siguientes accesos:</p><ul><li>Una versión en ejecución de Linux con acceso a la línea de comandos.</li></ul><p>Si no tienes Linux instalado o recién estás empezando, puedes fácilmente acceder a la línea de comandos de Linux a través de <a href="https://replit.com/~">Replit</a>. Replit es un IDE basado en un navegador donde puedes acceder a la shell de bash en unos pocos minutos.</p><p>También puedes instalar Linux sobre tu sistema de Windows usando WSL (Subsistema de Windows para Linux - Windows Subsystem for Linux).</p><!--kg-card-begin: html--><h2 id="introduction">Introducción</h2><!--kg-card-end: html--><!--kg-card-begin: html--><h3 id="bash-definition">Definición de programación de Bash</h3><!--kg-card-end: html--><p>Un script de Bash es un archivo que contiene una secuencia de comandos que son ejecutados por el programa de bash línea por línea. Te permite realizar una serie de acciones, tales como navegar a un directorio específico, crear una carpeta, y ejecutar un proceso usando la línea de comando.</p><p>Al guardar estos comandos en un script, puedes repetir la misma secuencia de pasos múltiples veces y ejecutarlos al correr el script.</p><!--kg-card-begin: html--><h3 id="bash-advantages">Ventajas de la programación de Bash</h3><!--kg-card-end: html--><p>La programación de Bash es una herramienta poderosa y versátil para automatizar tareas de administración de sistema, gestionar recursos del sistema, y realizar otras tareas rutinarias en sistemas Unix/Linux. Algunas ventajas de la programación de shell son:</p><ul><li><strong>Automatización</strong>: Los scripts de Shell te permiten automatizar tareas y procesos repetitivos, ahorrando tiempo y reduciendo el riesgo de errores que pueden ocurrir con ejecución manual.</li><li><strong>Portabilidad</strong>: Los scripts de Shell pueden ser ejecutados en varias plataformas y sistemas operativos, incluyendo Unix, Linux y macOS, e inclusive Windows a través del uso de emuladores o máquinas virtuales.</li><li><strong>Flexibilidad</strong>: Los scripts de Shell son altamente personalizables y pueden ser fácilmente modificados para adaptarse a requerimientos específicos. También pueden ser combinados con otros lenguajes de programación o utilidades para crear scripts más poderosos.</li><li><strong>Accesibilidad</strong>: Los scripts de Shell son fáciles de escribir y no requieren ninguna herramienta o software especial. Pueden ser editados usando cualquier editor de texto, y la mayoría de los sistemas operativos tienen un intérprete de shell incluido.</li><li><strong>Integración</strong>: Los scripts de Shell pueden ser integrados con otras herramientas y aplicaciones, tales como bases de datos, servidores web, y servicios de la nube, así permitiendo tareas de automatización más compleja y gestión de sistema.</li><li><strong>Depuración</strong>: Los scripts de Shell son fáciles de depurar, y la mayoría de los shells tienen un depurador incorporado y herramientas de reporte de errores que pueden ayudar en identificar y arreglar problemas rápidamente.</li></ul><!--kg-card-begin: html--><h2 id="bash-cli-overview">Vista general de la terminal de Bash y la interfaz de línea de comandos</h2><!--kg-card-end: html--><p>Los términos "shell" y "bash" son usados indistintamente. Pero hay una sutil diferencia entre los dos.</p><p>El término "shell" se refiere a un programa que provee una interfaz de línea de comandos para interactuar con un sistema operativo. Bash (Bourne-Again SHell) es una de las terminales de Unix/Linux más comúnmente utilizados en muchas distribuciones de Linux. </p><p>Una terminal o interfaz de línea de comandos luce de esta forma:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2023/03/image-135.png" class="kg-image" alt="image-135" width="600" height="400" loading="lazy"><figcaption>La terminal acepta comandos del usuario y muestra la salida</figcaption></figure><p>En la salida de arriba, <code>zaira@Zaira</code> es el prompt de la shell. Cuando una terminal es usado interactivamente, muestra un <code>$</code> cuando está esperando un comando del usuario. </p><p>Si la terminal se está ejecutando como root (un usuario con permisos administrativos), el prompt se cambia a <code>#</code>. El prompt del shell del superusuario luce así:</p><pre><code class="language-bash">[root@host ~]#</code></pre><p>Aunque Bash es un tipo de shell, hay otras shells disponibles también, tales como la shell Korn (ksh), la shell C (csh), y la shell Z (zsh). Cada shell tiene su propia sintaxis y conjunto de características, pero todos comparten el propósito en común de proporcionar una interfaz de línea de comandos para interactuar con el sistema operativo.</p><p>Puedes determinar tu tipo de shell usando el comando <code>ps</code>:</p><pre><code class="language-bash">ps</code></pre><p>Esta es la salida para mí:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2023/03/image-134.png" class="kg-image" alt="image-134" width="600" height="400" loading="lazy"><figcaption>Verificando el tipo de shell. Estoy usando la shell de bash</figcaption></figure><p>En resumen, mientras que "shell" es un término amplio que se refiere a cualquier programa que proporciona una interfaz de línea de comandos, "Bash" es un tipo específico de shell que es ampliamente usando en sistemas Unix/Linux.</p><p>Nota: en este tutorial, estaremos usando la shell "bash".</p><!--kg-card-begin: html--><h2 id="get-started-bash">Cómo empezar con la programación de Bash</h2><!--kg-card-end: html--><!--kg-card-begin: html--><h3 id="execute-bash-commands">Cómo ejecutar comandos de Bash desde la Línea de Comandos</h3><!--kg-card-end: html--><p>Como mencioné anterioremente, el prompt de la shell luce así:</p><pre><code class="language-bash">[username@host ~]$</code></pre><p>Puedes ingresar cualquier comando después del signo <code>$</code> y ver la salida de la shell.</p><p>Generalmente, los comandos siguen esta sintaxis:</p><pre><code>comando [OPCIONES] argumentos</code></pre><p>Discutamos unos pares de comandos de bash básicos y veamos sus salidas. Asegúrate de seguirme :)</p><ul><li><code>date</code>: Muesta la fecha actual.</li></ul><pre><code class="language-bash">zaira@Zaira:~/shell-tutorial$ date
Tue Mar 14 13:08:57 PKT 2023</code></pre><ul><li><code>pwd</code>: Muestra la carpeta de trabajo presente.</li></ul><pre><code class="language-bash">zaira@Zaira:~/shell-tutorial$ pwd
/home/zaira/shell-tutorial</code></pre><ul><li><code>ls</code>: Lista los contenidos de la carpeta actual.</li></ul><pre><code class="language-bash">zaira@Zaira:~/shell-tutorial$ ls
check_plaindrome.sh  count_odd.sh  env  log  temp</code></pre><ul><li><code>echo</code>: Imprime una cadena de texto, o el valor de una variable a la terminal.</li></ul><pre><code class="language-bash">zaira@Zaira:~/shell-tutorial$ echo "Hello bash"
Hello bash</code></pre><p>Siempre puedes referirte al manual de los comandos con el comando <code>man</code>.</p><p>Por ejemplo, el manual para <code>ls</code> se ve así:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2023/03/image-138.png" class="kg-image" alt="image-138" width="600" height="400" loading="lazy"><figcaption>Puedes ver las opciones para un comando en detalle usando <code>man</code></figcaption></figure><!--kg-card-begin: html--><h3 id="create-execute-bash">Cómo crear y ejecutar scripts de Bash</h3><!--kg-card-end: html--><!--kg-card-begin: html--><h4 id="script-naming-conventions">Convenciones de nombramiento de Script</h4><!--kg-card-end: html--><p>Por convención de nomenclatura, los scripts de bash terminan con <code>.sh</code>. Sin embargo, los scripts de bash pueden ejecutarse perfectamente sin la extensión <code>sh</code>.</p><!--kg-card-begin: html--><h4>Agregando el Shebang</h4><!--kg-card-end: html--><p>Los scripts de Bash comienzan con un <code>shebang</code>. Shebang es una combinación de <code>bash #</code> y <code>bang !</code> seguido del path de la shell de bash. Esta es la primer línea del script. Shebang le dice a la shell que lo ejecute por medio de la shell de bash. Shebang es simplemente un path absoluto al intérprete de bash.</p><p>Abajo hay un ejemplo de la sentencia shebang.</p><pre><code class="language-bash">#!/bin/bash</code></pre><p>Puedes encontrar tu path de la shell de bash (el cual podría variar del de arriba) usando el comando:</p><pre><code class="language-bash">which bash</code></pre><!--kg-card-begin: html--><h4>Creando nuestro primer script de bash</h4><!--kg-card-end: html--><p>Nuestro primer script le dice al usuario que ingrese una ruta. Como respuesta, su contenido será listado.</p><p>Crea un archivo llamado <code>run_all.sh</code> usando el comando <code>vi</code>. Puedes usar cualquier editor de tu preferencia.</p><pre><code class="language-bash">vi run_all.sh</code></pre><p>Agrega los siguientes comandos en tu archivo y guárdalo:</p><figure class="kg-card kg-code-card"><pre><code class="language-bash">#!/bin/bash
echo "Hoy es " `date`

echo -e "\ningresa la ruta al directorio"
read the_path

echo -e "\n tu ruta tiene los siguientes archivos y carpetas: "
ls $the_path</code></pre><figcaption>Script para imprimir los contenidos de una carpeta proporcionada por un usuario</figcaption></figure><p>Miremos aún más de cerca al script línea por línea. Estoy mostrando el mismo script de nuevo, pero esta vez con números de línea.</p><pre><code class="language-bash">  1 #!/bin/bash
  2 echo "Hoy es " `date`
  3
  4 echo -e "\nIngresa la ruta al directorio"
  5 read the_path
  6
  7 echo -e "\n tu ruta tiene los siguientes archivos y carpetas: "
  8 ls $the_path</code></pre><ul><li>Línea #1: El shebang (<code>#!/bin/bash</code>) apunta hacia la ruta de la shell de bash.</li><li>Línea #2: El comando <code>echo</code> muestra la fecha actual y el tiempo en la shell. Nota que el <code>date</code> está con comillas invertidas.</li><li>Línea #4: Queremos que el usuario ingrese una ruta válida.</li><li>Línea #5: El comando <code>read</code> lee la entrada y lo almacena en la variable <code>the_path</code>.</li><li>Línea #8: El comando <code>ls</code> toma la variable con la ruta almacenada y muestra los archivos y las carpetas actuales.</li></ul><!--kg-card-begin: html--><h4>Ejecutando el script del bash</h4><!--kg-card-end: html--><p>Para hacer que el script sea ejecutable, asigna permisos de ejecución para tu usuario usando este comando:</p><pre><code class="language-bash">chmod u+x run_all.sh</code></pre><p>Aquí,</p><ul><li><code>chmod</code> modifica la posesión de un archivo para el usuario actual :<code>u</code>.</li><li><code>+x</code> agrega los privilegios de ejecución al usuario actual. Esto significa que el usuario quien es el propietario ahora puede ejecutar el script.</li><li><code>run_all.sh</code> es el archivo que deseamos ejecutar.</li></ul><p>Ahora puedes ejecutar el script usando cualquiera de los métodos mencionados:</p><ul><li><code>sh run_all.sh</code></li><li><code>bash run_all.sh</code></li><li><code>./run_all.sh</code></li></ul><p>Veámoslo ejecutando una acción 🚀</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2023/03/run-script-bash-2.gif" class="kg-image" alt="run-script-bash-2" width="600" height="400" loading="lazy"></figure><!--kg-card-begin: html--><h2 id="basics-bash-scripting">Lo esencial sobre Programación de Bash</h2><!--kg-card-end: html--><!--kg-card-begin: html--><h3 id="bash-scripting-comments">Comentarios en programación de bash</h3><!--kg-card-end: html--><p>Los comentarios comienzan con un <code>#</code> en programacioń de bash. Esto significa que cualquier línea que comience con un <code>#</code> es un comentario y será ignorado por el intérprete.</p><p>Los comentarios son muy útiles al documentar el código, y es una buena práctica agregarlos para ayudar a los demás entender el código.</p><p>Estos son ejemplos de comentarios:</p><pre><code class="language-bash"># Este es un comentario de ejemplo
# Estas dos líneas serán ignoradas por el intérprete</code></pre><!--kg-card-begin: html--><h3 id="variables-datatypes-bash">Variables y tipos de datos en Bash</h3><!--kg-card-end: html--><p>Las variables te permiten almacenar datos. Puedes usar variables para leer, acceder, y manipular datos en todo tu script.</p><p>No hay tipos de datos en Bash. En Bash, una variable es capaz de almacenar valores numéricos, caracteres individuales, o cadenas de caracteres.</p><p>En Bash, puedes usar y establecer los valores de variable de las siguientes formas:</p><ol><li>Asignar el valor directamente:</li></ol><pre><code class="language-bash">pais=Pakistan</code></pre><p>2. &nbsp;Asignar el valor basado en la salida obtenida de un programa o de un comando, usando la substitución de comando. Ten en cuenta que <code>$</code> se requiere para acceder a un valor de una variable existente.</p><figure class="kg-card kg-code-card"><pre><code class="language-bash">mismo_pais=$pais</code></pre><figcaption>Esto asigna el valor de <code>pais</code> a la nueva variable <code>mismo_pais</code></figcaption></figure><p>Para acceder al valor de la variable, adjunta <code>$</code> al nombre de la variable.</p><figure class="kg-card kg-code-card"><pre><code class="language-bash">zaira@Zaira:~$ pais=Pakistan
zaira@Zaira:~$ echo $pais
Pakistan
zaira@Zaira:~$ nuevo_pais=$pais
zaira@Zaira:~$ echo $nuevo_pais
Pakistan</code></pre><figcaption>Asignar e imprimir valores de variables</figcaption></figure><!--kg-card-begin: html--><h3 id="variable-naming-conventions">Convenciones de nomenclatura de Variable</h3><!--kg-card-end: html--><p>En programación de Bash, las convenciones de nomenclatura de variable son los siguientes:</p><ol><li>Los nombres de variable deberían comenzar con una letra o un guión bajo (<code>_</code>).</li><li>Los nombres de variable pueden contener letras, números, y guiones bajos (<code>_</code>).</li><li>Los nombres de variable se distinguen entre mayúsculas y minúsculas.</li><li>Los nombres de variable no deberían contener espacios o caracteres especiales.</li><li>Usa nombres descriptivos que reflejen el propósito de la variable.</li><li>Evitar usar palabras claves reservadas, tales como <code>if</code>, <code>then</code>, <code>else</code>, <code>fi</code>, y así sucesivamente como nombres de variable.</li></ol><p>Aquí hay algunos ejemplos de nombres de variable válidos en Bash:</p><pre><code class="language-bash">nombre
cuenta
_var
miVar
MI_VAR
</code></pre><p>Y aquí hay algunos ejemplos de nombres de variable inválidos:</p><pre><code class="language-bash">2ndvar (el nombre de variable comienza con un número)
mi var (el nombre de variable contiene un espacio)
mi-var (el nombre de variable contiene un guión)
</code></pre><p>Siguiendo estas convenciones de nomenclatura ayuda en hacer los scripts de Bash más legibles y más facil de mantener.</p><!--kg-card-begin: html--><h3 id="input-output-bash-scripts">Entradas y salidas en scripts de Bash</h3><!--kg-card-end: html--><h4 id="recopilaci-n-de-entradas">Recopilación de entradas</h4><p>En esta sección, discutiremos algunos de los métodos para proveer entrada a nuestros scripts.</p><ol><li>Leer la entrada del usuario y almacenarlo en una variable</li></ol><p>Podemos leer la entrada de usuario usando el comando <code>read</code>.</p><pre><code class="language-bash">#!/bin/bash
echo "Hoy es " `date`

echo -e "\ningresa la ruta al directorio"
read la_ruta

echo -e "\ntu ruta tiene los siguientes archivos y carpetas: "
ls $la_ruta</code></pre><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2023/03/name-sh.gif" class="kg-image" alt="name-sh" width="600" height="400" loading="lazy"></figure><p>2. &nbsp;Leer de un archivo</p><p>Este código lee cada línea de un archivo llamado <code>input.txt</code> y lo imprime en la shell. Estudiaremos bucles de while más adelante en este artículo.</p><pre><code class="language-bash">while read linea
do
  echo $linea
done &lt; input.txt
</code></pre><p>3. &nbsp;Argumentos de Línea de Comando</p><p>En un script bash o una función, <code>$1</code> denota el argumento inicial provisto, <code>$2</code> denota el segundo argumento provisto, y así sucesivamente.</p><p>Este script toma un nombre como un argumento de línea de comando e imprime un saludo personalizado.</p><pre><code class="language-bash">echo "Hello, $1!"
</code></pre><p>Hemos suplido <code>Zaira</code> como nuestro argumento al script.</p><figure class="kg-card kg-code-card"><pre><code class="language-bash">#!/bin/bash
echo "Hello, $1!"</code></pre><figcaption>El código para el script: <code>greeting.sh</code></figcaption></figure><p><strong>Salida:</strong></p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2023/03/name-sh-1.gif" class="kg-image" alt="name-sh-1" width="600" height="400" loading="lazy"></figure><h4 id="mostrando-la-salida">Mostrando la salida</h4><p>Aquí discutiremos algunos de los métodos para recibir salida de los scripts.</p><ol><li>Imprimir en la terminal:</li></ol><pre><code class="language-bash">echo "Hola, Mundo!"
</code></pre><p>Esto imprime el texto "Hola, Mundo!" en la terminal.</p><p>2. &nbsp;Escribir a un archivo:</p><pre><code class="language-bash">echo "Esto es un texto." &gt; output.txt
</code></pre><p>Esto escribe el texto "Esto es un texto." a un archivo llamado <code>output.txt</code>. Ten en cuenta que el operador <code>&gt;</code> sobrescribe un archivo si éste ya tiene algún contenido.</p><p>3. &nbsp;Adjuntar a un archivo:</p><pre><code class="language-bash">echo "Mas texto." &gt;&gt; output.txt
</code></pre><p>Esto adjunta el texto "Mas texto." al final del archivo <code>output.txt</code>.</p><p>4. &nbsp;Redireccionando la salida:</p><pre><code class="language-bash">ls &gt; files.txt
</code></pre><p>Esto lista los archivos en el directorio actual y escribe la salida a un archivo llamado <code>files.txt</code>. Puedes redirigir la salida de cualquier comando a un archivo de este forma.</p><!--kg-card-begin: html--><h3 id="basic-bash-commands">Comandos básicos de Bash (echo, read, etc.)</h3><!--kg-card-end: html--><p>Aquí hay una lista de algunos de los comandos de bash más comúnmente usados:</p><ol><li><code>cd</code>: Cambia el directorio a un lugar distinto.</li><li><code>ls</code>: Lista los contenidos del directorio actual.</li><li><code>mkdir</code>: Crea un nuevo directorio.</li><li><code>touch</code>: Crea un nuevo archivo.</li><li><code>rm</code>: Elimina un archivo o un directorio.</li><li><code>cp</code>: Copia un archivo o un directorio.</li><li><code>mv</code>: Mueve o renombra un archivo o un directorio.</li><li><code>echo</code>: Imprime texto a la terminal.</li><li><code>cat</code>: Concatena e imprime los contenidos de un archivo.</li><li><code>grep</code>: Busca un patrón en un archivo.</li><li><code>chmod</code>: Cambia los permisos de un archivo o de un directorio.</li><li><code>sudo</code>: Ejecutar un comando con privilegios administrativos.</li><li><code>df</code>: Mostrar la cantidad de espacio de disco disponible.</li><li><code>history</code>: Mostrar una lista de comandos ejecutados previamente.</li><li><code>ps</code>: Mostrar información sobre procesos en ejecución.</li></ol><!--kg-card-begin: html--><h3 id="conditional-statements">Declaraciones condicionales (if/else)</h3><!--kg-card-end: html--><p>Expresiones que producen un resultado booleano, sea verdadero o falso, son llamados condiciones. Hay varias formas de evaluar condiciones, incluyendo <code>if</code>, <code>if-else</code>, <code>if-elif-else</code>, y condicionales anidadas.</p><p><strong>Sintaxis</strong>:</p><figure class="kg-card kg-code-card"><pre><code class="language-bash">if [[ condicion ]];
then
	declaracion
elif [[ condicion ]]; then
	declaracion 
else
	haz esto por defecto
fi</code></pre><figcaption>Sintaxis de declaraciones condicionales de bash</figcaption></figure><p>Podemos usar operadores lógicos tales como AND <code>-a</code> y OR <code>-o</code> para hacer comparaciones que tienen más significado.</p><figure class="kg-card kg-code-card"><pre><code class="language-bash">if [ $a -gt 60 -a $b -lt 100 ]</code></pre><figcaption>Esta sentencia vertifica si ambas condiciones son <code>true</code>: a es mayor que 60 AND b es menor que 100.</figcaption></figure><p>Veamos un ejemplo de un script de Bash que usa declaraciones de <code>if</code>, <code>if-else</code>, y <code>if-elif-else</code> para determinar si el número introducido por el usuario es positivo, negativo, o cero:</p><figure class="kg-card kg-code-card"><pre><code class="language-bash">#!/bin/bash

echo "Por favor ingresa un numero: "
read num

if [ $num -gt 0 ]; then
  echo "$num es positivo"
elif [ $num -lt 0 ]; then
  echo "$num es negativo"
else
  echo "$num es cero"
fi
</code></pre><figcaption>Script para determinar si un número es positivo, negativo, o cero</figcaption></figure><p>El script primero imprime un mensaje al usuario para que ingrese un número. Luego, usa una declaración <code>if</code> para verificar si el número es mayor que 0. Si lo es, el script muestra que el número es positivo. Si el número no es mayor que 0, el script se mueve a la siguiente declaración, el cual es una declaración <code>if-elif</code>. Aquí, el script verifica si el número es menor que 0. Si lo es, el script muestra que el número es negativo. Finalmente, si el número ni es mayor que 0 ni menor que 0, el script usa una declaración <code>else</code> para mostrar que el número es cero.</p><p>Míralo en acción 🚀</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2023/03/test-odd.gif" class="kg-image" alt="test-odd" width="600" height="400" loading="lazy"></figure><!--kg-card-begin: html--><h2 id="looping-branching-bash">Bucles y ramificación en Bash</h2><!--kg-card-end: html--><!--kg-card-begin: html--><h3 id="while-loop">Bucle While</h3><!--kg-card-end: html--><p>Los bucles while verifican una condición y hacen un bucle hasta que la condición sea <code>true</code>. Necesitamos proveer un contador que vaya incrementándose para controlar la ejecución del bucle.</p><p>En el ejemplo de abajo, <code>(( i += 1 ))</code> está la declaración contador que incrementa el valor de <code>i</code>. El bucle lo ejecutará exactamente 10 veces.</p><figure class="kg-card kg-code-card"><pre><code class="language-bash">#!/bin/bash
i=1
while [[ $i -le 10 ]] ; do
   echo "$i"
  (( i += 1 ))
done</code></pre><figcaption>Bucle while que itera 10 veces.</figcaption></figure><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2023/03/image-187.png" class="kg-image" alt="image-187" width="600" height="400" loading="lazy"></figure><!--kg-card-begin: html--><h3 id="for-loop">Bucle for</h3><!--kg-card-end: html--><p>El bucle <code>for</code>, así como el bucle <code>while</code>, te permite ejecutar declaraciones en un número específico de veces. Cada bucle difiere en su sintaxis y uso.</p><p>En el ejemplo de abajo, el bucle iterará 5 veces.</p><figure class="kg-card kg-code-card"><pre><code class="language-bash">#!/bin/bash

for i in {1..5}
do
    echo $i
done</code></pre><figcaption>Bucle for que itera 5 veces.</figcaption></figure><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2023/03/image-186.png" class="kg-image" alt="image-186" width="600" height="400" loading="lazy"></figure><!--kg-card-begin: html--><h3 id="case-statements">Declaraciones Case</h3><!--kg-card-end: html--><p>En Bash, las declaraciones case son usados para comparar un valor dado con una lista de patrones y ejecutar un bloque de código basado en el primer patrón que coincida. La sintaxis para una declaración case en Bash es como lo que sigue:</p><figure class="kg-card kg-code-card"><pre><code class="language-bash">case expression in
    pattern1)
        # código a ejecutar si la expresión coincide con pattern1
        ;;
    pattern2)
        # código a ejecutar si la expresión coincide con pattern2
        ;;
    pattern3)
        # código a ejecutar si la expresión coincide con pattern3
        ;;
    *)
        # código a ejecutar si ninguno de los patrones de arriba coincide con la expresión
        ;;
esac
</code></pre><figcaption>Sintaxis de las declaraciones Case</figcaption></figure><p>Aquí, "expression" es el valor que queremos comparar, y "pattern1", "pattern2", "pattern3", y así sucesivamente son los patrones con los que queremos comparar.</p><p>El doble punto y coma ";;" separa cada bloque de código para ejecutar cada patrón. El asterisco "*" representa el caso por defecto, el cual se ejecuta si ninguno de los patrones especificados coinciden con la expresión.</p><p>Veamos un ejemplo:</p><figure class="kg-card kg-code-card"><pre><code class="language-bash">fruta="manzana"

case $fruta in
    "manzana")
        echo "Este es una fruta roja."
        ;;
    "banana")
        echo "Este es una fruta amarilla."
        ;;
    "orange")
        echo "Este es una fruta naranja."
        ;;
    *)
        echo "Fruta desconocida."
        ;;
esac
</code></pre><figcaption>Ejemplo de la declaración case</figcaption></figure><p>En este ejemplo, ya que el valor de "fruta" es "manzana", el primer patrón coincide, y el bloque de código que imprime "Este es una fruta roja." Se ejecuta. Si el valor de "fruta" fuere "banana", el segundo patrón coincidiría y el bloque de código que imprime "Este es una fruta amarilla." Se ejecutaría, y así sucesivamente. Si el valor de "fruta" no coincide con ninguno de los patrones especificados, el caso por defecto se ejecuta, el cual imprime "Fruta desconocida."</p><!--kg-card-begin: html--><h2 id="schedule-scripts-cron">Cómo programar Scripts usando cron</h2><!--kg-card-end: html--><p>Cron es una utilidad poderosa para programar trabajos que está disponible en sistemas operativos tipo Unix. Al configurar cron, puedes configurar trabajos automatizados que se ejecuten diariamente, semanalmente, mensualmente, o en una base de tiempo específica. Las capacidades de automatización provista por cron juegan un papel crucial en la administración del sistema Linux.</p><p>Abajo está la sintaxis para programar crons:</p><pre><code class="language-bash"># Ejemplo de un trabajo Cron 
* * * * * sh /path/to/script.sh</code></pre><p>Aquí, los <code>*</code> representan minuto(s) hora(s) día(s) mes(es) semana(s), respectivamente.</p><p>Abajo hay algunos ejemplos de programación de trabajos cron.</p><!--kg-card-begin: html--><table>
<thead>
<tr>
<th>Programar</th>
<th>Descripción</th>
<th>Ejemplo</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>0 0 * * *</code></td>
<td>Ejecuta un script a medianoche cada día</td>
<td><code>0 0 * * * /ruta/a/script.sh</code></td>
</tr>
<tr>
<td><code>*/5 * * * *</code></td>
<td>Ejecuta un script cada 5 minutos</td>
<td><code>*/5 * * * * /ruta/a/script.sh</code></td>
</tr>
<tr>
<td><code>0 6 * * 1-5</code></td>
<td>Ejecuta un script a las 6 am de Lunes a Viernes</td>
<td><code>0 6 * * 1-5 /ruta/a/script.sh</code></td>
</tr>
<tr>
<td><code>0 0 1-7 * *</code></td>
<td>Ejecuta un script en los primeros 7 días de cada mes</td>
<td><code>0 0 1-7 * * /ruta/a/script.sh</code></td>
</tr>
<tr>
<td><code>0 12 1 * *</code></td>
<td>Ejecuta un script en el primer día de cada mes al mediodía</td>
<td><code>0 12 1 * * /ruta/a/script.sh</code></td>
</tr>
</tbody>
</table><!--kg-card-end: html--><h4 id="usando-crontab">Usando crontab</h4><p>La utilidad <code>crontab</code> es usado para agregar y editar los trabajos cron.</p><p><code>crontab -l</code> lista los scripts ya programados para un usuario particular.</p><p>Puedes agregar y editar el cron con <code>crontab -e</code>.</p><p>Puedes leer más sobre los trabajos cron en mi <a href="https://www.freecodecamp.org/news/cron-jobs-in-linux/">otro artículo aquí</a>.</p><!--kg-card-begin: html--><h2 id="debug-troubleshoot-bash-scripts">Cómo depurar y solucionar problemas de scripts de Bash</h2><!--kg-card-end: html--><p>Depurar y solucionar problemas son habilidades esenciales para cualquier programador de Bash. Mientras que los scripts de Bash pueden ser increíblemente poderosos, también pueden ser propicios a tener errores y con comportamientos inesperados. En esta sección, discutiremos algunos consejos y técnicas para depurar y solucionar problemas en scripts de Bash.</p><h3 id="establecer-la-opci-n-set-x">Establecer la opción <code>set -x</code></h3><p>Una de las técnicas más útiles para depurar scripts de Bash es establecer la opción <code>set -x</code> al principio del script. Esta opción permite el modo en depuración, el cual hace que Bash imprima cada comando que ejecuta a la terminal, precedido por un signo <code>+</code>, Esto puede ser increíblemente útil al identificar dónde ocurren los errores en tu script.</p><pre><code class="language-bash">#!/bin/bash

set -x

# Tu script va aquí
</code></pre><h3 id="verifica-el-c-digo-de-salida">Verifica el código de salida</h3><p>Cuando Bash encuentra un error, pone un código de salida que indica la naturaleza del error. Puedes verificar el código de salida del comando más reciente usando la variable <code>$?</code>. Un valor de <code>0</code> indica éxito, mientras que cualquier otro valor indica un error.</p><pre><code class="language-bash">#!/bin/bash

# Tu script va aquí

if [ $? -ne 0 ]; then
    echo "Hubo un error."
fi
</code></pre><h3 id="usa-declaraciones-echo">Usa declaraciones <code>echo</code></h3><p>Otra técnica útil para depurar scripts de Bash es insertar declaraciones <code>echo</code> a lo largo de tú código. Esto puede ayudarte en identificar cuando ocurren los errores y qué valores están siendo pasados a las variables.</p><pre><code class="language-bash">#!/bin/bash

# Tu script va aquí

echo "El valor de la variable x es: $x"

# Más código va aquí
</code></pre><h3 id="usa-la-opci-n-set-e">Usa la opción <code>set -e</code></h3><p>Si quieres que tu script salga inmediatamente cuando cualquier comando en el script falle, puedes usar la opción <code>set -e</code>. Esta opción hará que Bash salga con un error si cualquier comando en el script falle, haciendo más fácil de identificar y arreglar errores en tu script.</p><pre><code class="language-bash">#!/bin/bash

set -e

# Tu script va aquí
</code></pre><h3 id="resolviendo-problemas-de-crons-verificando-los-logs">Resolviendo problemas de crons verificando los logs</h3><p>Podemos solucionar problemas de crons usando los archivos de log. Los logs son mantenidos para todos los trabajos programados. Puedes verificar en los logs si un trabajo específico se ejecutó como se pretendía o no.</p><p>Para Ubuntu/Debian, puedes encontrar los logs de <code>cron</code> en:</p><pre><code class="language-bash">/var/log/syslog
</code></pre><p>La ubicación varía para otras distribuciones.</p><p>Un archivo log de un trabajo de cron luce así:</p><figure class="kg-card kg-code-card"><pre><code class="language-bash">2022-03-11 00:00:01 Tarea iniciada
2022-03-11 00:00:02 Ejecutando script /ruta/a/script.sh
2022-03-11 00:00:03 El script se completó exitosamente
2022-03-11 00:05:01 Tarea iniciada
2022-03-11 00:05:02 Ejecutando script /ruta/a/script.sh
2022-03-11 00:05:03 Error: no se pudo conectar a la base de datos
2022-03-11 00:05:03 El script salió con código de error 1
2022-03-11 00:10:01 Tarea iniciada
2022-03-11 00:10:02 Ejecutando script /ruta/a/script.sh
2022-03-11 00:10:03 El script se completó exitosamente 
</code></pre><figcaption>Log de un Cron (un ejemplo en español)</figcaption></figure><!--kg-card-begin: html--><h2 id="conclusion">Conclusión</h2><!--kg-card-end: html--><p>En este artículo, comenzamos con cómo acceder a la shell y luego ejecutamos algunos comandos básicos de Bash. También estudiamos lo que es una terminal de Bash. Brevemente, miramos la ramificación de código usando bucles y condicionales. Finalmente, discutimos sobre automatizar los scripts usando cron seguido de algunas técnicas de solución de problemas.</p><!--kg-card-begin: html--><h3 id="resources-bash-scripting">
    Recursos para aprender más sobre programación de Bash</h3><!--kg-card-end: html--><p>Si quieres indagar más profundamente en el mundo de la programación de Bash, te sugeriría que mires a este curso de 6 horas en Linux en freeCodeCamp (en inglés).</p><figure class="kg-card kg-embed-card" data-test-label="fitted">
        <div class="fluid-width-video-container">
          <div style="padding-top: 56.17977528089888%;" class="fluid-width-video-wrapper">
            <iframe src="https://www.youtube.com/embed/sWbUDq4S6Y8?feature=oembed" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" title="Introduction to Linux – Full Course for Beginners" name="fitvid0" width="356" height="200" frameborder="0"></iframe>
          </div>
        </div>
      </figure><p>¿Qué es lo que más te gusta de lo que aprendiste de este tutorial? Puedes también contactarme en cualquiera de estas <a href="https://zaira_.bio.link/">plataformas</a>. 📧�</p><p>Nos vemos en el próximo tutorial, feliz codificación 😁</p><p>Créditos de la imagen de portadas: Imagen por <a href="https://www.freepik.com/free-vector/hand-drawn-flat-design-devops-illustration_25726540.htm#query=programmer%20linux&amp;position=4&amp;from_view=search&amp;track=ais">Freepik</a></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Comando Chmod: Cómo cambiar permisos de archivo en Linux ]]>
                </title>
                <description>
                    <![CDATA[ Uno de los primeros comandos que aprendí en Linux fue el comando touch que crea un archivo usando la línea de comando. Si alguna vez tratas de crear, por ejemplo, un archivo de texto, todo lo que tienes que hacer es escribir touch filename.txt, presionar Enter, y el archivo es ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/comando-chmod-como-cambiar-permisos-de-archivo-en-linux/</link>
                <guid isPermaLink="false">655ca6f2bcc2a003e70e3409</guid>
                
                    <category>
                        <![CDATA[ Linux ]]>
                    </category>
                
                    <category>
                        <![CDATA[ bash ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Elias Ezequiel Pereyra Gomez ]]>
                </dc:creator>
                <pubDate>Thu, 25 Jan 2024 15:26:16 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2023/11/pexels-artem-beliaikin-912005.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/how-to-change-file-permissions-with-the-chmod-command-on-linux/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Chmod Command – How to Change File Permissions in Linux</a>
      </p><p>Uno de los primeros comandos que aprendí en Linux fue el comando <code>touch</code> que crea un archivo usando la línea de comando.</p><p>Si alguna vez tratas de crear, por ejemplo, un archivo de texto, todo lo que tienes que hacer es escribir <code>touch filename.txt</code>, presionar Enter, y el archivo es creado para ti en la carpeta donde estás. Luego puedes escribir lo que quieras dentro usando el editor de archivos de tu gusto.</p><p>Sin embargo, cuando se trata de crear scripts, las cosas se pueden poner un poco más complicadas. ¿Por qué es eso?</p><p>Déjame intentar mostrarte esto con un ejemplo. Supón que quieres crear un script usando 'touch'. Escribe <code>touch example.sh</code>, presiona Enter, y ahí lo tienes. Una vez más, puedes escribirlo usando un editor de archivos.</p><p>Con todo listo, todo lo que nos resta hacer es probarlo. Escribe <code>./sample.sh</code> y presiona Enter para ver tu script en acción y... pero, ¿qué me está diciendo este mensaje?</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2022/03/Screenshot-from-2022-03-20-13-58-39.png" class="kg-image" alt="Screenshot-from-2022-03-20-13-58-39" width="600" height="400" loading="lazy"></figure><h2 id="-por-qu-necesitamos-permisos"><strong>¿Por qué necesitamos<strong> </strong>permisos<strong>?</strong></strong></h2><p>¡Yo soy el administrador! ¿Cómo es posible que no tengo permiso para ejecutar un script que yo mismo escribí segundos atrás?</p><p>En realidad hay una razón para eso – y, para ser honesto, la mayoría de usuarios deberían de ser agradecidos por ello, ya que no ser capaz de ejecutar scripts sin saber qué se está haciendo frecuentemente te previene de poner tu sistema en riesgo.</p><p>Vamos a conversar rápidamente sobre los permisos primero. Luego pasaremos a descubrir cómo cambiarlos.</p><p>Para obtener más información sobre tu archivo, usaremos el comando que lista los archivos en una carpeta: <code>ls</code>. </p><p>Después de escribir <code>ls</code> y presionar Enter, esto es lo que obtenemos de la línea de comando:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2022/03/Screenshot-from-2022-03-20-14-05-58.png" class="kg-image" alt="Screenshot-from-2022-03-20-14-05-58" width="600" height="400" loading="lazy"></figure><p>Lo que hace es listar todos los archivos visibles de la carpeta en el que estás en este momento. Al agregarle la bandera <code>-l</code>, te provee con más información sobre los archivos de la carpeta. Este es el resultado cuando escribimos <code>ls -l</code> y presionamos Enter:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/03/Screenshot-from-2022-03-20-14-08-00.png" class="kg-image" alt="Screenshot-from-2022-03-20-14-08-00" width="600" height="400" loading="lazy"></figure><p>Vemos el mismo archivo(s), pero con bastante información. Para empezar, tenemos una secuencia de diez guiones y letras que podrían parecer sin sentido a la primera. Esto es en realidad es el mapeo de permisos que tu archivo tiene.</p><p>El primer carácter puede ser un guion (<code>-</code> para un archivo común), una <code>d</code> (para una carpeta/directorio), o una <code>l</code> (para un enlace suave). Para ser más sencillos, me enfocaré en los archivos simples, aunque los permisos son válidos para todos estos tipos de archivos/carpetas.</p><p>Después del primer carácter, los otros 9 pueden ser divididos en grupos de tres. El primer trío muestran los permisos para el usuario actual. El próximo muestra los permisos para este grupo. Los últimos tres son los permisos para todos los usuarios que no encajan en esta categoría.</p><p>Para nuestra explicación, enfoquémonos en los primeros tres permisos, ya que no vamos a cambiar grupos ni nada parecido.</p><p>El primer trío dice <code>rw-</code>.</p><p>Es tiempo de entender qué son estos. Hay tres cosas que puedes hacer normalmente con un archivo: leerlo, escribir en él, y ejecutarlo. Eso es, básicamente, lo que significa esas tres letras.</p><p>La primera <code>r</code> se refiere a permisos de lectura. Luego tenemos <code>w</code> para permisos de escritura. Finalmente, un guion, lo que significa que cualquier cosa que debería estar ahí no está. Lo que debería de haber allí es una <code>x</code>, lo que significa ejecutable.</p><p>Así que, hablando del usuario actual (yo), los permisos que tengo para este archivo son los permisos de lectura y de escritura. No puedo, sin embargo, ejecutar el archivo <code>sample.sh</code>. Por eso, cuando tratamos de ejecutar el archivo, tengo ese mensaje 'permiso denegado'.</p><p>Entonces, ¿cómo puedo ejecutar este archivo? Ahí es donde el comando <code>chmod</code> entra en acción.</p><h2 id="-qu-hace-chmod"><strong>¿Qué hace <strong>chmod?</strong></strong></h2><p>Bueno, he estado mencionando 'permisos' desde el inicio del artículo. Ampliemos esta explicación un poco para denotar qué son 'permisos' para acceder a un archivo de un cierto <em>modo</em>. Esto significa que <code>r</code> denota el permiso de acceder al archivo en modo lectura, <code>w</code> denota el permiso de acceder al archivo en modo escritura, y <code>x</code> denota el permiso de acceder al archivo en modo ejecución.</p><p>¿Por qué te estoy diciendo esto? Por el comando del que trata este artículo. <code>chmod</code> significa 'cambiar el modo'. En otras palabras, cuando uses este comando, estás cambiando el modo del archivo a cualquier modo que quieres usar.</p><h2 id="c-mo-usar-los-operadores-con-cmod"><strong>Cómo usar los Operadores con<strong> </strong></strong><code><strong><strong>cmod</strong></strong></code></h2><p>Es necesario usar un operador con el comando chmod. Sirve para especificar el tipo de cambio que quieres hacer en los permisos.</p><p>Por ejemplo, <code>+</code> es el operador que usas para agregar un permiso a los que el archivo ya tiene. <code>-</code> remueve un permiso de la lista. Hay también el operador <code>=</code>, lo cual reinicia los permisos, así puedes definirlos nuevamente.</p><p>En nuestro caso, al escribir <code>chmod -w sample.sh</code>, lo que le estoy pidiendo al comando que haga es remover el permiso de escritura. Así que lo que tendría que hacer para agregar el permiso de ejecución es escribir <code>chmod +x sample.sh</code>.</p><p>Si ahora intento ejecutar el archivo, cualquier cosa que ponga en el script ahora va a ser ejecutado.</p><p>Usando <code>ls -l</code>, esto es lo que tendría ahora.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/03/Screenshot-from-2022-03-20-14-12-03.png" class="kg-image" alt="Screenshot-from-2022-03-20-14-12-03" width="600" height="400" loading="lazy"></figure><h2 id="-qui-n-obtiene-el-permiso"><strong>¿Quién obtiene<strong> </strong>el permiso<strong>?</strong></strong></h2><p>Algo más que vale la pena señalar es quién es el que obtiene este permiso. Verás que el 'x' es dado a todos los usuarios, al dueño del archivo, grupo y otros. Si esto no es lo que quieres, tal vez sería bueno quitar el permiso de ejecución nuevamente con <code>chmod -x sample.sh</code>.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/03/Screenshot-from-2022-03-20-14-16-11.png" class="kg-image" alt="Screenshot-from-2022-03-20-14-16-11" width="600" height="400" loading="lazy"></figure><p>Para activar el permiso solamente para el dueño del archivo (yo, en este caso), deberíamos agregar una 'u' antes de '+x', así:</p><p><code>chmod u+x sample.sh</code></p><p>Escribe <code>ls -l</code>, esto es lo que tienes:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2022/03/Screenshot-from-2022-03-20-14-18-22.png" class="kg-image" alt="Screenshot-from-2022-03-20-14-18-22" width="600" height="400" loading="lazy"></figure><p>Si querías dar el permiso tanto para el dueño como su grupo, entonces el comando debería ser <code>chmod ug+x sample.sh</code>.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/03/Screenshot-from-2022-03-20-14-20-25.png" class="kg-image" alt="Screenshot-from-2022-03-20-14-20-25" width="600" height="400" loading="lazy"></figure><p>¡Genial! Pienso que esto cubre lo que querría mostrarte. Hay otras cosas que te interesarían, como usar chmod con valores octales o binarios para representar los permisos. Pero estos son modos que usamos para tener los mismos resultados y creo que con las letras es una forma más sencilla de lograr estos resultados.</p><p>En caso de que quieras más información sobre el comando, una cosa que puedes hacer es escribir <code>chmod --help</code>, el cual te dará un resumen de lo que el comando puede hacer. Una descripción aún más detallada se puede lograr escribiendo <code>man chmod</code>.</p><p>Espero que este artículo te haya sido de utilidad. Para más artículos sobre comandos de Linux, visita <a href="https://www.freecodecamp.org/news">freecodecamp.org/espanol/news</a> y <a href="https://www.freecodecamp.org/news">freecodecamp.org/news</a>.</p><p>¡Feliz codificación! 😃</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ ¿Qué es SSH? Significado de SSH en Linux ]]>
                </title>
                <description>
                    <![CDATA[ Secure Shell (SSH) es un protocolo de red ampliamente utilizado que proporciona una forma segura de acceder a servidores remotos y computadoras. En Linux, SSH es una herramienta esencial para la administración remota y transferencia de archivos. En este artículo, repasaremos el significado de SSH en Linux, su historia, características, ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/que-es-ssh-significado-de-ssh-en-linux/</link>
                <guid isPermaLink="false">6508ab4df4bf2403ceb8edf4</guid>
                
                    <category>
                        <![CDATA[ Linux ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Beatriz I Bravo ]]>
                </dc:creator>
                <pubDate>Mon, 09 Oct 2023 14:53:13 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2023/09/Shittu-Olumide-What-is-SSH-SSH-Meaning-in-Linux.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/ssh-meaning-in-linux/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">What is SSH? SSH Meaning in Linux</a>
      </p><p>Secure Shell (SSH) es un protocolo de red ampliamente utilizado que proporciona una forma segura de acceder a servidores remotos y computadoras.</p><p>En Linux, SSH es una herramienta esencial para la administración remota y transferencia de archivos. En este artículo, repasaremos el significado de SSH en Linux, su historia, características, configuración y casos de uso.</p><h2 id="-qu-es-ssh"><strong>¿Qué es SSH?</strong></h2><p>SSH es un protocolo de red criptográfico que permite una comunicación segura entre dispositivos en red. Fue desarrollado como reemplazo de Telnet, un protocolo que enviaba todos los datos, incluyendo contraseñas, en texto sin formato, lo que lo hacía susceptible a escuchas e interceptaciones. </p><p>SSH proporciona mecanismos de cifrado y autenticación para proteger la confidencialidad e integridad de las comunicaciones en la red.</p><h2 id="historia-breve-de-ssh"><strong>Historia breve de SSH</strong></h2><p>La primera versión de SSH, SSH-1, fue desarrollada por <a href="https://www.usenix.org/conference/lisa13/speaker-or-organizer/tatu-yl%C3%B6nen-ssh-communications-security">Tatu Ylönen en 1995</a> como respuesta a la inseguridad de Telnet y FTP. </p><p>En 1996, SSH Communications Security lanzó una versión comercial de SSH-1, que se volvió ampliamente utilizada en la industria.</p><p>Pero &nbsp;SSH-1 &nbsp;tenía algunas vulnerabilidades de seguridad, y en 1998, Ylönen desarrolló SSH-2, que abordó estos problemas y se convirtió en la versión más utilizada de SSH.</p><h2 id="como-funciona-ssh"><strong>Como funciona SSH </strong></h2><p>SSH utiliza una arquitectura cliente-servidor, donde el cliente inicia una conexión con el servidor y solicita un canal de comunicación seguro. El servidor responde generando un par de claves criptográficas, una pública y otra privada.</p><p>La clave pública se envía al cliente, mientras que la clave privada se guarda de forma segura en el servidor. Luego, el cliente cifra una clave de sesión aleatoria utilizando la clave pública del servidor y la envía de regreso al servidor. El servidor descifra la clave de sesión utilizando su clave privada y envía un acuse de recibo al cliente. A partir de este momento, todos los datos transmitidos entre el cliente y el servidor se cifran utilizando la clave de sesión.</p><h2 id="caracter-sticas-ssh"><strong>Características SSH </strong></h2><ul><li><strong>Encriptación</strong>: SSH utiliza algoritmos de encriptación fuertes, como AES, para proteger la confidencialidad e integridad de los datos transmitidos a través de la red. </li><li><strong>Transferencia segura de archivos</strong>: Proporciona capacidades de transferencia segura de archivos (SFTP), que permiten a los usuarios transferir archivos entre servidores remotos de forma segura.</li><li><strong>Inicio de sesión remoto</strong>: SSH proporciona una forma segura de iniciar sesión en servidores y computadoras remotos, sin exponer las credenciales de inicio de sesión a los atacantes.</li><li><strong>Reenvío de puertos</strong>: proporciona una forma segura de iniciar sesión en servidores y computadoras remotas, que permiten a los usuarios acceder a servicios restringidos en servidores remotos a través de un canal de comunicación seguro.</li><li><strong>Reenvío de X11</strong>: SSH proporciona capacidades de reenvío X11, que permiten a los usuarios ejecutar aplicaciones gráficas de forma remota, sin tener que instalarlas localmente. </li><li><strong>Reenvío de agente</strong>: También proporciona capacidades de reenvío de agentes, que permiten a los usuarios usar claves SSH para autenticación en servidores remotos, sin tener que ingresar su contraseña cada vez.</li></ul><h2 id="configuraci-n-ssh"><strong>Configuración SSH </strong></h2><p>La configuración SSH implica varias configuraciones y opciones que se pueden personalizar para optimizar la conexión SSH y mejorar la seguridad. A continuación se muestran algunas tareas comunes de configuración de SSH:</p><ul><li><strong><strong>G</strong>eneración de<strong> </strong>claves <strong>SSH</strong></strong>: Antes de usar SSH, los usuarios deben generar un par de claves criptográficas, una pública y una privada. La clave pública se comparte con el servidor, mientras que la clave privada se guarda de forma segura en el ordenador del usuario.</li><li><strong>Edición de archivos de configuración</strong>: Los usuarios pueden crear y editar archivos de configuración SSH para personalizar su configuración SSH, como especificar el algoritmo de cifrado preferido o configurar el reenvío de puertos. Los archivos de configuración SSH suelen estar ubicados en el directorio <code>/etc/ssh/</code>.</li><li><strong>Métodos de autenticación</strong>: SSH admite varios métodos de autenticación, como la autenticación mediante contraseña, la autenticación mediante clave pública y la autenticación multifactorial. Los usuarios pueden elegir el método de autenticación más adecuado en función de sus necesidades de seguridad.</li><li><strong>Configuración segura de SSH</strong>: Para garantizar la máxima seguridad, los usuarios deben seguir las mejores prácticas para la configuración segura de SSH, como desactivar el inicio de sesión como root, exigir contraseñas seguras y limitar el número de intentos fallidos de inicio de sesión. Los usuarios también pueden utilizar herramientas como Fail2Ban para evitar ataques de fuerza bruta en SSH.</li><li><strong>Habilitar el reenvío X11</strong>: SSH proporciona capacidades de reenvío X11, que permiten a los usuarios ejecutar aplicaciones gráficas de forma remota sin tener que instalarlas localmente. Para habilitar el reenvío X11, los usuarios pueden añadir la opción -X o -Y al conectarse al servidor remoto.</li><li><strong>Reenvío de puertos</strong>: SSH permite a los usuarios configurar el reenvío de puertos, lo que puede ser útil para acceder a servicios restringidos en servidores remotos a través de un canal de comunicación seguro. Los usuarios pueden configurar el reenvío de puertos local o remoto según sus necesidades.</li><li><strong>Compresión</strong>: SSH admite la compresión de datos, lo que puede mejorar el rendimiento de la conexión SSH, especialmente al transferir archivos grandes o ejecutar aplicaciones que requieren muchos recursos. Los usuarios pueden habilitar la compresión añadiendo la opción <code>-C</code> al conectarse al servidor remoto.</li></ul><h2 id="ssh-examples-and-use-cases"><strong>SSH Examples and Use Cases</strong></h2><ul><li><strong>La administración remota de servidores</strong>: SSH se utiliza habitualmente para la administración remota de servidores, permitiendo a los usuarios ejecutar comandos y gestionar servidores desde una ubicación remota.</li><li><strong>Transferencia segura de archivos</strong>: proporciona una forma segura de transferir archivos entre servidores remotos, sin exponer los archivos o las credenciales de inicio de sesión a atacantes.</li><li><strong>Ejecución de aplicaciones gráficas de forma remota</strong>: permite a los usuarios ejecutar aplicaciones gráficas de forma remota, sin tener que instalarlas localmente, lo que puede ser útil para aplicaciones que requieren muchos recursos o cuando se utiliza un dispositivo de baja potencia.</li><li><strong>Reenvío de puertos para acceder a servicios restringidos:</strong> permite a los usuarios acceder a servicios restringidos en servidores remotos a través de un canal de comunicación seguro, mediante el establecimiento de un reenvío de puertos.</li><li><strong>Túneles para comunicación segura</strong>: SSH permite a los usuarios establecer túneles cifrados para la comunicación segura entre dos dispositivos en red, lo que puede ser útil para acceder a recursos en una red privada.</li></ul><h2 id="conclusi-n"><strong>Conclusión</strong></h2><p>Para concluir este artículo, aquí hay un resumen de lo que cubrimos y lo que debe saber sobre SSH:</p><ul><li>SSH es un protocolo seguro para la comunicación remota en Linux.</li><li>SSH utiliza cifrado para proteger los datos y mecanismos de autenticación para verificar a los usuarios.</li><li>SSH es una forma confiable y eficiente de comunicarse de forma segura a través de Internet, y es una herramienta vital para la administración y el desarrollo del sistema Linux.</li><li>SSH proporciona capacidades de inicio de sesión remoto, transferencia segura de archivos, reenvío de puertos, reenvío X11 y reenvío de agentes.</li><li>Para usar SSH, los usuarios deben generar un par de claves criptográficas, una pública y una privada.</li><li>Los archivos de configuración SSH se pueden personalizar para optimizar la conexión SSH y mejorar la seguridad.</li><li>SSH admite varios métodos de autenticación, como la autenticación mediante contraseña, la autenticación mediante clave pública y la autenticación multifactorial.</li><li>Para garantizar la máxima seguridad, los usuarios deben seguir las mejores prácticas para la configuración segura de SSH, como desactivar el inicio de sesión como root, exigir contraseñas seguras y limitar el número de intentos fallidos de inicio de sesión.</li><li>SSH se puede utilizar para la administración remota del servidor, transferencia segura de archivos, ejecución de aplicaciones gráficas de forma remota, reenvío de puertos y túneles para comunicación segura.</li><li>SSH es un protocolo ampliamente utilizado y compatible, con muchos clientes y servidores SSH disponibles para diferentes plataformas.</li></ul><p>Conectémonos en <a href="https://www.twitter.com/Shittu_Olumide_">Twitter</a> y <a href="https://www.linkedin.com/in/olumide-shittu">LinkedIn</a>. También puedes suscribirte a mi canal de YouTube.</p><p>¡Feliz programación!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Condicional If en Bash - Sintaxis If-Else en Linux Shell ]]>
                </title>
                <description>
                    <![CDATA[ Cuando se programa, es posible que necesites tomar decisiones basadas en ciertas condiciones. Las condiciones son expresiones que se evalúan como una expresión booleana (true o false). Las sentencias que ayudan a ejecutar diferentes ramas de código basándose en ciertas condiciones se conocen como sentencias condicionales. if...else es una de ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/condicional-if-en-bash/</link>
                <guid isPermaLink="false">649168ee9764040891b7eae5</guid>
                
                    <category>
                        <![CDATA[ Linux ]]>
                    </category>
                
                    <category>
                        <![CDATA[ bash ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Beatriz I Bravo ]]>
                </dc:creator>
                <pubDate>Mon, 07 Aug 2023 06:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2023/06/Bash-Condicional-If--Ejemplo-de-Sintaxis-If-Else-en-Linux-Shell.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/bash-if-statement-linux-shell-if-else-syntax-example/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Bash If Statement – Linux Shell If-Else Syntax Example</a>
      </p><p>Cuando se programa, es posible que necesites tomar decisiones basadas en ciertas condiciones. Las condiciones son expresiones que se evalúan como una expresión booleana (<code>true</code> o <code>false</code>).</p><p>Las sentencias que ayudan a ejecutar diferentes ramas de código basándose en ciertas condiciones se conocen como sentencias condicionales.</p><p><code>if...else</code> es una de las sentencias condicionales utilizadas más comúnmente. Al igual que otros lenguajes de programación, la programación de Bash también soporta sentencias <code>if...else</code>. Y lo estudiaremos en detalle en esta publicación.</p><h2 id="sintaxis-de-las-declaraciones-if"><strong>Sintaxis de las declaraciones<strong> <code>if</code> </strong></strong></h2><p>Puedes utilizar las declaraciones <code>if</code> de varias formas. &nbsp;La estructura genérica de las declaraciones &nbsp;<code>if</code> es la siguiente:</p><ul><li>Usando solo una declaración <code>if</code>: &nbsp; <code>if...then...fi</code></li><li>Usando una declaración <code>if</code> con una declaración <code>else</code>: &nbsp; <code>if...then...else...fi</code> </li><li>Usando varias declaraciones <code>else</code> Cuando estás utilizando una sola declaración <code>if</code>: <code>if..elif..else..fi</code></li></ul><h2 id="c-mo-utilizar-la-declaraci-n-if"><strong>Cómo utilizar la declaración<strong> <code>if</code> </strong></strong></h2><p>Cuando estás utilizando una sola declaración <code>if</code> , la sintaxis es la siguiente:</p><pre><code class="language-bash">if [ condition ]
then
	statement
fi</code></pre><blockquote>Ten en cuenta que los espacios forman parte de la sintaxis y no deben ser eliminados</blockquote><p>Veamos un ejemplo donde estamos comparando dos números para ver si el primer número es el más pequeño.</p><pre><code class="language-bash">#! /bin/sh

a=5
b=30

if [ $a -lt $b ]
then
        echo "a is less than b"
fi</code></pre><p>Si ejecutas el fragmento anterior, la condición &nbsp;<code>if [ $a -lt $b ]</code> se evalúa como <code>True</code>, y se ejecuta la declaración dentro de la declaración if.</p><p><strong>Resultado<strong>:</strong></strong></p><pre><code class="language-bash">a is less than b</code></pre><h2 id="-c-mo-utilizar-la-declaraci-n-if-else"><strong>¿Cómo utilizar la declaración<strong> <code>if .. else</code></strong>?</strong></h2><p>Cuando estás utilizando una declaración <code>if</code> y quieres añadir otra condición, la sintaxis es la siguiente:</p><pre><code class="language-bash">if [ condition ]
then
	statement
else
	do this by default
fi</code></pre><p>Veamos un ejemplo en el que queramos encontrar si el primer número es mayor o menor que el segundo. Aquí, &nbsp;<code>if [ $a -lt $b ]</code> se evalúa como <code>false</code>, lo que provoca que se ejecute la parte else del código.</p><pre><code class="language-bash">#! /bin/sh

a=99
b=45

if [ $a -lt $b ]
then
        echo "a is less than b"
else
        echo "a is greater than b"
fi</code></pre><p><strong>Resultado<strong>:</strong></strong></p><pre><code class="language-bash">a is greater than b</code></pre><h2 id="-c-mo-utilizar-las-declaraciones-if-elif-else"><strong>¿Cómo utilizar las declaraciones<strong> <code>if..elif..else</code></strong>?</strong></h2><p>Digamos que quieres añadir condiciones y comparaciones adicionales para hacer que el código sea dinámico. En este caso, la sintaxis se vería así:</p><pre><code class="language-bash">if [ condition ]
then
	statement
elif [ condition ] 
then
	statement 
else
	do this by default
fi</code></pre><p>Para crear comparaciones significativas, podemos usar los operadores lógicos AND <code>-a</code> y OR <code>-o</code>.</p><p>En este ejemplo, vamos a determinar el tipo de triángulo utilizando las siguientes condiciones:</p><ul><li><code>Escaleno</code>: &nbsp;Un triángulo en el que cada lado tiene una longitud diferente.</li><li><code>Isósceles</code>: Un triángulo en el que 2 de sus lados tienen la misma longitud.</li><li><code>Equilátero</code>: Un triángulo en el que todos los lados tienen la misma longitud.</li></ul><pre><code class="language-bash">read a
read b
read c

if [ $a == $b -a $b == $c -a $a == $c ]
then
echo ESCALENO

elif [ $a == $b -o $b == $c -o $a == $c ]
then
echo ISOSCELES
else
echo EQUILATERO

fi</code></pre><p>En el ejemplo anterior, el script le pediría al usuario que ingrese los tres lados del triángulo. Luego, compararía los lados y decidiría el tipo de triángulo.</p><pre><code>3
4
5
SCALENE</code></pre><h2 id="conclusi-n"><strong>Conclusión</strong></h2><p>Puedes fácilmente dividir tu código en ramas basándose en condiciones como <code>if..else</code> y hacer el código más dinámico. En este tutorial, aprendiste la sintaxis de <code>if...else</code> junto con algunos ejemplos.</p><p>Espero que hayas encontrado este tutorial útil.</p><p>Comenta que aprendiste de este tutorial. ¡Házmelo saber en &nbsp;<a href="https://twitter.com/hira_zaira">Twitter</a>!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ El comando Tar en Linux: Tar CVF y Tar XVF explicados con comandos de ejemplo ]]>
                </title>
                <description>
                    <![CDATA[ El nombre tares la abreviatura de archivo de cinta . Las "cintas" en cuestión serían todas esas unidades de almacenamiento magnético que fueron populares en la década de 1950. Esto sugiere que la herramienta tar podría ser un poco vieja y haber pasado su mejor momento. Pero la verdad es ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/comando-tar-linux-tar-cvf-tar-xvf/</link>
                <guid isPermaLink="false">64345ac710657f0643debe5b</guid>
                
                    <category>
                        <![CDATA[ Linux ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ BlackeyeB ]]>
                </dc:creator>
                <pubDate>Sun, 23 Apr 2023 01:02:46 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2023/04/5f9c9938740569d1a4ca1e84.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/tar-command-linux-tar-cvf-tar-xvf/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">The Tar Command in Linux: Tar CVF and Tar XVF Explained with Example Commands</a>
      </p><p>El nombre <code>tar</code>es la abreviatura de <em><em>archivo de cinta</em></em> . Las "cintas" en cuestión serían todas esas unidades de almacenamiento magnético que fueron populares en la década de 1950.</p><p>Esto sugiere que la herramienta <code>tar</code> podría ser un poco vieja y haber pasado su mejor momento. Pero la verdad es que, a lo largo de los años y a través de todos los cambios sísmicos en el mundo de TI, <code>tar</code> no ha perdido nada de su poder y valor.</p><p>En este artículo, basado en el contenido de mi <a href="https://www.amazon.com/gp/product/1617294934/ref=as_li_tl?ie=UTF8&amp;camp=1789&amp;creative=9325&amp;creativeASIN=1617294934&amp;linkCode=as2&amp;tag=projemun-20&amp;linkId=1a460c0cd9a39e01821133b90632cba8">libro Linux en acción (en inglés)</a>, te mostraré los conceptos básicos de la creación, compresión y restauración de archivos tar. Empecemos desde el principio.</p><h1 id="creando-archivos"><strong>Creando archivos</strong></h1><p>Este ejemplo cogerá todos los archivos y directorios dentro y debajo del directorio de trabajo actual y creará un archivo de almacenamiento que he llamado <code>nombredearchivo.tar</code>.</p><p>Aquí uso tres argumentos después del comando tar:</p><ul><li>la <code>c</code>le dice a tar que cree un nuevo archivo,</li><li><code>v</code>establece la salida por pantalla con detalle para recibir actualizaciones, y</li><li><code>f</code>apunta al nombre de archivo que me gustaría darle al archivo.</li></ul><p>El <code>*</code>es lo que le indica a <code>tar</code> que incluya todos los archivos y directorios locales de forma recursiva.</p><pre><code>$ tar cvf nombredearchivo.tar *
archivo1
archivo2
archivo3
directorio1
directorio1/mascosas
directorio1/mascosas/archivo100
directorio1/mascosas/archivo101
</code></pre><p>El comando tar nunca moverá ni eliminará ninguno de los directorios y archivos originales que le proporciones, solo hace copias archivadas.</p><p>También debes tener en cuenta que el uso de un punto (.) en lugar de un asterisco (*) en el comando anterior incluiría incluso archivos ocultos (cuyos nombres de archivo comienzan con un punto) en el archivo.</p><p>Si lo estás haciendo en tu propio ordenador (como deberías), verás un nuevo archivo llamado nombredearchivo.tar. La extensión de nombre de archivo .tar no es necesaria, pero siempre es una buena idea comunicar claramente el propósito de un archivo de tantas formas como sea posible.</p><p>Extraer tu archivo para restaurar los archivos es fácil: simplemente usa <code>xvf</code>en lugar de <code>cvf</code>. Eso, en el ejemplo, guardará nuevas copias de los archivos y directorios originales en la ubicación actual.</p><pre><code>$ tar xvf nombredearchivo.tar
archivo1
archivo2
archivo3
directorio1
directorio1/mascosas
directorio1/mascosas/archivo100
directorio1/mascosas/archivo101</code></pre><p>Por supuesto, también puedes hacer que tar envíe sus archivos extraídos a algún otro lugar usando el argumento <code>-C</code>, seguido de la ubicación de destino:</p><pre><code>$ tar xvf nombredearchivo.tar -C /home/misdatos/archivosantiguos/</code></pre><p>No siempre querrás incluir todos los archivos dentro de un árbol de directorios en tu archivo.</p><p>Supongamos que has producido algunos videos, pero actualmente están guardados en directorios junto con todo tipo de archivos gráficos, de audio y de texto (que contienen tus notas). Los únicos archivos que necesitas respaldar son los clips de video finales con la extensión de nombre de archivo .mp4.</p><p>Así es como se hace:</p><pre><code>$ tar cvf nombredearchivo.tar *.mp4</code></pre><p>Genial. Pero esos archivos de video son enormes. ¿No sería bueno hacer ese archivo un poco más pequeño usando compresión?</p><p>¡No digas más! Simplemente, ejecuta el comando anterior con el argumento <code>z</code> (zip). Eso le dirá al programa gzip que comprima el archivo.</p><p>Si deseas seguir la convención, también puedes agregar una extensión <code>.gz</code> además de la <code>.tar</code>que ya existe. Recuerda: claridad.</p><p>Así es como se haría:</p><pre><code>$ tar czvf nombredearchivo.tar.gz *.mp4</code></pre><p>Si pruebas esto en tus propios archivos .mp4 y luego ejecutas ls -l en el directorio que contiene los nuevos archivos, puedes notar que el archivo <code>.tar.gz</code> no es mucho más pequeño que el archivo <code>.tar</code>, quizás un 10% más o menos. ¿Por qué?</p><p>Bueno, el formato <code>.mp4</code> del archivo está comprimido, por lo que hay mucho menos margen para que gzip haga su trabajo.</p><p>Como tar es plenamente consciente de tu entorno Linux, puedes usarlo para seleccionar archivos y directorios que están fuera de tu directorio de trabajo actual. Este ejemplo agrega todos los archivos <code>.mp4</code> en el directorio <code>/home/miusuario/Videos/</code>:</p><pre><code>$ tar czvf archivename.tar.gz /home/myuser/Videos/*.mp4
</code></pre><p>Debido a que los archivos de almacenamiento pueden aumentar de tamaño, a veces puede tener sentido dividirlos en varios archivos más pequeños, transferirlos a su nuevo destino y luego volver a crear el archivo original en el otro extremo. La herramienta de división está hecha para este propósito.</p><p>En este ejemplo, <code>-b</code> le dice a Linux que divida el archivo nombredearchivo.tar.gz en partes de 1 GB. Luego, la operación nombra cada una de las partes: nombredearchivo.tar.gz.partaa, nombredearchivo.tar.gz.partab, nombredearchivo.tar.gz.partac, etc.:</p><pre><code>$ split -b 1G nombredearchivo.tar.gz "nombredearchivo.tar.gz.part"</code></pre><p>Por otro lado, vuelve a crear el archivo leyendo cada una de las partes en secuencia (cat nombredearchivo.tar.gz.part*), luego redirige la salida a un nuevo archivo llamado nombredearchivo.tar.gz:</p><pre><code>$ cat nombredearchivo.tar.gz.part* &gt; nombredearchivo.tar.gz</code></pre><h1 id="transmisi-n-de-archivos-del-sistema-de-archivos"><strong>Transmisión de archivos del sistema de archivos</strong></h1><p>Aquí es donde empieza lo bueno. Te mostraré cómo crear una imagen de archivo de una instalación de Linux en funcionamiento y transmitirla a una ubicación de almacenamiento remota, todo con un solo comando. Aquí está el comando:</p><pre><code># tar czvf - --one-file-system / /usr /var \
  --exclude=/home/andy/ | ssh username@10.0.3.141 \
  "cat &gt; /home/username/workstation-backup-Apr-10.tar.gz"
</code></pre><p>En lugar de tratar de explicar todo eso de inmediato, usaré ejemplos más pequeños para explorarlo pieza por pieza.</p><p>Vamos a crear un archivo de los contenidos de un directorio llamado cosasimportantes que está lleno de, bueno, cosas realmente importantes:</p><pre><code>$ tar czvf - cosasimportantes/ | ssh usuario@10.0.3.141 "cat &gt; /home/usuario/misarchivos.tar.gz"
cosasimportantes/nombredearchivo1
cosasimportantes/nombredearchivo2
[...]
usuario@10.0.3.141's password:
</code></pre><p>Déjame explicarte este ejemplo. En lugar de ingresar el nombre del archivo justo después de los argumentos del comando (como lo has hecho hasta ahora), usé un guion (czvf -).</p><p>El guion envía datos a la salida estándar. Te permite enviar los detalles del nombre del archivo al final del comando y le dice a tar que espere el contenido de origen del archivo en su lugar.</p><p>Luego canaliza (|) el archivo comprimido sin nombre a un inicio de sesión ssh en un servidor remoto donde me pidieron mi contraseña.</p><p>El comando que va entre comillas ejecuta cat contra el flujo de datos de archivo, el cual escribió el contenido del flujo en un archivo llamado myfiles.tar.gz en mi directorio de inicio del host remoto.</p><p>Una ventaja de generar archivos de esta manera es que evita la sobrecarga de un paso intermedio. No hay necesidad de guardar temporalmente una copia del archivo en la máquina local. Imagina hacer una copia de seguridad de una instalación que ocupa 110 GB de sus 128 GB de espacio disponible. ¿Dónde iría el archivo?</p><p>Esto era solo un directorio de archivos. Supongamos que necesitas hacer una copia de seguridad de un sistema operativo Linux activo en una unidad USB para poder moverlo a una máquina separada y colocarlo en la unidad principal de esa máquina.</p><p>Partiendo de la base de que ya existe una instalación nueva de la misma versión de Linux en la segunda máquina, la próxima operación de copiar/pegar generará una réplica exacta de la primera.</p><blockquote>NOTA: Esto no funcionará en una unidad de destino que aún no tenga instalado un sistema de archivos Linux. Para manejar esa situación, deberá usar <code>dd</code>.</blockquote><p>El siguiente ejemplo crea un archivo comprimido en la unidad USB conocido como <code>/dev/sdc1</code>.</p><p>El argumento <code>--one-file-system</code> excluye todos los datos de cualquier sistema de archivos, además del actual. Esto significa que las pseudoparticiones como <code>/sys/</code>y <code>/dev/</code>no se agregarán al archivo. Si hay otras particiones que deseas incluir (como lo harás para <code>/usr/</code>y <code>/var/</code>en este ejemplo), deben agregarse explícitamente.</p><p>Finalmente, puedes excluir datos del sistema de archivos actual usando el argumento <code>--exclude</code>:</p><pre><code># tar czvf /dev/sdc1/workstation-backup-Apr-10.tar.gz \
  --one-file-system \
  / /usr /var \
  --exclude=/home/usuario/</code></pre><p>Ahora volvamos a ese ejemplo de comando de servicio completo. Usando lo que ya aprendiste, archiva todos los directorios importantes de un sistema de archivos y copia el archivo en una unidad USB. Debería tener sentido para ti ahora:</p><pre><code># tar czvf - --one-file-system / /usr /var \
  --exclude=/home/usuario/ | ssh usuario@10.0.3.141 \
  "cat &gt; /home/usuario/workstation-backup-Apr-10.tar.gz"
</code></pre><p><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em><em>Hay muchas más bondades de administración en forma de libros, cursos y artículos disponibles en mi <a href="https://bootstrap-it.com/">bootstrap-it.com</a>.</em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></em></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Tutorial de Symlink en Linux: cómo crear y eliminar un enlace simbólico ]]>
                </title>
                <description>
                    <![CDATA[ Un Symlink (también llamado enlace simbólico) es un tipo de archivo en Linux que apunta a otro archivo o carpeta del ordenador. Los enlaces simbólicos son similares a los accesos directos en Windows. Algunas personas llaman a los enlaces simbólicos "enlaces blandos", un tipo de enlace en los sistemas Linux/UNIX, ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/tutorial-de-symlink-en-linux-como-crear-y-eliminar-un-enlace-simbolico/</link>
                <guid isPermaLink="false">63fb47fb2154fe0736d61ada</guid>
                
                    <category>
                        <![CDATA[ Linux ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ BlackeyeB ]]>
                </dc:creator>
                <pubDate>Wed, 08 Mar 2023 16:00:24 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2023/02/5f9c9b4f740569d1a4ca2b02.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/symlink-tutorial-in-linux-how-to-create-and-remove-a-symbolic-link/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Symlink Tutorial in Linux – How to Create and Remove a Symbolic Link</a>
      </p><p>Un Symlink (también llamado enlace simbólico) es un tipo de archivo en Linux que apunta a otro archivo o carpeta del ordenador. Los enlaces simbólicos son similares a los accesos directos en Windows.</p><p>Algunas personas llaman a los enlaces simbólicos "enlaces blandos", un tipo de enlace en los sistemas Linux/UNIX, en lugar de "enlaces duros".</p><h2 id="diferencia-entre-un-enlace-blando-y-un-enlace-duro"><strong>Diferencia entre un enlace blando y un enlace duro</strong></h2><p>Los enlaces blandos son similares a los accesos directos y pueden apuntar a otro archivo o directorio en cualquier sistema de archivos.</p><p>Los enlaces duros también son accesos directos para archivos y carpetas, pero no se puede crear un enlace duro para una carpeta o archivo en un sistema de archivos diferente.</p><p>Veamos los pasos necesarios para crear y eliminar un enlace simbólico. También veremos qué son los enlaces rotos y cómo eliminarlos.</p><h2 id="c-mo-crear-un-enlace-simb-lico"><strong>Cómo crear un enlace simbólico</strong></h2><p>La sintaxis para crear un enlace simbólico es:</p><pre><code class="language-shell">ln -s &lt;ruta al archivo/carpeta para enlazar&gt; &lt;la ruta del enlace donde será creado&gt;
</code></pre><p><code>ln</code> es el comando de enlace. El parámetro <code>-s</code> especifica que el enlace debe ser blando. <code>-s</code>también se puede escribir como <code>-symbolic</code>.</p><p>Por defecto, el comando <code>ln</code> crea enlace duro. El siguiente argumento es <code>ruta al archivo (o carpeta)</code> que desea vincular. (Es decir, la ruta al archivo o carpeta para el que desea crear un acceso directo).</p><p>Y el último argumento es la <code>ruta del enlace</code> (la ruta para el acceso directo).</p><h2 id="c-mo-crear-un-enlace-simb-lico-para-un-archivo-comando-de-ejemplo"><strong>Cómo crear un enlace simbólico para un archivo: comando de ejemplo</strong></h2><pre><code class="language-shell">ln -s /home/james/transacciones.txt trans.txt
</code></pre><p>Después de ejecutar este comando, podrá acceder al archivo <code>/home/james/transacciones.txt</code> con <code>trans.txt</code>. Cualquier modificación a <code>trans.txt</code>también se reflejará en el archivo original.</p><p>Tenga en cuenta que el comando anterior creará el archivo de enlace <code>trans.txt</code> en su directorio actual. También puede crear un archivo vinculado dentro de una carpeta:</p><pre><code class="language-shell">ln -s /home/james/transactions.txt mis-cosas/trans.txt
</code></pre><p>Debe haber un directorio llamado "mis-cosas" en su directorio actual; de lo contrario, el comando generará un error.</p><h2 id="c-mo-crear-un-enlace-simb-lico-para-una-carpeta-comando-de-ejemplo"><strong>Cómo crear un enlace simbólico para una carpeta: comando de ejemplo</strong></h2><p>Parecido a lo anterior, usaríamos:</p><pre><code class="language-shell">ln -s /home/james james
</code></pre><p>Esto crearía una carpeta con enlazada simbólicamente llamada 'james' que contendría el contenido de <code>/home/james</code>. Cualquier cambio en esta carpeta vinculada también afectará a la carpeta original.</p><h2 id="c-mo-eliminar-un-enlace-simb-lico"><strong>Cómo eliminar un enlace simbólico</strong></h2><p>Antes de querer eliminar un enlace simbólico, es posible que desee confirmar que un archivo o carpeta es un enlace simbólico, para que no manipule sus archivos.</p><p>Una forma de hacerlo es:</p><pre><code class="language-shell">ls -l &lt;ruta-a-supuesto-enlace-simbólico&gt;
</code></pre><p>Ejecutando este comando en su terminal mostrará las propiedades del archivo. En el resultado, si el primer carácter es una letra L minúscula ('l'), significa que el archivo/carpeta es un enlace simbólico.</p><p>También verá una flecha (-&gt;) al final que indica el archivo/carpeta al que apunta el enlace simbólico.</p><p>Hay dos métodos para eliminar un enlace simbólico:</p><h3 id="c-mo-usar-unlink-para-eliminar-un-enlace-simb-lico"><strong>Cómo usar Unlink para eliminar un enlace simbólico</strong></h3><p>La sintaxis es:</p><pre><code class="language-shell">unlink &lt;ruta-al-enlace-simbólico&gt;
</code></pre><p>Esto elimina el enlace simbólico si el proceso tiene éxito.</p><p>Aunque el enlace simbólico tenga la forma de una carpeta, no agregue '/', porque Linux asumirá que es un directorio y <code>unlink</code> no puede eliminar directorios.</p><h3 id="c-mo-usar-rm-para-eliminar-un-enlace-simb-lico"><strong>Cómo usar rm para eliminar un enlace simbólico</strong></h3><p>Como hemos visto, un enlace simbólico es solo otro archivo o carpeta que apunta a un archivo o carpeta original. Para eliminar esa relación, puede eliminar el archivo vinculado.</p><p>Por lo tanto, la sintaxis es:</p><pre><code class="language-shell">rm &lt;ruta-al-enlace-simbólico&gt;
</code></pre><p>Por ejemplo:</p><pre><code class="language-shell">rm trans.txt
rm james
</code></pre><p>Tenga en cuenta que intentar hacer <code>rm james/</code>dará un error, porque Linux asumirá que 'james/' es un directorio, lo que requeriría otras opciones como <code>r</code>y <code>f</code>. Pero eso no es lo que queremos. Un enlace simbólico puede ser una carpeta, pero solo nos preocupa el nombre.</p><p>El principal beneficio de <code>rm</code> sobre <code>unlink</code> es que puede eliminar varios enlaces simbólicos a la vez, como puede hacer con los archivos.</p><h2 id="c-mo-encontrar-y-eliminar-enlaces-rotos"><strong>Cómo encontrar y eliminar enlaces rotos</strong></h2><p>Los enlaces se rompen cuando el archivo o la carpeta a la que apunta un enlace simbólico cambia de ruta o se elimina.</p><p>Por ejemplo, sí 'transacciones.txt' se mueve de <code>/home/james</code>a <code>/home/james/personal</code>, el enlace 'trans.txt' se rompe. Cada intento de acceder al archivo resultará en un error 'No existe el archivo o directorio'. Esto se debe a que el enlace no tiene contenido propio.</p><p>Cuando descubra enlaces rotos, puede eliminar fácilmente el archivo. Una manera fácil de encontrar enlaces simbólicos rotos es:</p><pre><code class="language-shell">find /home/james -xtype l
</code></pre><p>Esto enumerará todos los enlaces simbólicos rotos en el directorio <code>james</code>, desde archivos hasta directorios y subdirectorios.</p><p>Con la opción<code>-delete</code> los eliminará:</p><pre><code class="language-shell">find /home/james -xtype l -delete
</code></pre><h2 id="conclusi-n"><strong>Conclusión</strong></h2><p>Los enlaces simbólicos son una característica interesante de los sistemas Linux y UNIX.</p><p>Puede crear enlaces simbólicos de fácil acceso para hacer referencia a un archivo o carpeta a los que de otro modo no sería conveniente acceder. Con un poco de práctica, comprenderá cómo funcionan a un nivel intuitivo y lo harán mucho más eficiente en la administración de sistemas de archivos.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Linux: cómo añadir y crear usuarios con useradd ]]>
                </title>
                <description>
                    <![CDATA[ Si más de una persona está usando su máquina Linux en casa, o si estás administrando un servidor que brinda acceso a múltiples usuarios, el comando  useradd es esencial para crear nuevos usuarios. Además, muchos de los servicios que utilizas como desarrollador pueden requerir sus propias cuentas de usuario ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/linux-como-anadir-y-crear-usuarios-con-useradd/</link>
                <guid isPermaLink="false">632cc81e36d7bd096041b298</guid>
                
                    <category>
                        <![CDATA[ Linux ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Federico Holc ]]>
                </dc:creator>
                <pubDate>Thu, 17 Nov 2022 05:59:40 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2022/09/5f9c9c8c740569d1a4ca32d2.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/linux-how-to-add-users-and-create-users-with-useradd/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">https://www.freecodecamp.org/news/linux-how-to-add-users-and-create-users-with-useradd/</a>
      </p><p>Si más de una persona está usando su máquina Linux en casa, o si estás administrando un servidor que brinda acceso a múltiples usuarios, el comando <code>useradd</code> &nbsp;es esencial para crear nuevos usuarios.</p><p>Además, muchos de los servicios que utilizas como desarrollador pueden requerir sus propias cuentas de usuario para funcionar. Entonces, incluso como desarrollador independiente en tu propia máquina es posible que busques estos comandos cuando instales MySQL o algo similar.</p><p>Puedes obtener una descripción general completa de las diversas opciones disponibles viendo la documentación del manual de la utilidad: <code>man useradd</code>.</p><p>Pero si eso resulta abrumador, aquí hay un desglose de algunas de las opciones comunes que puedes usar al crear un usuario.</p><h2 id="crear-un-usuario"><strong>Crear un usuario</strong></h2><p>El formato simple para este comando es <code>useradd [opciones] NOMBREDEUSUARIO</code>.</p><p>Por ejemplo: <code>useradd test</code> (anteponer <code>sudo</code> si no has iniciado sesión como usuario root).</p><p>Esto creará un usuario llamado test, pero es una operación limitada y no generará otras cosas útiles como su carpeta de inicio (home), o su palabra clave (password).</p><h2 id="a-adir-una-palabra-clave"><strong>Añadir una palabra clave</strong></h2><p>Luego puedes añadir una palabra clave para el usuario test usando el comando: <code>passwd test</code>. A continuación te pedirá que ingreses una palabra clave para el usuario.</p><p><em>Hay una opción para añadir una palabra clave encriptada a través de la opción<em> </em></em><code><em><em>-p</em></em></code><em><em> </em>en<em> </em></em><code><em><em>useradd</em></em></code><em><em>, </em>pero no es recomendable por razones de seguridad.</em></p><p>Ten en cuenta que la opción <code>-p</code> no te permite ingresar una palabra clave como texto sin formato, sino que espera que lo encriptes primero. Esto es intencionalmente difícil porque no deberías hacerlo. Simplemente, utiliza el comando <code>passwd</code>.</p><h2 id="otras-opciones-comunes"><strong>Otras opciones comunes</strong></h2><h3 id="carpetas-de-inicio"><strong>Carpetas de inicio</strong></h3><p>Para crear un usuario con la carpeta de inicio predeterminada (home) utiliza la siguiente opción:</p><p><code>useradd -m test</code></p><p>Este usuario ahora tiene una carpeta /home/test.</p><p>Para crear la carpeta de inicio con otro nombre puedes utilizar la opción <code>-d</code>, por ejemplo, del siguiente modo:</p><p><code>useradd -m -d /nombre-de-carpeta test</code></p><h3 id="shell-int-rprete-de-comandos-"><strong>Shell (intérprete de comandos)</strong></h3><p>De manera predeterminada, es probable que tus usuarios creados tengan el shell de inicio de sesión bin/bash o bin/sh, que estará definido en <code>/etc/default/useradd</code>.</p><p>Puedes anular este valor predeterminado y definir otro con la opción <code>-s</code> del siguiente modo:</p><p><code>useradd -s usr/bin/zsh test</code></p><h2 id="poni-ndolo-todo-junto"><strong>Poniéndolo todo junto</strong></h2><p>Para construir el comando completo, tienes que poner las opciones una tras otra - sin importar el orden - y terminal con el nombre de usuario que quieres crear.</p><p>Entonces, crear un usuario con una carpeta de inicio "home" y un shell personalizado se vería así:</p><p><code>useradd -m -s /usr/bin/zsh user</code></p><p>Y luego tendrías que añadir una palabra clave para el usuario: <code>passwd user</code></p><h2 id="lee-el-manual"><strong>Lee el manual</strong></h2><p>Ahora que has visto lo básico de lo que puede hacer esta herramienta, esperamos que la página man sea un poco navegable.</p><p><code>man useradd</code> te mostrará como añadir cosas, como una fecha de vencimiento de la cuenta, asignar grupos, entre otras.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ El comando Linux LS: Cómo Listar archivos en un directorio + indicadores de opción ]]>
                </title>
                <description>
                    <![CDATA[ Artículo original escrito por Bolaji Ayodeji [https://www.freecodecamp.org/news/author/bolajiayodeji/] Artículo original The Linux LS Command – How to List Files in a Directory + Option Flags [https://www.freecodecamp.org/news/the-linux-ls-command-how-to-list-files-in-a-directory-with-options/] Traducido y adaptado por Rafael D. Hernandez [/espanol/news/author/rafael/] Desde la creación de Unix en la década de 1970, muchos sistemas operativos lo han utilizado como ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/el-comando-linux-ls-como-listar-archivos-en-un-directorio-indicadores-de-opcion/</link>
                <guid isPermaLink="false">61f1a653e56f6e08aa1c383f</guid>
                
                    <category>
                        <![CDATA[ Linux ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Rafael D. Hernandez ]]>
                </dc:creator>
                <pubDate>Wed, 26 Jan 2022 23:10:42 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2022/01/article-banner-7.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p><strong><strong><strong><strong>Artículo original escrito por </strong></strong></strong></strong><a href="https://www.freecodecamp.org/news/author/bolajiayodeji/">Bolaji Ayodeji</a><br><strong><strong><strong><strong>Artículo original </strong></strong></strong></strong><a href="https://www.freecodecamp.org/news/the-linux-ls-command-how-to-list-files-in-a-directory-with-options/">The Linux LS Command – How to List Files in a Directory + Option Flags</a><br><strong><strong><strong><strong>Traducido y adaptado por</strong></strong> </strong></strong><a href="https://www.freecodecamp.org/espanol/news/author/rafael/">Rafael D. Hernandez</a></p><p>Desde la creación de Unix en la década de 1970, muchos sistemas operativos lo han utilizado como base. Muchos de estos sistemas operativos fallaron, mientras que otros tuvieron éxito.</p><p>Linux es uno de los sistemas operativos basados en Unix más populares. Es de código abierto y se utiliza en todo el mundo en muchas industrias.</p><p>Una característica sorprendente del sistema operativo Linux es la Interfaz de Línea de Comandos (CLI) que permite a los usuarios interactuar con su computadora desde un shell. El shell de Linux es un entorno REPL (Lectura, Evaluación, Impresión, Bucle) donde los usuarios pueden introducir un comando y el shell lo ejecuta y devuelve un resultado.</p><p>El comando <code>ls</code> es uno de los muchos comandos de Linux que permiten a un usuario listar archivos o directorios desde la CLI.</p><p>En este artículo, profundizaremos en el comando <code>ls</code> y algunas de las banderas más importantes que necesitarás en el día a día.</p><h2 id="requisitos"><strong>Requisitos</strong></h2><ul><li>Una computadora con directorios y archivos</li><li>Tener instalada una de las distribuciones de Linux</li><li>Conocimientos básicos de navegación por el CLI</li><li>Una sonrisa en tu cara :)</li></ul><h2 id="el-comando-linux-ls">El Comando Linux <code>ls</code></h2><p>El comando <code>ls</code> se utiliza para listar archivos o directorios en Linux y otros sistemas operativos basados en Unix.</p><p>Al igual que navegas en tu <em>explorador de archivos</em> o <em>finder</em> con una interfaz gráfica de usuario, el comando <code>ls</code> te permite enumerar todos los archivos o directorios en el directorio actual de forma predeterminada, e interactuar con ellos a través de la línea de comandos.</p><p>Inicia tu terminal y escribe <code>ls</code> para ver esto en acción:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2020/08/Screenshot-2020-08-20-at-9.40.29-PM.png" class="kg-image" alt="Screenshot-2020-08-20-at-9.40.29-PM" width="600" height="400" loading="lazy"></figure><h2 id="c-mo-listar-archivos-en-un-directorio-con-opciones">Cómo listar archivos en un directorio con opciones</h2><p>El comando <code>ls</code> también acepta algunos indicadores (también conocidos como opciones) que son información adicional que cambia la forma en que se listan los archivos o directorios en su terminal.</p><p>En otras palabras, los indicadores cambian el funcionamiento del comando <code>ls</code>:</p><pre><code> ls [indicadores] [directorio]</code></pre><blockquote>PD: ¿La palabra <strong>contenido</strong> utilizado en todo el artículo se refiere a los <strong>archivos y directorios</strong> que se listan, no al contenido real de los archivos/directorios?</blockquote><h3 id="lista-de-archivos-en-el-directorio-de-trabajo-actual">Lista de archivos en el directorio de trabajo actual</h3><p>Escriba el comando <code>ls</code> para listar el contenido del directorio de trabajo actual:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2020/08/Screenshot-2020-08-20-at-9.40.29-PM.png" class="kg-image" alt="Screenshot-2020-08-20-at-9.40.29-PM" width="600" height="400" loading="lazy"></figure><h3 id="lista-de-archivos-en-otro-directorio">Lista de archivos en otro directorio</h3><p>Escribe el comando <code>ls [ruta de directorio aquí]</code> para listar el contenido de otro directorio:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2020/08/Screenshot-2020-08-20-at-10.32.52-PM.png" class="kg-image" alt="Screenshot-2020-08-20-at-10.32.52-PM" width="600" height="400" loading="lazy"></figure><h3 id="lista-de-archivos-en-el-directorio-ra-z">Lista de archivos en el directorio raíz</h3><p>Escriba el comando <code>ls /</code> para listar el contenido del directorio raíz:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2020/08/Screenshot-2020-08-20-at-10.46.10-PM.png" class="kg-image" alt="Screenshot-2020-08-20-at-10.46.10-PM" width="600" height="400" loading="lazy"></figure><h3 id="lista-de-archivos-en-el-directorio-padre">Lista de archivos en el directorio padre</h3><p>Escribe el <code>ls ..</code> comando para listar el contenido del directorio padre un nivel más arriba. Usa <code>ls ../..</code> para contenidos dos niveles arriba:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2020/08/Screenshot-2020-08-20-at-10.48.22-PM.png" class="kg-image" alt="Screenshot-2020-08-20-at-10.48.22-PM" width="600" height="400" loading="lazy"></figure><h3 id="lista-de-archivos-en-el-directorio-personal-del-usuario-home-user-">Lista de archivos en el directorio personal del usuario (/home / user)</h3><p>Escribe el comando <code>ls ~</code> para listar el contenido en el directorio personal del usuario:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2020/08/Screenshot-2020-08-20-at-10.51.19-PM.png" class="kg-image" alt="Screenshot-2020-08-20-at-10.51.19-PM" width="600" height="400" loading="lazy"></figure><h3 id="listar-solo-directorios">Listar solo directorios</h3><p>Escriba el comando <code>ls -d */</code> para listar solo los directorios:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2020/08/Screenshot-2020-08-21-at-12.53.05-PM.png" class="kg-image" alt="Screenshot-2020-08-21-at-12.53.05-PM" width="600" height="400" loading="lazy"></figure><h3 id="lista-de-archivos-con-subdirectorios">Lista de archivos con subdirectorios</h3><p>Escriba el comando <code>ls *</code> para listar el contenido del directorio con sus subdirectorios:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2020/08/Screenshot-2020-08-21-at-1.07.54-PM.png" class="kg-image" alt="Screenshot-2020-08-21-at-1.07.54-PM" width="600" height="400" loading="lazy"></figure><h3 id="lista-de-archivos-recursivamente">Lista de archivos recursivamente</h3><p>Escribe el comando <code>ls -R</code> para listar todos los archivos y directorios con sus subdirectorios correspondientes hasta el último archivo:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2020/09/Screenshot-2020-09-01-at-9.04.56-AM.png" class="kg-image" alt="Screenshot-2020-09-01-at-9.04.56-AM" width="600" height="400" loading="lazy"></figure><blockquote>Si tiene muchos archivos, puede tardar mucho tiempo en completarse, ya que se imprimirán todos los archivos de cada directorio. En su lugar, puedes especificar un directorio para ejecutar este comando, de la siguiente manera: <code>ls Downloads -R</code></blockquote><h3 id="lista-de-archivos-con-sus-tama-os">Lista de archivos con sus tamaños</h3><p>Escriba el comando <code>ls -s</code> (la <strong>s</strong> es minúscula) para listar archivos o directorios con sus tamaños:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2020/08/Screenshot-2020-08-21-at-12.30.19-PM.png" class="kg-image" alt="Screenshot-2020-08-21-at-12.30.19-PM" width="600" height="400" loading="lazy"></figure><h3 id="lista-de-archivos-en-formato-largo">Lista de archivos en formato largo</h3><p>Escriba el comando <code>ls -l</code> para listar el contenido del directorio en un formato de tabla con columnas incluidas:</p><ul><li>permisos de contenido</li><li>número de enlaces al contenido</li><li>propietario del contenido</li><li>propietario del grupo del contenido</li><li>tamaño del contenido en bytes</li><li>fecha / hora de la última modificación del contenido</li><li>nombre de archivo o directorio</li></ul><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2020/08/Screenshot-2020-08-20-at-10.52.37-PM.png" class="kg-image" alt="Screenshot-2020-08-20-at-10.52.37-PM" width="600" height="400" loading="lazy"></figure><h3 id="lista-de-archivos-en-formato-largo-con-tama-os-de-archivo-legibles">Lista de archivos en formato largo con tamaños de archivo legibles</h3><p>Escribe el comando <code>ls -lh</code> para listar los archivos o directorios en el mismo formato de tabla anterior, pero con otra columna que represente el tamaño de cada archivo/directorio:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2020/08/Screenshot-2020-08-21-at-12.14.33-PM.png" class="kg-image" alt="Screenshot-2020-08-21-at-12.14.33-PM" width="600" height="400" loading="lazy"></figure><p>Ten en cuenta que los tamaños se enumeran en bytes (B), megabytes (MB), gigabytes (GB) o terabytes (TB) cuando el tamaño del archivo o directorio es superior a 1024 bytes.</p><h3 id="lista-de-archivos-incluidos-los-archivos-ocultos">Lista de archivos, incluidos los archivos ocultos</h3><p>Escribe el comando <code>ls -a</code> para listar archivos o directorios, incluidos archivos o directorios ocultos. En Linux, cualquier cosa que comience con un <code>.</code> se considera un archivo oculto:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2020/08/Screenshot-2020-08-21-at-11.12.26-AM.png" class="kg-image" alt="Screenshot-2020-08-21-at-11.12.26-AM" width="600" height="400" loading="lazy"></figure><h3 id="lista-de-archivos-en-formato-largo-incluidos-los-archivos-ocultos">Lista de archivos en formato largo, incluidos los archivos ocultos</h3><p>Escriba el comando <code>ls -l -a</code> o <code>ls -a -l</code> o <code>ls -la</code> o <code>ls -al</code> para listar archivos o directorios en un formato de tabla con información adicional, incluidos archivos o directorios ocultos:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2020/08/Screenshot-2020-08-21-at-12.17.01-PM.png" class="kg-image" alt="Screenshot-2020-08-21-at-12.17.01-PM" width="600" height="400" loading="lazy"></figure><h3 id="listar-archivos-y-ordenar-por-fecha-y-hora">Listar archivos y ordenar por fecha y hora</h3><p>Escribe el comando <code>ls -t</code> para listar archivos o directorios y ordenar por fecha de última modificación en orden descendente (de mayor a menor).</p><p>También puedes agregar el indicador <code>-r</code> para invertir el orden de clasificación de la siguiente manera: <code>ls -tr</code>:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2020/08/Screenshot-2020-08-21-at-12.20.09-PM.png" class="kg-image" alt="Screenshot-2020-08-21-at-12.20.09-PM" width="600" height="400" loading="lazy"></figure><h3 id="lista-de-archivos-y-ordenar-por-tama-o-de-archivo">Lista de archivos y ordenar por tamaño de archivo</h3><p>Escribe el comando <code>ls -S</code> (la <strong>S</strong> es mayúscula) para listar archivos o directorios y ordenar por tamaño en orden descendente (de mayor a menor).</p><p>También puedes agregar un indicador <code>-r</code> para invertir el orden de clasificación de la siguiente manera: <code>ls -Sr</code>:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2020/08/Screenshot-2020-08-21-at-12.20.38-PM.png" class="kg-image" alt="Screenshot-2020-08-21-at-12.20.38-PM" width="600" height="400" loading="lazy"></figure><h3 id="listar-archivos-y-generar-el-resultado-en-un-archivo">Listar archivos y generar el resultado en un archivo</h3><p>Escriba la salida <code>ls &gt; output.txt</code> para imprimir el resultado del comando anterior en un archivo <code>output.txt</code>. Puedes usar cualquiera de los indicadores discutidos antes como <code>-la</code> — el punto clave aquí es que el resultado se generará en un archivo y no se registrará en la línea de comandos.</p><p>A continuación, puede usar el archivo como mejor le parezca, o registrar el contenido del archivo con <code>cat output.txt</code>:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2020/09/Screenshot-2020-09-01-at-9.12.59-AM.png" class="kg-image" alt="Screenshot-2020-09-01-at-9.12.59-AM" width="600" height="400" loading="lazy"><figcaption>.</figcaption></figure><h1 id="conclusion"><strong>Conclusion</strong></h1><p>Hay toneladas de otros comandos y combinaciones que puedes explorar para enumerar archivos y directorios en función de tus necesidades. Una cosa a recordar es la capacidad de combinar varios comandos a la vez.</p><p>Imagina que deseas enumerar un archivo en formato largo, incluyendo los archivos ocultos, y ordenarlos por tamaño de archivo. El comando <code>ls -alS</code>, que es una combinación de <code>ls -l</code>, <code>ls -a</code> y <code>ls -S</code>.</p><p>Si olvidas algún comando o no estás seguro de qué hacer, puedes ejecutar <code>ls --help</code> o <code>man ls</code>, que mostrará un manual con todas las opciones posibles para el comando <code>ls</code>:</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2020/09/Screenshot-2020-09-01-at-9.57.37-AM.png" class="kg-image" alt="Screenshot-2020-09-01-at-9.57.37-AM" width="600" height="400" loading="lazy"></figure><p>Gracias por leer!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Tutorial del comando Grep – Cómo buscar un archivo en Linux y Unix con búsqueda recursiva ]]>
                </title>
                <description>
                    <![CDATA[ grep significa Globally Search For Regular Expression and Print out (Búsqueda global de expresiones regulares). Es una herramienta de línea de comando usada en sistemas Linux y Unix para buscar un patrón específico en un archivo o grupo de archivos.  grep tiene muchas opciones que permiten realizar varias acciones ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/grep-command-tutorial-how-to-search-for-a-file-in-linux-and-unix-with-recursive-find/</link>
                <guid isPermaLink="false">601042e2a4e0700982aa0d9f</guid>
                
                    <category>
                        <![CDATA[ Linux ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Isabella Serna ]]>
                </dc:creator>
                <pubDate>Wed, 24 Mar 2021 04:53:12 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/01/grep.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p><code>grep</code> significa <em><em>Globally Search For Regular Expression and Print out</em> (</em>Búsqueda global de expresiones regulares<em>). </em>Es una herramienta de línea de comando usada en sistemas Linux y Unix para buscar un patrón específico en un archivo o grupo de archivos. </p><p><code>grep</code> tiene muchas opciones que permiten realizar varias acciones relacionadas con la búsqueda en archivos. En este artículo, observaremos como usar el comando <code>grep</code> con sus opciones disponibles tanto como expresiones regulares básicas para buscar archivos.</p><h2 id="c-mo-usar-grep"><strong>Cómo usar <code>grep</code></strong></h2><p>Sin el paso de ninguna opción, <code>grep</code> puede ser usado para buscar un patrón en un archivo o grupo de archivos. La sintaxis es:</p><pre><code class="language-bash">grep '&lt;texto-buscado&gt;' &lt;archivo/archivos&gt;
</code></pre><p><strong>Tenga en cuenta </strong>que las comillas simples o dobles son requeridas alrededor del texto si es más de una palabra.</p><p>Tú puedes además usar el <strong>comodín <strong>(*)</strong> </strong>para seleccionar todos los archivos en un directorio.</p><p>El resultado de esto son las ocurrencias del patrón (por la línea en la que se encuentra) en los archivos. Si no existe una coincidencia, no se imprimirá ninguna salida en la terminal.</p><p>Por ejemplo, supongamos que tenemos los siguientes archivos (llamados grep.txt):</p><pre><code class="language-default">Hello, how are you
I am grep
Nice to meet you
</code></pre><p>El siguiente comando grep buscará todas las ocurrencias de la palabra "you":</p><pre><code class="language-bash">grep you grep.txt
</code></pre><p>El resultado será:</p><pre><code class="language-bash">Hello, how are you
Nice to meet you
</code></pre><p><code>you</code> se espera que tenga un color diferente al del otro texto para identificar fácilmente lo que se buscó.</p><p>Pero <code>grep</code> viene con más opciones que nos ayudan a lograr más durante la operación de búsqueda. Veamos nueve de ellos mientras los aplicamos al ejemplo anterior.</p><h3 id="opciones-usadas-con-grep"><strong>Opciones usadas con <code>grep</code></strong></h3><h4 id="1-n-line-number-enumera-los-n-meros-de-l-nea"><strong>1. <code>-n</code> (--line-number) - enumera los números de línea</strong></h4><p>Imprime las coincidencias de un texto junto con los números de línea. Si observas el resultado anterior, notarás que no se encuentran los números de líneas, solo las coincidencias.</p><pre><code class="language-bash">grep you grep.txt -n
</code></pre><p>Resultado:</p><pre><code class="language-bash">1: Hello, how are you
3: Nice to meet you
</code></pre><h4 id="2-c-count-imprime-el-n-mero-de-l-neas-de-coincidencias"><strong>2. <code>-c</code> (--count) - </strong>imprime el número de líneas de coincidencias</h4><pre><code class="language-bash">grep you grep.txt -c
</code></pre><p>Resultado:</p><pre><code class="language-bash">2
</code></pre><p><strong>Tenga en cuenta </strong>si existiera otro "you" en la línea uno, la opción <code>-c</code> &nbsp;aún imprimiría 2. Esto porque está relacionada con el número de líneas donde aparecen las coincidencias, no la cantidad de coincidencias.</p><p><strong>3. <code>-v</code> (--invert-match) - imprime las líneas que no coinciden con el patrón especificado</strong></p><pre><code class="language-bash">grep you grep.txt -v -n
</code></pre><p>Resultado:</p><pre><code class="language-bash">2. I am grep
</code></pre><p>Notaste que nosotros usamos también la opción &nbsp;<code>-n</code>? Si, es posible usar múltiples opciones en un solo comando.</p><h4 id="4-i-ignore-case-utilizado-para-la-distinci-n-de-may-sculas-y-min-sculas"><strong>4. <code>-i</code> (--ignore-case) - </strong>Utilizado para la distinción de mayúsculas y minúsculas</h4><pre><code class="language-bash"># comando 1
grep You grep.txt
# comando 2
grep YoU grep.txt -i
</code></pre><p>Resultado:</p><pre><code class="language-bash"># resultado 1
# no hay resultados
# resultado 2
Hello, how are you
Nice to meet you
</code></pre><h4 id="5-l-files-with-matches-imprimir-nombres-de-archivos-que-coincidan-con-un-patr-n"><strong>5. <code>-l</code> (--files-with-matches) - </strong>imprimir nombres de archivos que coincidan con un patrón</h4><pre><code class="language-bash"># comando 1
grep you grep.txt -l
# comando 2
grep You grep.txt -i -l
</code></pre><p>Resultado:</p><pre><code class="language-bash"># resultado 1
grep.txt
# resultado 2
# todos los archivos en el directorio actual que coincidan
# el texto 'You' sea mayúscula o minúscula
</code></pre><pre><code>#### 6. `-w` (--word-regexp) - imprime coincidencias de toda la palabra
</code></pre><p>Por defecto, <code>grep</code> coincide con cadenas que contienen el patrón especificado. Esto significa que <code>grep yo grep.txt</code> imprimirá los mismos resultados que &nbsp;<code>grep yo grep.txt</code> porque 'yo' puede ser encontrado en 'you'. Similarmente 'ou'.</p><p>Con la opción <code>-w</code>, <code>grep</code> se asegura que las coincidencias sean exactamente el mismo patrón especificado, Ejemplo:</p><pre><code class="language-bash">grep yo grep.txt -w
</code></pre><p>Resultado:</p><p>Sin resultados!</p><h4 id="7-o-only-matching-imprimir-solo-el-patr-n-coincidente"><strong>7. <code>-o</code> (--only-matching) - i</strong>mprimir solo el patrón coincidente</h4><p>Por defecto, <code>grep</code> imprime la línea donde se encuentra el patrón que coincide. Con la opción <code>-o</code> , solo los patrones que coincidan son impresos línea por línea. Ejemplo:</p><pre><code class="language-bash">grep yo grep.txt -o
</code></pre><p>Resultado:</p><pre><code class="language-bash">yo
</code></pre><h4 id="8-a-after-context-y-b-before-context-imprimir-las-l-neas-despu-s-y-antes-respectivamente-del-patr-n-coincidente"><strong>8. <code>-A</code> (--after-context) y <code>-B</code> (--before-context) - </strong>imprimir las líneas después y antes (respectivamente) del patrón coincidente</h4><pre><code class="language-bash">grep grep grep.txt -A 1 -B 1
</code></pre><p>Resultado:</p><pre><code class="language-bash">Hello, how are you
I am grep
Nice to meet you
</code></pre><p>Esta coincidencia de patrón se encuentra en la línea 2. <code>-A 1</code> significa una línea después de la línea que coincide y <code>-B 1</code> significa una línea antes de la línea que coincide.</p><p>Además existe <code>-C</code> (--context) opción el cual es igual a <code>-A</code> + <code>-B</code>. &nbsp;El valor pasado a -C se usaría para -A y -B.</p><h4 id="9-r-dereference-recursive-b-squeda-recursiva"><strong>9. <code>-R</code> (--dereference-recursive) - </strong>búsqueda recursiva</h4><p>Por defecto, <code>grep</code> no puede buscar directorios. Si tú intentas hacerlo, obtendrás un error ("Es un directorio"). Con la opción &nbsp;<code>-R</code>, la búsqueda de archivos entre directorios y subdirectorios se vuelve posible. Ejemplo:</p><pre><code class="language-bash">grep you .
</code></pre><p>Resultado:</p><pre><code class="language-bash"># 'you' coincide en carpetas
# y archivos a partir del
# directorio actual</code></pre><h3 id="expresiones-regulares-para-patrones">Expresiones regulares para patrones</h3><p><code>grep</code> también permite especificar patrones con expresiones regulares básicas. Dos de ellas son:</p><h4 id="1-pattern-inicio-de-l-nea"><strong>1. <code>^pattern</code> - Inicio de línea</strong></h4><p>Este patrón significa que <code>grep</code> solo coincide con cadenas cuyas líneas empiecen con la cadena especificada después <code>^</code>. Ejemplo:</p><pre><code class="language-bash">grep ^I grep.txt -n
</code></pre><p>Resultado:</p><pre><code class="language-bash">2: I
</code></pre><h4 id="2-pattern-fin-de-la-l-nea"><strong>2. <code>pattern$</code> - fin de la línea</strong></h4><p>En contraste con &nbsp;<code>^</code>, <code>$</code> especifica patrones que coincidirán si la línea termina con la cadena antes <code>$</code>. Ejemplo:</p><pre><code class="language-bash">grep you$ grep.txt
</code></pre><p>Resultado:</p><pre><code class="language-bash">1: Hello, how are you
3: Nice to meet you
</code></pre><h2 id="resumen"><strong>Resumen</strong></h2><p><code>grep</code> es una herramienta poderosa para la búsqueda de archivos en la terminal.</p><p>Entender como usarlo te brinda la habilidad de encontrar fácilmente archivos por medio de la terminal.</p><p>Existen más opciones relacionadas con esta herramienta. Puedes encontrarlas con el comando <code>man grep</code>.</p><p>Traducido del artículo de &nbsp;- <strong><a href="https://www.freecodecamp.org/news/author/dillionmegida/"><strong>Dillion Megida</strong></a> - <a href="https://www.freecodecamp.org/news/grep-command-tutorial-how-to-search-for-a-file-in-linux-and-unix/">Grep Command Tutorial – How to Search for a File in Linux and Unix with Recursive Find</a></strong></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Instalación y configuración de un servidor de FTP en Linux Redhat/CentOS ]]>
                </title>
                <description>
                    <![CDATA[ FTP son las siglas de File Transfer Protocol (Protocolo de Transferencia de Archivos). Fue escrito por Abhay Bhushan y publicado como RFC 114 el 16 de abril de 1971. Es compatible con todos los sistemas operativos y navegadores. Se basa en una arquitectura cliente-servidor. Cómo instalar y configurar un servidor ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/instalacion-y-configuracion-de-un-servidor-de-ftp-en-linux-redhat-centos/</link>
                <guid isPermaLink="false">60113e0ba4e0700982aa10d8</guid>
                
                    <category>
                        <![CDATA[ Linux ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Aitor Zaldua ]]>
                </dc:creator>
                <pubDate>Tue, 23 Mar 2021 06:12:56 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/01/photo-1571786256017-aee7a0c009b6.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>FTP son las siglas de File Transfer Protocol (Protocolo de Transferencia de Archivos). Fue escrito por Abhay Bhushan y publicado como RFC 114 el 16 de abril de 1971. Es compatible con todos los sistemas operativos y navegadores. Se basa en una arquitectura cliente-servidor.</p><h2 id="c-mo-instalar-y-configurar-un-servidor-ftp-en-linux-redhat-centos"><strong>Cómo instalar y configurar un servidor FTP en Linux Redhat/CentOS</strong></h2><p>Paso 1: Usaremos localhost (127.0.0.1) en nuestro equipo para configurar el servidor ftp.</p><p>Paso 2: Instalar el paquete vsftpd (muy seguro FTP daemon).</p><p><code>yum install -y vsftpd</code></p><p>Paso 3: Inicia el servidor FTP cuando el sistema esté encendido.</p><p><code>systemctl enable vsftpd.service</code></p><p>Paso 4: Comprobar el estado del servidor de FTP.</p><p><code>systemctl status vsftpd.service</code></p><p>Paso 5: Configura el paquete vsftpd. Editaremos <code>/etc/vsftpd/vsftpd.conf</code></p><pre><code class="language-text">// Cambia la línea que contiene anonymous_enable=NO a
anonymous_enable=YES

</code></pre><p>Esto le permitirá a cualquiera acceder al servidor FTP con autenticación.</p><pre><code>// Cambie lo siguiente a YES
local_enable=YES
write_enable=YES&lt;br&gt;</code></pre><p>Paso 6: Inicia el servidor FTP.<br><code>systemctl start vsftpd.service</code></p><p>Paso 7: Instala el cliente de FTP.<br><code>yum install -y lftpd</code></p><p>Paso 8: Conecta el FTP al localhost.<br><code>lftp localhost</code></p><p>Traducido del artículo - <strong><a href="https://www.freecodecamp.org/news/install-and-configure-ftp-server-in-redhat-centos-linux/">Install and configure an FTP server in Redhat/Centos Linux</a></strong></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Como configurar un servidor LAMP en una máquina Ubuntu Linux local o VM ]]>
                </title>
                <description>
                    <![CDATA[ Este breve artículo tiene como propósito guiarte a través del proceso de configuración de un servidor LAMP (Linux, Apache, MySQL, PHP) sobre una máquina Ubuntu Linux local o virtual. Esto te permitirá trabajar utilizando PHP y MySQL (mediante phpMyAdmin), herramientas comúnmente necesarias para el desarrollo en Wordpress. Instalando los paquetes ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-configurar-un-servidor-lamp/</link>
                <guid isPermaLink="false">600f58d5a4e0700982aa0d20</guid>
                
                    <category>
                        <![CDATA[ Linux ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Fausto Alejandro Hernandez Aguilar ]]>
                </dc:creator>
                <pubDate>Mon, 22 Mar 2021 04:42:57 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/03/photo-1555488205-d5e67846cf40-1-.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Este breve artículo tiene como propósito guiarte a través del proceso de configuración de un servidor LAMP (Linux, Apache, MySQL, PHP) sobre una máquina Ubuntu Linux local o virtual.</p><p>Esto te permitirá trabajar utilizando PHP y MySQL (mediante phpMyAdmin), herramientas comúnmente necesarias para el desarrollo en Wordpress.</p><h2 id="instalando-los-paquetes-necesarios"><strong><strong>Instal</strong>ando los paquetes necesarios</strong></h2><p>Necesitarás instalar los siguientes paquetes para el servidor LAMP. Puedes instalarlos todos juntos separando el nombre de cada paquete con un espacio, o uno a la vez como se mostrará aquí.</p><p>Yo prefiero descargarlos uno a la vez, ya que simplifica la detección de errores.</p><p>Abre una terminal y teclea lo siguiente:</p><ul><li><code>sudo apt-get install apache2</code></li><li><code>sudo apt-get install php</code></li><li><code>sudo apt-get install php-mysql</code></li><li><code>sudo apt-get install mysql-server</code></li></ul><p>Se te solicitará establecer una contraseña para el usuario raíz de MySQL. Una vez hecho esto, prosigue con la instalación tecleando:</p><ul><li><code>sudo apt-get install libapache2-mod-php</code></li><li><code>sudo apt-get install php-mcrypt</code></li><li><code>sudo apt-get install phpmyadmin</code></li></ul><p>Deberás elegir que servidor utilizar. Selecciona Apache presionando la tecla enter. Selecciona no para configuración avanzada del servidor.</p><h2 id="cambiando-permisos-al-directorio-var-www-html"><strong><strong>C</strong>ambiando permisos al directorio<strong> /var/www/html</strong></strong></h2><p>Para que los scripts y archivos PHP puedan ser ejecutados por el servidor LAMP deberán ser almacenados en el directorio /var/www/html. Puedes considerar esta ubicación como tu servidor local.</p><p>Tendremos que cambiar los permisos de este directorio para que se nos permita hacer cambios en él. Ingresa en la terminal este comando:</p><p><code>sudo chown {tu usuario ubuntu} /var/www/html</code></p><h2 id="creando-un-enlace-simb-lico-a-phpmyadmin"><strong><strong>Crea</strong>ndo un enlace simbólico a<strong> phpMyAdmin</strong></strong></h2><p>De manera predeterminada, phpMyAdmin se instala en el directorio /usr/share. Necesitamos enlazarlo al directorio de nuestro servidor local.</p><p>Nos dirigimos al directorio del servidor en donde queremos el enlace con: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <code>cd /var/www/html</code></p><p>Creamos entonces el enlace simbólico ingresando el comando <code>ln -s /usr/share/phpmyadmin phpmyadmin</code>.</p><h2 id="reiniciando-apache-y-probando"><strong><strong>Re</strong>iniciando Apache y probando</strong></h2><p>Ejecuta el siguiente comando para reiniciar Apache, estableciendo los cambios que hemos realizado:</p><p><code>sudo systemctl restart apache2</code></p><p>Ahora deberás ser capaz de crear un archivo info.php en el directorio /var/www/html con el comando: <code>touch /var/www/html/info.php</code></p><p>Añade al archivo el siguiente código:</p><p><code>&lt;?php phpinfo(); ?&gt;</code></p><p>Ahora, abre un navegador y escribe en la barra de direcciones localhost/info.php. Deberás ver una página generada por el archivo creado que muestra información sobre PHP.</p><p>Finalmente, para acceder a phpMyAdmin dirígete a localhost/phpmyadmin en el navegador. El nombre del usuario raíz por defecto es 'root' y la contraseña será la que definiste anteriormente para la base de datos MySQL.</p><p>Traducido del artículo: <strong><a href="https://www.freecodecamp.org/news/how-to-setup-a-lamp-server-on-a-local-ubuntu-linux-machine-or-vm">How to Setup a LAMP Server on a Local Ubuntu Linux Machine or VM</a></strong></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Tutorial de enlace simbólico en Linux: cómo crear y remover un enlace simbólico ]]>
                </title>
                <description>
                    <![CDATA[ Un symlink (también llamado enlace simbólico) es un tipo de archivo en Linux que apunta a otro archivo o una carpeta en tu computador. Los enlaces simbólicos son similares a los accesos directos en Windows. Algunas personas llaman a los enlaces simbólicos  "soft links" - un tipo de enlace en ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/tutorial-de-enlace-simbolico-en-linux-como-crear-y-remover-un-enlace-simbolico/</link>
                <guid isPermaLink="false">6003a078a4e0700982a9e171</guid>
                
                    <category>
                        <![CDATA[ Linux ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Santiago Toquica Yanguas ]]>
                </dc:creator>
                <pubDate>Mon, 08 Mar 2021 05:27:03 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/03/photo-1570460147789-4e2e622bbb25-1-.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Un <strong>symlink</strong> (también llamado enlace simbólico) es un tipo de archivo en Linux que apunta a otro archivo o una carpeta en tu computador. Los enlaces simbólicos son similares a los accesos directos en Windows.</p><p>Algunas personas llaman a los enlaces simbólicos &nbsp;"soft links" - un tipo de enlace en los sistemas Linux/UNIX - opuestos a los "hard links".</p><h2 id="diferencia-entre-un-soft-link-y-un-hard-link">Diferencia entre un soft link y un hard link</h2><p>Los soft Links son similares a los accesos directos, pueden apuntar a otro archivo o directorio en cualquier sistema de archivos.</p><p>Los hard links también son accesos directos para archivos y carpetas, pero no se puede crear un hard link para una carpeta o un archivo en un sistema de archivos diferente.</p><p>Veamos los pasos para crear y eliminar un enlace simbólico. También veremos qué son los enlaces rotos y cómo eliminarlos.</p><h2 id="c-mo-crear-un-enlace-simb-lico">Cómo crear un enlace simbólico</h2><p>La sintaxis para crear un enlace simbólico es:</p><figure class="kg-card kg-code-card"><pre><code class="language-shell">ln -s &lt;ruta del archivo/Carpeta a ser enlazado&gt; &lt;ruta del enlace que se creará&gt;
</code></pre><figcaption>Crear un enlace simbólico</figcaption></figure><p><code>ln</code> es el comando de enlace. La bandera <code>-s</code> especifica que el enlace debe ser soft. Las <code>-s</code> también pueden ser introducidas como <code>-symbolic</code>.</p><p>Por defecto, el comando <code>ln</code> crea hard links. El siguiente argumento es la <code>ruta del archivo (o carpeta)</code> que quieres enlazar. (Es decir, el archivo o carpeta para el acceso directo que quieres crear).</p><p>El último argumento es la <code>ruta para enlazarse</code> a sí mismo (el acceso directo).</p><h2 id="c-mo-crear-un-enlace-simb-lico-para-un-archivo-comando-de-ejemplo">Cómo crear un enlace simbólico para un archivo - comando de ejemplo</h2><figure class="kg-card kg-code-card"><pre><code class="language-shell">ln -s /home/james/transacciones.txt trans.txt
</code></pre><figcaption>Ejemplo</figcaption></figure><p>Después de ejecutar este comando, tú podrías acceder a <code>/home/james/transacciones.txt</code> con <code>trans.txt</code>. Cualquier modificación en el <code>trans.txt</code> también se reflejará en el archivo original.</p><p>Tenga en cuenta que este comando de arriba crearía el archivo de enlace <code>trans.txt</code> en su directorio actual. Tú también puedes crear un archivo de enlace en una carpeta que enlace esto:</p><figure class="kg-card kg-code-card"><pre><code class="language-shell">ln -s /home/james/transacciones.txt mis-cosas/trans.txt
</code></pre><figcaption>Enlaces</figcaption></figure><p>Debe haber un directorio ya llamado "mis-cosas" en su directorio actual - si no, el comando arrojará un error.</p><h2 id="c-mo-crear-un-enlace-simb-lico-para-una-carpeta-comando-de-ejemplo">Cómo crear un enlace simbólico para una carpeta - comando de ejemplo</h2><p>Como en el caso anterior, usaríamos:</p><figure class="kg-card kg-code-card"><pre><code class="language-shell">ln -s /home/james james
</code></pre><figcaption>Enlace Smbólico</figcaption></figure><p>Esto crearía una carpeta simbólica llamada 'james' que contendría el contenido de <code>/home/james</code>. Cualquier cambio en esta carpeta vinculada también afectará a la carpeta original.</p><h2 id="c-mo-remover-un-enlace-simb-lico">Cómo remover un enlace simbólico</h2><p>Antes de que tú quieras eliminar un enlace simbólico, tú puedes confirmar que un archivo o una carpeta es un enlace simbólico, para no manipular tus archivos.</p><p>Una forma de hacer esto es:</p><figure class="kg-card kg-code-card"><pre><code class="language-shell">ls -l &lt;ruta-a-ser-enlace-simbolico&gt;
</code></pre><figcaption>Listar archivos</figcaption></figure><p>Al ejecutar este comando en tu terminal, se mostrarán las propiedades del archivo. En el resultado, si el primer carácter es una L minúscula ('l'), significa que el archivo/carpeta es un enlace simbólico.</p><p>También verías una flecha (-&gt;) al final que indica el archivo/carpeta al que apunta el enlace del símbolo.</p><p>Hay dos métodos para eliminar un enlace simbólico:</p><h3 id="c-mo-usar-unlink-para-eliminar-un-enlace-simb-lico">Cómo usar unlink para eliminar un enlace simbólico</h3><p>La sintaxis es:</p><figure class="kg-card kg-code-card"><pre><code class="language-shell">unlink &lt;ruta-enlace-simbolico&gt;
</code></pre><figcaption>Desenlazar</figcaption></figure><p>Esto elimina el enlace simbólico, si el proceso tiene éxito.</p><p>Incluso si el enlace simbólico tiene forma de carpeta, no añada '/', porque Linux asumirá que es un directorio y el <code>unlink</code> no puede borrar directorios.</p><h3 id="c-mo-usar-rm-para-remover-un-symlink">Cómo usar rm para remover un symlink</h3><p>Como hemos visto, un enlace simbólico es sólo otro archivo o carpeta que apunta a un archivo o carpeta original. Para eliminar esa relación, tú puedes eliminar el archivo enlazado.</p><p>Por lo tanto, la sintaxis es:</p><figure class="kg-card kg-code-card"><pre><code class="language-shell">rm &lt;ruta-enlace-simbolico&gt;
</code></pre><figcaption>Remove</figcaption></figure><p>Por ejemplo:</p><figure class="kg-card kg-code-card"><pre><code class="language-shell">rm trans.txt
rm james
</code></pre><figcaption>Enlaces</figcaption></figure><p>Tengan en cuenta que intentar hacer <code>rm james/</code> resultaría un error, porque Linux asumirá que 'james/' es un directorio, lo que requeriría otras opciones como <code>r</code> y <code>f</code>. Pero eso no es lo que queremos. Un enlace simbólico puede ser una carpeta, pero sólo nos interesa el nombre.</p><p>El principal beneficio de <code>rm</code> sobre <code>unlink</code> es que tú puedes eliminar múltiples enlaces simbólicos a la vez, como tú puedes hacer con los archivos.</p><h2 id="c-mo-encontrar-y-eliminar-los-enlaces-rotos">Cómo encontrar y eliminar los enlaces rotos</h2><p>Los enlaces rotos se producen cuando el archivo o la carpeta a la que apunta un enlace simbólico cambia de ruta o se elimina.</p><p>Por ejemplo, si "transactions.txt" dentro de la carpeta <code>/home/james</code>, se mueve de <code>/home/james</code> a <code>/home/james/personal</code>, el enlace "transaction.txt" se rompe. Cada intento de acceder al archivo resultará en un error de "No existe tal archivo o directorio". Esto se debe a que el enlace no tiene contenido propio.</p><p>Cuando tú descubras enlaces rotos, tú puedes borrar el archivo fácilmente. Una forma fácil de encontrar enlaces simbólicos rotos es:</p><pre><code class="language-shell">find /home/james -xtype l
</code></pre><p>Esto listará todos los enlaces simbólicos rotos en el directorio <code>james</code> - desde los archivos a los directorios y sub-directorios.</p><p>Pasando la opción <code>-delete</code> los borrará así:</p><pre><code class="language-shell">find /home/james -xtype l -delete
</code></pre><h2 id="en-resumen">En resumen</h2><p>Los enlaces simbólicos son una característica interesante de los sistemas Linux y UNIX.</p><p>Tú puedes crear enlaces simbólicos de fácil acceso para referirse a un archivo o carpeta a la que de otra manera no sería conveniente acceder. Con un poco de práctica, tú comprenderás cómo funcionan a nivel intuitivo y te harán más eficiente la gestión de los sistemas de archivos.</p><p>Traducido del artículo - <a href="https://www.freecodecamp.org/news/symlink-tutorial-in-linux-how-to-create-and-remove-a-symbolic-link/"><strong>Symlink Tutorial in Linux – How to Create and Remove a Symbolic Link</strong></a> de <a href="https://www.freecodecamp.org/news/author/dillionmegida/"><strong>Dillion Megida</strong></a></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Explicación de los grupos de usuarios en Linux: cómo agregar un nuevo grupo, agregar un nuevo miembro, y cambiar de grupo ]]>
                </title>
                <description>
                    <![CDATA[ > Linux permite a multiples usuarios tener acceso al sistema operativo a la vez. La configuración de permisos proteje a los usuarios de ellos mismos. Los usuarios pueden ser asignados a grupos para compartir privilegios, seguridad y acceso. El acceso de archivos y dispositivos puede ser restringido en base a ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/explicacion-de-los-grupos-de-usuarios-en-linux/</link>
                <guid isPermaLink="false">5fee3f078c7cd154bb9827fc</guid>
                
                    <category>
                        <![CDATA[ Linux ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Mario Menjívar ]]>
                </dc:creator>
                <pubDate>Sun, 28 Feb 2021 05:38:41 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/01/christina-wocintechchat-com-faEfWCdOKIg-unsplash.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <blockquote>Linux permite a multiples usuarios tener acceso al sistema operativo a la vez. La configuración de permisos proteje a los usuarios de ellos mismos. Los usuarios pueden ser asignados a grupos para compartir privilegios, seguridad y acceso. El acceso de archivos y dispositivos puede ser restringido en base a usuarios específicos o grupos de usuarios.</blockquote><p>Los grupos se usan con frecuencia para permitir que ciertos usuarios modifiquen un archivo o directorio.</p><p>Los dos tipos de grupos principales son grupos primarios y grupos secundarios. El grupo primario de un usuario es el grupo por defecto con el que se asocia la cuenta, generalmente comparte el mismo nombre que el usuario. Los directorios y los archivos que el usuario crea tendrán asignados este grupo. Un grupo secundario es cualquier grupo adicional del que un usuario sea parte.</p><h2 id="creaci-n-de-grupos"><strong>Creación de grupos</strong></h2><p>Creemos dos grupos llamados "writers" y "editors". Usa el comando <code>groupadd</code> (es posible que necesites usar el comando <code>sudo</code> al inicio para tener el permiso adecuado para crear el grupo):</p><pre><code>groupadd writers
groupadd editors</code></pre><h2 id="creaci-n-de-usuarios"><strong>Creación de usuarios</strong></h2><p>Puede que ya tengas usuarios para agregar a tu grupo. Si no, aquí está la sintaxis básica para crear un usuario con el comando <code>useradd</code>:</p><p><code>useradd [options] username</code></p><p>Aquí está para crear un usuario llamado "quincy". El argumento <code>-m</code> le dice al comando que cree el directorio principal del usuario con el mismo nombre que el usuario. El argumento con su valor <code>-p p4ssw0rd</code> crea la contraseña "p4ssw0rd" para el usuario.</p><p><code>useradd -m quincy -p password</code></p><p>Los usuarios serán capaces de cambiar su contraseña con el comando <code>passwd</code>. Para ello, tendrán que ingresar su contraseña actual en ese momento y luego definir una nueva.</p><h2 id="agregar-un-usuario-a-un-grupo"><strong>Agregar un usuario a un grupo</strong></h2><p>Puedes usar el comando <code>usermod</code> para agregar un usuario a un grupo. Así es cómo agregaríamos el usuario "quincy" al grupo "writers". El argumento <code>-a</code> significa "añadir" (append) y el argumento <code>-G</code> agrega un grupo como un grupo secundario.</p><p><code>usermod -a -G writers quincy</code></p><p>Cuando un usuario es creado con el comando <code>adduser</code>, este es automáticamente asignado a un grupo primario con el mismo nombre que el usuario. En nuestro ejemplo, actualmente el usuario "quincy" es parte de un grupo primario "quincy" y de un grupo secundario "writers".</p><p>También puedes agregar un usuario a muchos grupos a la vez al separar por comas los nombres de los grupos, así <code>-G group1,group2,group3</code>.</p><p>El siguiente comando cambia el grupo primario del usuario "quincy" de "quincy" a "editors": </p><p><code>usermod -g editors quincy</code></p><h2 id="remover-un-usuario-de-un-grupo-secundario">Remover un usuario de un grupo secundario</h2><p>Para remover un usuario de un grupo secundario necesitas sobreescribir los grupos a los que actualmente este usuario pertenece, por una nueva lista de grupos dónde no esté el grupo que se quiere remover.</p><p>Primero, usa el comando <code>id</code> para verificar a cuáles grupos secundarios pertenece un usuario:</p><p><code>id -nG quincy</code></p><p>Digamos que este comando nos devuelve <code>editors writers</code>, esto indica que el usuario "quincy" es parte de los grupos "editors" y "writers". Si quieres remover al usuario del grupo "writers", usa el comando:</p><p><code>usermod -G editors quincy</code></p><p>Ese comando establece como grupo secundario del usuario "quincy" como "editors". Ya que el argumento <code>-a</code> no fue usado, los grupos previos fueron sobreescritos.</p><h2 id="conclusi-n">Conclusión</h2><p>Deberías ahora estar listo para manejar usuarios y grupos en Linux. El siguiente paso es determinar qué privilegios debería tener cada grupo.</p><p>Traducido del artículo de <strong><a href="https://www.freecodecamp.org/news/author/beau/">Beau Carnes</a></strong> - <strong><a href="https://www.freecodecamp.org/news/linux-user-groups-explained-how-to-add-a-new-group-a-new-group-member-and-change-groups/">Linux User Groups Explained: How to add a new group, a new group member, and change groups</a></strong></p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
