Comments

April 27, 2025

Cómo instalar MySQL en Ubuntu 22.04

Introducción

MySQL es un sistema de gestión de bases de datos de código abierto, comúnmente instalado como parte de la popular pila LAMP (Linux, Apache, MySQL, PHP/Python/Perl). Implementa el modelo relacional y utiliza el Lenguaje de Consulta Estructurado (más conocido como SQL) para gestionar sus datos.

Este tutorial explicará cómo instalar MySQL versión 8.0 en un servidor Ubuntu 22.04. Al completarlo, dispondrá de una base de datos relacional funcional que podrá usar para crear su próximo sitio web o aplicación.

Implemente una base de datos MySQL con un solo clic usando las bases de datos administradas de IsnHosting . Deje que DigitalOcean se encargue del escalado, el mantenimiento y las actualizaciones de su base de datos.

Prerrequisitos

Para seguir este tutorial, necesitarás:

Paso 1: Instalación de MySQL

En Ubuntu 22.04, puedes instalar MySQL usando el repositorio de paquetes APT. Al momento de escribir este artículo, la versión de MySQL disponible en el repositorio predeterminado de Ubuntu es la 8.0.28.

Para instalarlo, actualice el índice de paquetes en su servidor si no lo ha hecho recientemente:

sudo apt update

Luego instala el mysql-serverpaquete:

sudo apt install mysql-server

Asegúrese de que el servidor se esté ejecutando mediante el systemctl startcomando:

sudo systemctl start mysql.service

Estos comandos instalarán e iniciarán MySQL, pero no le solicitarán que establezca una contraseña ni realice ningún otro cambio de configuración. Dado que esto hace que su instalación de MySQL sea insegura, abordaremos este tema a continuación.

Paso 2: Configuración de MySQL

Para nuevas instalaciones de MySQL, deberá ejecutar el script de seguridad incluido en el sistema de gestión de bases de datos. Este script modifica algunas de las opciones predeterminadas menos seguras, como impedir el inicio de sesión remoto como root y eliminar usuarios de muestra.

Advertencia : A partir de julio de 2022, se producirá un error al ejecutar el mysql_secure_installationscript sin ninguna configuración adicional. Esto se debe a que este script intentará establecer una contraseña para la cuenta raíz de MySQL de la instalación, pero, por defecto en las instalaciones de Ubuntu, esta cuenta no está configurada para conectarse con contraseña.

Antes de julio de 2022, este script fallaba silenciosamente tras intentar establecer la contraseña de la cuenta raíz y continuar con el resto de las indicaciones. Sin embargo, al momento de escribir este artículo, el script devolverá el siguiente error después de ingresar y confirmar una contraseña:

Output ... Failed! Error: SET PASSWORD has no significance for user 'root'@'localhost' as the authentication method used doesn't store authentication data in the MySQL server. Please consider using ALTER USER instead if you want to change authentication parameters.

New password:

Esto llevará al script a un bucle recursivo del que sólo podrás salir cerrando la ventana de tu terminal.

Dado que el mysql_secure_installationscript realiza otras acciones útiles para mantener la seguridad de su instalación de MySQL, se recomienda ejecutarlo antes de empezar a usar MySQL para administrar sus datos. Sin embargo, para evitar este bucle recursivo, primero deberá ajustar la autenticación de su usuario root de MySQL.

Primero, abra el indicador de MySQL:

sudo mysql

A continuación, ejecute el siguiente ALTER USERcomando para cambiar el método de autenticación del usuario root a uno que utilice contraseña. El siguiente ejemplo cambia el método de autenticación a mysql_native_password:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

Después de realizar este cambio, salga del indicador de MySQL:

exit

Después de esto, puedes ejecutar el mysql_secure_installationscript sin problemas.

Ejecute el script de seguridad con sudo:

sudo mysql_secure_installation

Esto le guiará a través de una serie de indicaciones donde podrá realizar cambios en las opciones de seguridad de su instalación de MySQL. La primera le preguntará si desea configurar el complemento Validar contraseña, que permite comprobar la seguridad de las contraseñas de los nuevos usuarios de MySQL antes de considerarlas válidas.

Si elige configurar el complemento Validar contraseña, cualquier usuario de MySQL que cree que se autentique con una contraseña deberá tener una contraseña que cumpla con la política que seleccione:

OutputSecuring the MySQL server deployment.

Connecting to MySQL using a blank password.

VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?

Press y|Y for Yes, any other key for No: Y

There are three levels of password validation policy:

LOW    Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary                  file

Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG:
 2

Independientemente de si decide configurar el complemento Validar contraseña, el siguiente paso será establecer una contraseña para el usuario root de MySQL . Ingrese y confirme una contraseña segura de su elección:

OutputPlease set the password for root here.


New password:

Re-enter new password:

Tenga en cuenta que aunque haya establecido una contraseña para el usuario root de MySQL, este usuario no está configurado actualmente para autenticarse con una contraseña al conectarse al shell de MySQL.

Si usaste el complemento Validar contraseña, recibirás información sobre la seguridad de tu nueva contraseña. El script te preguntará si deseas continuar con la contraseña que acabas de ingresar o si deseas ingresar una nueva. Si estás satisfecho con la seguridad de la contraseña que acabas de ingresar, presiona Enter Ypara continuar con el script:

OutputEstimated strength of the password: 100
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : Y

Desde allí, puede presionar Yy luego ENTERaceptar los valores predeterminados para todas las preguntas subsiguientes. Esto eliminará algunos usuarios anónimos y la base de datos de prueba, deshabilitará los inicios de sesión remotos como root y cargará estas nuevas reglas para que MySQL respete inmediatamente los cambios realizados.

Nota: Una vez completado el script de seguridad, puede volver a abrir MySQL y cambiar el método de autenticación del usuario root al predeterminado. auth_socketPara autenticarse como usuario root de MySQL con una contraseña, ejecute este comando:

mysql -u root -p

Luego vuelva a utilizar el método de autenticación predeterminado usando este comando:

ALTER USER 'root'@'localhost' IDENTIFIED WITH auth_socket;

Esto significará que podrás volver a conectarte a MySQL como tu usuario root usando el sudo mysqlcomando.

Una vez completado el script, su instalación de MySQL estará protegida. Ahora puede crear un usuario de base de datos dedicado con el cliente MySQL.

Paso 3: Creación de un usuario MySQL dedicado y concesión de privilegios

Tras la instalación, MySQL crea una cuenta de usuario root que puede usar para administrar su base de datos. Este usuario tiene privilegios completos sobre el servidor MySQL, lo que significa que tiene control total sobre cada base de datos, tabla, usuario, etc. Por ello, se recomienda evitar usar esta cuenta fuera de las funciones administrativas. Este paso describe cómo usar el usuario root de MySQL para crear una nueva cuenta de usuario y otorgarle privilegios.

En sistemas Ubuntu con MySQL 5.7 (y versiones posteriores), el usuario root de MySQL se autentica mediante el auth_socketcomplemento por defecto, en lugar de una contraseña. Este complemento requiere que el nombre del usuario del sistema operativo que invoca el cliente MySQL coincida con el nombre del usuario MySQL especificado en el comando, por lo que debe invocarlo mysqlcon sudoprivilegios para acceder al usuario root de MySQL:

sudo mysql

Nota: Si instaló MySQL con otro tutorial y habilitó la autenticación con contraseña para root , deberá usar un comando diferente para acceder al shell de MySQL. El siguiente comando ejecutará su cliente MySQL con privilegios de usuario normales, y solo obtendrá privilegios de administrador en la base de datos al autenticarse:

mysql -u root -p

Una vez que tenga acceso al prompt de MySQL, puede crear un nuevo usuario con una CREATE USERinstrucción. Estas instrucciones siguen la siguiente sintaxis general:

CREATE USER 'username'@'host' IDENTIFIED WITH authentication_plugin BY 'password';

Después de CREATE USER, se especifica un nombre de usuario. A esto le sigue inmediatamente un @signo y el nombre de host desde el que se conectará este usuario. Si solo planea acceder a este usuario localmente desde su servidor Ubuntu, puede especificar localhost. No siempre es necesario escribir el nombre de usuario y el host entre comillas simples, pero esto puede ayudar a prevenir errores.

Tiene varias opciones para elegir el plugin de autenticación de usuario. El auth_socketplugin mencionado anteriormente puede ser práctico, ya que proporciona una seguridad sólida sin requerir que los usuarios válidos introduzcan una contraseña para acceder a la base de datos. Sin embargo, también impide las conexiones remotas, lo que puede complicar la interacción de programas externos con MySQL.

Como alternativa, puede omitir por completo esta parte de la sintaxis para que el usuario se autentique con el complemento predeterminado de MySQL. La documentación de MySQL recomienda este complemento para usuarios que desean iniciar sesión con contraseña debido a sus sólidas funciones de seguridad.WITH authentication_plugincaching_sha2_password

Ejecute el siguiente comando para crear un usuario que se autentique con [ nombre de usuario caching_sha2_password]. Asegúrese de usar sammysu nombre de usuario preferido y passworduna contraseña segura de su elección:

CREATE USER 'sammy'@'localhost' IDENTIFIED BY 'password';

Nota : Existe un problema conocido con algunas versiones de PHP que causa problemas con caching_sha2_password. Si planea usar esta base de datos con una aplicación PHP (por ejemplo, phpMyAdmin), le recomendamos crear un usuario que se autentique con el complemento anterior, aunque aún seguro mysql_native_password:

CREATE USER 'sammy'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

Si no está seguro, siempre puede crear un usuario que se autentique con caching_sha2_pluginy luego ALTERmás tarde con este comando:

ALTER USER 'sammy'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

Tras crear el nuevo usuario, puede otorgarle los privilegios correspondientes. La sintaxis general para otorgar privilegios de usuario es la siguiente:

GRANT PRIVILEGE ON database.table TO 'username'@'host';

El valor en esta sintaxis de ejemplo define las acciones que el usuario puede realizar en el `and` especificado . Puede otorgar varios privilegios al mismo usuario en un solo comando separándolos con una coma. También puede otorgar privilegios globales a un usuario introduciendo asteriscos ( ) PRIVILEGEen lugar de los nombres de las bases de datos y las tablas. En SQL, los asteriscos son caracteres especiales que se utilizan para representar “todas” las bases de datos o tablas.databasetable*

A modo de ejemplo, el siguiente comando otorga a un usuario privilegios globales sobre CREATE, ALTER, y DROPbases de datos, tablas y usuarios, así como la capacidad de acceder a INSERT, UPDATEy DELETEdatos de cualquier tabla del servidor. También le otorga la capacidad de consultar datos con SELECT, crear claves foráneas con la REFERENCESpalabra clave y realizar FLUSHoperaciones con el RELOADprivilegio . Sin embargo, solo debe otorgar a los usuarios los permisos que necesiten, así que puede ajustar los privilegios de sus usuarios según sea necesario.

Puede encontrar la lista completa de privilegios disponibles en la documentación oficial de MySQL .

Ejecute esta GRANTdeclaración, reemplazándola sammycon el nombre de su propio usuario MySQL, para otorgarle estos privilegios a su usuario:

GRANT CREATE, ALTER, DROP, INSERT, UPDATE, INDEX, DELETE, SELECT, REFERENCES, RELOAD on *.* TO 'sammy'@'localhost' WITH GRANT OPTION;

Tenga en cuenta que esta declaración también incluye WITH GRANT OPTION. Esto permitirá que su usuario de MySQL otorgue los permisos que tenga a otros usuarios del sistema.

Advertencia : algunos usuarios pueden querer otorgarle a su usuario MySQL el ALL PRIVILEGESprivilegio que les proporcionará amplios privilegios de superusuario similares a los privilegios del usuario root , de la siguiente manera:

GRANT ALL PRIVILEGES ON *.* TO 'sammy'@'localhost' WITH GRANT OPTION;

No se deben conceder privilegios tan amplios , ya que cualquiera con acceso a este usuario MySQL tendrá control total sobre todas las bases de datos del servidor.

A continuación, se recomienda ejecutar el FLUSH PRIVILEGEScomando. Esto liberará la memoria almacenada en caché por el servidor como resultado de las CREATE USERinstrucciones anteriores GRANT:

FLUSH PRIVILEGES;

Luego puedes salir del cliente MySQL:

exit

En el futuro, para iniciar sesión como su nuevo usuario MySQL, deberá utilizar un comando como el siguiente:

mysql -u sammy -p

La -pbandera hará que el cliente MySQL le solicite la contraseña de su usuario MySQL para poder autenticarse.

Por último, probemos la instalación de MySQL.

Paso 4: Prueba de MySQL

Independientemente de cómo lo hayas instalado, MySQL debería haberse iniciado automáticamente. Para comprobarlo, comprueba su estado.

systemctl status mysql.service

La salida será similar a la siguiente:

Output● mysql.service - MySQL Community Server
     Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2022-04-11 16:04:39 UTC; 2h 36min ago
    Process: 2593 ExecStartPre=/usr/share/mysql/mysql-systemd-start pre (code=exited, status=0/SUCCESS)
   Main PID: 2601 (mysqld)
     Status: "Server is operational"
      Tasks: 38 (limit: 1119)
     Memory: 354.3M
        CPU: 19.944s
     CGroup: /system.slice/mysql.service
             └─2601 /usr/sbin/mysqld

Si MySQL no se está ejecutando, puedes iniciarlo con sudo systemctl start mysql.

Para una comprobación adicional, puede intentar conectarse a la base de datos mediante la mysqladminherramienta, que es un cliente que permite ejecutar comandos administrativos. Por ejemplo, este comando indica que debe conectarse con el usuario MySQL llamado sammy ( ), solicitar una contraseña ( ) y devolver la versión. Asegúrese de cambiar el nombre de su usuario MySQL dedicado e introducir su contraseña cuando se le solicite:-u sammy-psammy

sudo mysqladmin -p -u sammy version

A continuación se muestra un ejemplo de la salida:

Outputmysqladmin  Ver 8.0.28-0ubuntu4 for Linux on x86_64 ((Ubuntu))
Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Server version          8.0.28-0ubuntu4
Protocol version        10
Connection              Localhost via UNIX socket
UNIX socket             /var/run/mysqld/mysqld.sock
Uptime:                 2 hours 31 min 57 sec

Threads: 2  Questions: 25  Slow queries: 0  Opens: 160  Flush tables: 3  Open tables: 79  Queries per second avg: 0.000

Esto significa que MySQL está en funcionamiento.

Conclusión

Ya tiene una configuración básica de MySQL instalada en su servidor. Aquí tiene algunos ejemplos de los pasos a seguir:

  • Configurar una pila LAMP o una pila LEMP
  • Practique la ejecución de consultas con SQL
  • Administre su instalación de MySQL con phpMyAdmin

Stephen Dove
Comments

April 27, 2025

Introducción a la terminología, interfaces y protocolos de redes

Introducción

Comprender las redes es fundamental para cualquier persona que administre un servidor. No solo es esencial para que sus servicios estén en línea y funcionen sin problemas, sino que también le proporciona la información necesaria para diagnosticar problemas.

Este artículo ofrece una descripción general de algunos conceptos comunes de redes. Analizaremos la terminología, los protocolos comunes y las responsabilidades y características de las diferentes capas de red.

Esta guía es independiente del sistema operativo, pero debería ser muy útil al implementar funciones y servicios que utilizan redes en su servidor.

Glosario de redes

Primero, definiremos algunos términos comunes que verá a lo largo de esta guía y en otras guías y documentación sobre redes.

Estos términos se ampliarán en las secciones correspondientes que siguen:

  • Conexión : En redes, una conexión se refiere a la información relacionada que se transfiere a través de una red. Generalmente, una conexión se establece antes de la transferencia de datos (siguiendo los procedimientos establecidos en un protocolo) y puede desestructurarse al final de la transferencia.
  • Paquete : Un paquete es la unidad más pequeña que se transfiere intencionalmente a través de una red. Al comunicarse a través de una red, los paquetes son los sobres que transportan los datos (en fragmentos) de un extremo a otro.

Los paquetes tienen una sección de encabezado que contiene información sobre el paquete, incluyendo el origen y el destino, las marcas de tiempo, los saltos de red, etc. La sección principal del paquete contiene los datos que se transfieren. A veces se denomina cuerpo o carga útil.

  • Interfaz de red : Una interfaz de red puede referirse a cualquier tipo de interfaz de software con hardware de red. Por ejemplo, si tiene dos tarjetas de red en su computadora, puede controlar y configurar cada interfaz de red asociada a ellas individualmente.

Una interfaz de red puede estar asociada a un dispositivo físico o ser la representación de una interfaz virtual. El dispositivo de bucle invertido, una interfaz virtual disponible en la mayoría de los entornos Linux para conectarse a la misma máquina, es un ejemplo de ello.

  • LAN : LAN significa «red de área local». Se refiere a una red o a una parte de ella que no es accesible públicamente a internet. Una red doméstica o de oficina es un ejemplo de LAN.
  • WAN : WAN significa “red de área extensa”. Se refiere a una red mucho más extensa que una LAN. Si bien WAN es el término relevante para describir redes grandes y dispersas en general, generalmente se refiere a Internet en su conjunto.

Si se dice que una interfaz está conectada a la WAN, generalmente se supone que es accesible a través de Internet.

  • Protocolo : Un protocolo es un conjunto de reglas y estándares que definen un lenguaje que los dispositivos pueden usar para comunicarse. Existe una gran cantidad de protocolos ampliamente utilizados en redes, y a menudo se implementan en diferentes capas.

Algunos protocolos de bajo nivel son TCP, UDP, IP e ICMP. Algunos ejemplos conocidos de protocolos de capa de aplicación, basados ​​en estos protocolos de bajo nivel, son HTTP (para acceder a contenido web), SSH y TLS/SSL.

  • Puerto : Un puerto es una dirección en una sola máquina que puede vincularse a un programa específico. No es una interfaz ni una ubicación física, pero permite que su servidor se comunique mediante más de una aplicación.
  • Cortafuegos : Un cortafuegos es un programa que decide si se debe permitir el tráfico entrante o saliente de un servidor. Un cortafuegos suele funcionar creando reglas que determinan qué tipo de tráfico es aceptable en qué puertos. Generalmente, los cortafuegos bloquean los puertos que no utiliza una aplicación específica en un servidor.
  • NAT : NAT significa Traducción de Direcciones de Red. Es una forma de reempaquetar y enviar las solicitudes entrantes a un servidor de enrutamiento a los dispositivos o servidores correspondientes en una LAN. Esto se suele implementar en redes LAN físicas para enrutar las solicitudes a través de una dirección IP a los servidores backend necesarios.
  • VPN : VPN significa red privada virtual. Es un medio para conectar redes LAN independientes a través de internet, manteniendo la privacidad. Se utiliza para conectar sistemas remotos como si estuvieran en una red local, a menudo por razones de seguridad.

Encontrará muchos otros términos, y esta lista no es exhaustiva. Explicaremos otros términos según sea necesario. En este punto, debería comprender algunos conceptos generales que nos permitirán abordar mejor los temas que se tratarán a continuación.

Capas de red

Si bien las redes suelen analizarse en términos de topología de manera horizontal, entre hosts su implementación se realiza en capas de manera vertical dentro de cualquier computadora o red determinada.

Esto significa que existen múltiples tecnologías y protocolos que se complementan para que la comunicación funcione. Cada capa superior abstrae un poco más los datos sin procesar.

También le permite aprovechar las capas inferiores de nuevas maneras sin tener que invertir tiempo y energía para desarrollar los protocolos y aplicaciones que manejan esos tipos de tráfico.

El lenguaje que usamos para describir cada esquema de capas varía significativamente según el modelo utilizado. Independientemente del modelo utilizado para describir las capas, la ruta de los datos es la misma.

A medida que los datos se envían desde una máquina, comienzan en la parte superior de la pila y se filtran hacia abajo. En el nivel más bajo, se produce la transmisión real a otra máquina. En este punto, los datos vuelven a ascender a través de las capas de la otra computadora.

Cada capa tiene la capacidad de agregar su propio “envoltorio” alrededor de los datos que recibe de la capa adyacente, lo que ayudará a las capas que vienen después a decidir qué hacer con los datos cuando se entregan.

Modelo TCP/IP

El modelo TCP/IP, más conocido como el conjunto de protocolos de Internet, es un modelo de capas ampliamente adoptado. Define cuatro capas independientes:

  • Aplicación : En este modelo, la capa de aplicación se encarga de crear y transmitir datos de usuario entre aplicaciones. Las aplicaciones pueden estar en sistemas remotos y deben funcionar como si estuvieran localmente para el usuario final. Se dice que esta comunicación se realiza entre pares .
  • Transporte : La capa de transporte es responsable de la comunicación entre procesos. Este nivel de red utiliza puertos para gestionar diferentes servicios.
  • Internet : La capa de Internet se utiliza para transportar datos entre nodos de una red. Esta capa conoce los puntos finales de las conexiones, pero no se ocupa de la conexión real necesaria para llegar de un lugar a otro. Las direcciones IP se definen en esta capa como una forma de acceder a sistemas remotos de forma direccionable.
  • Enlace : La capa de enlace implementa la topología de la red local, lo que permite que la capa de Internet presente una interfaz direccionable. Establece conexiones entre nodos vecinos para el envío de datos.

Como puede ver, el modelo TCP/IP es abstracto y fluido. Esto popularizó su implementación y le permitió convertirse en la forma dominante de categorizar las capas de red.

Interfaces

Las interfaces son puntos de comunicación de red para su computadora. Cada interfaz está asociada a un dispositivo de red físico o virtual.

Normalmente, su servidor tendrá una interfaz de red configurable para cada tarjeta de Internet Ethernet o inalámbrica que tenga.

Además, definirá una interfaz de red virtual denominada “loopback” o interfaz localhost. Esta se utiliza para conectar aplicaciones y procesos de un mismo ordenador con otros. En muchas herramientas, se denomina “lo”.

Muchas veces, los administradores configuran una interfaz para atender el tráfico a Internet y otra interfaz para una LAN o red privada.

En centros de datos con redes privadas habilitadas (incluidos los Droplets de DigitalOcean), su VPS tendrá dos interfaces de red. La interfaz “eth0” se configurará para gestionar el tráfico de internet, mientras que la interfaz “eth1” se comunicará con una red privada.

Protocolos

Las redes funcionan mediante la superposición de varios protocolos diferentes. De esta forma, un mismo dato puede transmitirse utilizando múltiples protocolos encapsulados entre sí.

Comenzaremos con protocolos implementados en las capas de red inferiores y avanzaremos hasta llegar a protocolos con mayor abstracción.

Control de acceso al medio

El control de acceso al medio es un protocolo de comunicaciones que se utiliza para distinguir dispositivos específicos. Cada dispositivo debe recibir una dirección MAC (dirección de control de acceso al medio ) única y codificada durante su fabricación, lo que lo diferencia de cualquier otro dispositivo en internet.

Direccionar el hardware mediante la dirección MAC le permite hacer referencia a un dispositivo mediante un valor único incluso cuando el software superior puede cambiar el nombre de ese dispositivo específico durante la operación.

El direccionamiento MAC es uno de los únicos protocolos de la capa de enlace de bajo nivel con el que probablemente interactuará de manera regular.

Propiedad intelectual

El protocolo IP es uno de los protocolos fundamentales que permiten el funcionamiento de internet. Las direcciones IP son únicas en cada red y permiten que las máquinas se direccionen entre sí a través de ella. Se implementa en la capa de internet del modelo TCP/IP.

Las redes pueden conectarse entre sí, pero el tráfico debe enrutarse al cruzar los límites de la red. Este protocolo asume una red poco fiable y múltiples rutas hacia el mismo destino, entre las que puede cambiar dinámicamente.

Existen diversas implementaciones del protocolo. La implementación más común actualmente son las direcciones IPv4, que siguen el patrón [número] 123.123.123.123, aunque las direcciones IPv6, que también siguen el patrón [número] 2001:0db8:0000:0000:0000:ff00:0042:8329, están ganando popularidad debido a la cantidad limitada de direcciones IPv4 disponibles.

ICMP

ICMP significa Protocolo de Mensajes de Control de Internet. Se utiliza para enviar mensajes entre dispositivos para indicar su disponibilidad o errores. Estos paquetes se utilizan en diversas herramientas de diagnóstico de red, como pingy traceroute.

Normalmente, los paquetes ICMP se transmiten cuando un tipo de paquete diferente detecta un problema. Se utilizan como mecanismo de retroalimentación para las comunicaciones de red.

TCP

TCP significa protocolo de control de transmisión. Se implementa en la capa de transporte del modelo TCP/IP y se utiliza para establecer conexiones fiables.

TCP es uno de los protocolos que encapsula datos en paquetes. Luego, los transfiere al extremo remoto de la conexión mediante los métodos disponibles en las capas inferiores. En el otro extremo, puede comprobar si hay errores, solicitar el reenvío de ciertos fragmentos y reensamblar la información en un único fragmento lógico para enviarlo a la capa de aplicación.

El protocolo establece una conexión antes de la transferencia de datos mediante un sistema denominado protocolo de enlace de tres vías. Este protocolo permite que ambos extremos de la comunicación reconozcan la solicitud y acuerden un método para garantizar la fiabilidad de los datos.

Una vez enviados los datos, la conexión se interrumpe mediante un protocolo de enlace de cuatro vías similar.

TCP es el protocolo elegido para muchos de los usos más populares de Internet, incluidos WWW, SSH y el correo electrónico.

UDP

UDP significa protocolo de datagramas de usuario. Es un protocolo complementario popular de TCP y también se implementa en la capa de transporte.

La diferencia fundamental entre UDP y TCP es que UDP ofrece una transferencia de datos poco fiable. No verifica la recepción de datos en el otro extremo de la conexión. Esto podría parecer perjudicial, y para muchos propósitos lo es. Sin embargo, también es fundamental para ciertas funciones.

Dado que no es necesario esperar la confirmación de la recepción de los datos ni forzar su reenvío, UDP es mucho más rápido que TCP. No establece una conexión con el host remoto, simplemente envía datos sin confirmación.

Al ser una transacción directa, resulta útil para comunicaciones como la consulta de recursos de red. Además, no mantiene un estado, lo que la hace ideal para transmitir datos desde una máquina a varios clientes en tiempo real. Esto la hace ideal para VoIP, juegos y otras aplicaciones que no admiten retrasos.

HTTP

HTTP significa protocolo de transferencia de hipertexto. Es un protocolo definido en la capa de aplicación que constituye la base de la comunicación en la web.

HTTP define varios verbos que indican al sistema remoto qué se solicita. Por ejemplo, GET, POST y DELETE interactúan con los datos solicitados de forma diferente. Para ver un ejemplo de las diferentes solicitudes HTTP en acción, consulte Cómo definir rutas y métodos de solicitud HTTP en Express .

DNS

DNS significa sistema de nombres de dominio. Es un protocolo de capa de aplicación que proporciona un mecanismo de nombres intuitivo para los recursos de internet. Es lo que vincula un nombre de dominio a una dirección IP y permite acceder a sitios web por su nombre en el navegador.

SSH

SSH significa Secure Shell. Es un protocolo cifrado implementado en la capa de aplicación que permite comunicarse con un servidor remoto de forma segura. Muchas tecnologías adicionales se basan en este protocolo gracias a su cifrado de extremo a extremo y su ubicuidad.

Hay muchos otros protocolos que no hemos cubierto y que son igualmente importantes. Sin embargo, esto debería brindarle una buena visión general de algunas de las tecnologías fundamentales que hacen posible internet y las redes.

Conclusión

En este punto, debería estar familiarizado con la terminología de redes y comprender cómo se comunican los diferentes componentes. Esto le ayudará a comprender otros artículos y la documentación de su sistema.

A continuación, para ver un ejemplo de alto nivel del mundo de la lectura, puede leer Cómo realizar solicitudes HTTP en Go .

Stephen Dove
Comments

April 27, 2025

Cómo usar Vim para la edición avanzada de texto plano o código en un VPS

Introducción


Vim, una mejora del vieditor de texto clásico, es extremadamente potente para editar código y texto plano. Aunque al principio pueda parecer obtuso y difícil, es una de las formas más eficientes de editar texto gracias a su sintaxis de comandos similar a la del lenguaje.

En un artículo anterior, explicamos cómo instalar Vim y realizar ediciones básicas . En este documento, abordaremos temas más avanzados que pueden ayudar a demostrar la versatilidad de la edición.

Asumiremos que ha instalado vim y está familiarizado con los comandos básicos de movimiento y edición analizados en el artículo vinculado anteriormente.

Navegación avanzada


Antes de comenzar con nuevo material, repasemos un poco la navegación que aprendimos en el artículo anterior:

  • Movimientos básicos
    • h: izquierda
    • l: derecha
    • j: abajo
    • k: arriba
  • Otros movimientos
    • gg: parte superior del documento
    • G: parte inferior del documento o número de línea si se coloca un número delante de G
    • w: siguiente palabra
    • e: fin de palabra
    • 0: comienzo de línea
    • $: fin de línea

Como pueden ver, ya tenemos bastantes comandos de movimiento a nuestra disposición. Sin embargo, también podemos dirigir el movimiento de otras maneras.

Podemos mover el cursor a diferentes áreas en la porción actualmente visible de la página usando estos comandos:

  • H : Mueve el cursor a la parte superior de la página visible actualmente (piensa en “alto”)
  • M : Mueve el cursor al centro de la página visible actualmente
  • L : Mueve el cursor a la parte inferior de la página visible actualmente (piensa en “abajo”)

Si queremos mover la página en lugar del cursor (como en el desplazamiento), podemos utilizar estos comandos:

  • CTRL-D : Av Pág
  • CTRL-U : Re Pág
  • CTRL-E : desplazarse hacia abajo una línea
  • CTRL-Y : desplazarse hacia arriba una línea

También podemos navegar por bloques lógicos de información. Esto puede ser útil si se escribe texto normal en lugar de código. Son similares a los comandos de navegación por palabras y líneas.

  • ) : Mover al inicio de la siguiente oración
  • ( : Mover al inicio de la última oración
  • } : Mover al inicio del siguiente párrafo (delimitado por una línea en blanco)
  • { : Mover al inicio del último párrafo (delimitado por una línea en blanco)

También puedes definir tus propios puntos en el archivo para saltar a ellos. Puedes establecerlos marksen cualquier punto del archivo. Luego, puedes referenciar esas marcas para saltar a ese punto o pasarlo a un comando que acepte movimientos:

  • m : Escribir “m” seguido de una letra crea una marca de referencia con esa letra.
    • Las letras minúsculas son específicas del documento actual, mientras que las letras mayúsculas solo se pueden usar una vez (se pueden usar para saltar a secciones en diferentes documentos).
  • : La comilla simple seguida de una letra de marca (previamente definida con la “m” como arriba), moverá el cursor al comienzo de la línea que contiene esa marca.
  • ` : La comilla invertida seguida de una letra de marca moverá el cursor a la posición exacta de la marca.

Estos comandos permiten colocar una marca y luego retirar, eliminar o formatear el área definida entre la posición actual y la marca. Esto permite un control muy preciso de las opciones de edición.

Cómo gestionar documentos


A menudo, al trabajar, ya sea en un proyecto de software o en un trabajo académico, es necesario poder referenciar varios documentos a la vez. Vim ofrece diferentes maneras de hacerlo, según cómo se desee trabajar.

Cómo gestionar los buffers


Una forma de gestionar varios archivos es mediante buffers. Los búferes suelen representar un archivo abierto para edición. Son básicamente todo lo que vim tiene abierto actualmente y a lo que puede acceder fácilmente.

Abrimos varios archivos con vim de la siguiente manera:

vim file1 file2 file3

Cada uno de estos archivos se abre en su propio buffer. Actualmente, solo podemos ver el primer archivo.

Podemos ver qué buffers tenemos disponibles escribiendo :buffers.

:buffers

:buffers
  1 %a  "file1"             line 1
  2     "file2"             line 0
  3     "file3"             line 0
Press ENTER or type command to continue

Si deseamos consultar el siguiente búfer, podemos escribir :bn. Esto cambiará al siguiente búfer. De igual forma, podemos cambiar a un búfer por número (en la primera columna de arriba) o por nombre, escribiendo b. Esto funciona incluso si el nombre del archivo está incompleto.

A continuación se muestran algunos de los comandos para administrar buffers:

  • :buffers : Lista de buffers disponibles
  • :ls : Lo mismo que arriba
  • :bn : Cambiar al siguiente búfer
  • :bp : Cambiar al búfer anterior
  • :bfirst : Cambiar al primer búfer
  • :blast : Cambiar al último búfer
  • :bdelete : Elimina el búfer actual
  • :badd : Abre un nuevo buffer con el nombre de archivo que sigue
  • :e : Edita otro archivo en un nuevo buffer y cámbialo.

Cómo administrar Windows


Un mecanismo de control independiente que Vim ofrece para gestionar múltiples archivos es el concepto de windowso views. Esto permite dividir el área de edición actual en diferentes ventanas para poder ver varios búferes simultáneamente.

Para dividir el espacio de trabajo actual en ventanas independientes, puede escribir :splito :sp. Esto abre una nueva ventana sobre la actual y la enfoca. Puede cambiar el búfer que se muestra en la nueva ventana usando los comandos de búfer mostrados arriba.

Aquí hay algunos comandos que podemos usar para crear y administrar ventanas:

  • :sp : Divide la ventana actual en dos. Inicialmente, se mostrará el mismo búfer en cada ventana.
    • Anteponga un número a la “sp” para establecer la nueva altura de la ventana.
  • :vs : Divide la ventana actual verticalmente. Inicialmente, se mostrará el mismo búfer en cada ventana.
    • Anteponga un número al “vs” para establecer el nuevo ancho de la ventana.
  • CTRL-ww : Cambiar el foco a la siguiente ventana
  • CTRL-w(movimiento) : Cambia el foco a la ventana en la dirección (h,j,k,l) ​​indicada
  • CTRL-wc : Cerrar la ventana actual
  • CTRL-w+ : Aumentar el tamaño de la ventana actual
  • CTRL-w- : Disminuir el tamaño de la ventana actual
  • CTRL-w= : Establecer todas las ventanas con el mismo tamaño
  • #CTRL-w_ : Establece la altura al tamaño indicado por el “#” precedente
  • :only : Cierra todas las ventanas excepto la actual
  • CTRL-wn : Abre una nueva ventana con un nuevo búfer

Cómo administrar pestañas


Un tercer concepto para gestionar múltiples documentos en Vim es el de tabs. A diferencia de muchos programas, en Vim, las pestañas pueden contener ventanas, no al revés. Las pestañas pueden contener ventanas, que actúan como ventanas gráficas en los búferes.

Podemos gestionar el diseño de la ventana de cada pestaña por separado. Para crear pestañas, podemos usar el :tabnewcomando para abrir una nueva pestaña.

Algunas formas sencillas de administrar las pestañas son:

  • :tabnew : Abrir nueva pestaña
  • :tabclose : Cerrar la pestaña actual
  • :tabn : Cambiar a la siguiente pestaña
  • gt : Cambiar a la siguiente pestaña
  • :tabp : Cambiar a la pestaña anterior
  • gT : Cambiar a la pestaña anterior
  • :tab ball : Abre todos los buffers en pestañas individuales
  • :tabs : Lista todas las pestañas disponibles

Al cambiar entre búferes, ventanas y pestañas, a veces resulta confuso saber qué archivo estás viendo. Una forma rápida de averiguar el nombre del archivo es escribir:

  • CTRL-g : Muestra el nombre del archivo actual

Comandos específicos del documento


Dependiendo del tipo de documentos con los que esté tratando, vim tiene ciertas funcionalidades que pueden ayudarlo.

Texto sin formato


Si edita documentos de texto sin formato, Vim puede ayudarle de diversas maneras. Una de las funciones esenciales para esta función es el corrector ortográfico.

Para activar la corrección ortográfica en vim, puedes escribir:

:set spell

Para configurar el idioma que se está utilizando, puede escribir:

:set spelllang=[language abbreviation]

Ahora, se revisará la ortografía de su documento. La línea ondulada normal aparecerá debajo de las palabras mal escritas. Así es como se usa.

Para saltar hacia adelante y hacia atrás entre palabras mal escritas, escriba:

]s    # Jump to next mistake
[s    # Jump to previous mistake

Una vez que el cursor esté sobre una palabra mal escrita, podrá ver sugerencias ortográficas escribiendo:

z=

Esto le mostrará una lista de posibles coincidencias. Puede seleccionar la opción que desee eligiendo el número asociado o pulsar ENTER para dejar la palabra como está.

Si desea marcar una palabra como correcta , puede agregarla a una lista de ortografía. Vim mantiene dos listas de ortografía: una normal y una temporal que se usará en la sesión actual.

Para agregar la palabra a la lista de palabras “buenas”, utilice uno de estos comandos:

zg    # Adds word to regular dictionary
zG    # Adds word to the current session dictionary

Si agrega una palabra accidentalmente, puede eliminarla yendo a la palabra y escribiendo:

zug   # Remove word from regular dictionary
zuG   # Remove word from the current session dictionary

Si a menudo tiene que escribir palabras o frases largas, puede agregar una abreviatura.

Si escribimos :abseguido de una abreviatura y una expansión, vim ingresará la expansión siempre que escribamos la abreviatura seguida de un espacio.

Por ejemplo, si somos puristas y seguimos el ejemplo de Richard Stallman de corregir cualquier uso de “Linux” con “GNU/Linux”, podemos crear una abreviatura que lo haga automáticamente:

:ab Linux GNU/Linux

Ahora, cuando escribimos “Linux”, vim sustituirá automáticamente “GNU/Linux”.

Linux is an operating system.

Cambios en:

GNU/Linux is an operating system.

Sin embargo, si nos encontramos hablando específicamente del kernel, donde sólo la palabra Linux sería apropiada, podemos cancelar la expansión escribiendo CTRL-Vantes de escribir el espacio.

GNU/Linux is an operating system with Linux(CTRL-V) as a kernel.

Si ya no queremos utilizar esta abreviatura, podemos eliminarla con este comando:

:una Linux 

Ahora nuestro “Linux” seguirá siendo “Linux”.

Otra cosa que podrías tener que hacer de vez en cuando es insertar caracteres que no están en un teclado QWERTY tradicional. Los llamamos “dígrafos”. Puedes ver una lista de los dígrafos de Vim escribiendo:

:digraphs

NU ^@  10    SH ^A   1    SX ^B   2    EX ^C   3    ET ^D   4    EQ ^E   5
AK ^F   6    BL ^G   7    BS ^H   8    HT ^I   9    LF ^@  10    VT ^K  11
FF ^L  12    CR ^M  13    SO ^N  14    SI ^O  15    DL ^P  16    D1 ^Q  17
D2 ^R  18    D3 ^S  19    D4 ^T  20    NK ^U  21    SY ^V  22    EB ^W  23
CN ^X  24    EM ^Y  25    SB ^Z  26    EC ^[  27    FS ^\  28    GS ^]  29
RS ^^  30    US ^_  31    SP     32    Nb #   35    DO $   36    At @   64

Ahora, puedes insertar cualquiera de los caracteres en la columna derecha escribiendo CTRL-kseguido de las dos letras en la columna izquierda.

Por ejemplo, en mi computadora, para ingresar el signo de libra esterlina, puedo escribir esto cuando estoy en modo de inserción:

CTRL-k Pd

£

Código fuente


Si está codificando, hay varias cosas diferentes que lo ayudarán a interactuar con su código.

Una de las más básicas es el resaltado de sintaxis. Puedes activarlo escribiendo:

:syntax on

Esto debería configurar el resaltado de sintaxis para su archivo según la extensión detectada. Si desea cambiar el idioma del resaltado, puede hacerlo configurando el idioma con:

:set filetype=[language]

Si desea utilizar una utilidad del sistema para modificar algunas líneas de su archivo, puede llamarla usando el !comando en modo normal.

Este comando acepta un movimiento y luego lo envía al comando que le sigue.

![motion] filter

Por ejemplo, para ordenar las líneas desde la posición actual hasta el final del archivo, puede escribir:

!G sort

Sort es un comando de Linux que ordena la entrada, alfabéticamente de forma predeterminada.

Si queremos insertar la salida de un comando en el archivo, navegue hasta una línea en blanco donde desee la salida. Escriba:

!!command

Esto colocará la salida del comando especificado en el documento.

Si queremos ver el resultado de un comando, pero no deseamos insertarlo en el documento, también podemos utilizar la versión en modo comando (:), que sería:

:!command

Esto le mostrará los resultados del comando, pero regresará a su documento sin modificaciones cuando termine.

Reducir la repetición


A menudo, al editar o crear cualquier tipo de archivo, te encontrarás repitiendo muchas operaciones iguales o similares. Por suerte, vim ofrece algunas maneras de guardar grupos de comandos en macros.

Para comenzar a grabar una macro, puede escribir qseguido de una letra para hacer referencia a la macro.

qa    # will save macro "a"

Cualquier comando que escriba se grabará como parte de la macro. Para finalizar la macro, puede qvolver a escribir.

Entonces si escribimos:

qa0c3wDELETED<esc>q

Esto iniciaría una macro (guardada como “a”), iría al principio de la línea y reemplazaría las siguientes tres palabras con la palabra “DELETED”. Luego, saldría del modo de inserción y finalizaría la macro.

Para reproducir esta macro, comenzando en la posición actual del cursor, utilice el @carácter seguido de la referencia de la macro:

@a

Esto reproducirá los comandos macro comenzando en la posición actual.

Si queremos crear una macro que finalice en modo de inserción, debemos finalizarla de otra manera (al escribir “q”, simplemente se insertará una “q”). Podemos ejecutar un comando en modo normal en modo de inserción precediéndolo con “< CTRL-O.

Por lo tanto, si queremos cambiar el contenido de los primeros paréntesis de esta línea, podríamos tener una macro que diga:

qi0f(lct)<CTRL-O>q

Esto crea una macro “i”. La macro se desplaza al principio de la línea actual. Encuentra el paréntesis de apertura y se desplaza un carácter a la derecha (para moverse dentro del paréntesis). Después, cambia todo hasta el paréntesis de cierre. Con vim en modo de inserción esperando el texto de reemplazo, pulsamos CTRL-Oseguido de qpara finalizar la macro, quedando en modo de inserción listos para reemplazar el texto.

Conclusión


Ahora deberías tener una idea de algunas maneras más complejas en que vim puede ayudarte. Aunque esto pueda parecer mucho, es solo el comienzo.

Hay muchas funciones que no hemos mencionado, y no es necesario que las conozcas todas. Aprenderás lo importante según cómo uses vim. Cuanto más practiques y lo uses a diario, más natural te resultará y más potente será.

Stephen Dove
Comments

April 27, 2025

Dominando grep con expresiones regulares: Guía para una búsqueda de texto eficiente

Introducción

Este grepcomando es uno de los más útiles en un entorno de terminal Linux. Su nombre grepsignifica “impresión de expresión regular global”. Esto significa que se puede usar greppara comprobar si la entrada que recibe coincide con un patrón específico. Este programa, aparentemente trivial, es extremadamente potente; su capacidad para ordenar la entrada según reglas complejas lo convierte en un enlace popular en muchas cadenas de comandos.

En este tutorial, explorará las grepopciones del comando y luego profundizará en el uso de expresiones regulares para realizar búsquedas más avanzadas.

Prerrequisitos

Para seguir esta guía, necesitará acceder a un ordenador con sistema operativo Linux. Puede ser un servidor privado virtual al que se haya conectado por SSH o su equipo local. Tenga en cuenta que este tutorial se validó con un servidor Linux con Ubuntu 20.04, pero los ejemplos proporcionados deberían funcionar en cualquier ordenador con cualquier versión de Linux.

Si planea usar un servidor remoto para seguir esta guía, le recomendamos que primero complete nuestra guía de configuración inicial del servidor . Esto le permitirá configurar un entorno de servidor seguro, que incluye un usuario no root con sudoprivilegios y un firewall configurado con UFW, que puede usar para mejorar sus habilidades con Linux.

Uso básico

En este tutorial, utilizarás grepla Licencia Pública General GNU versión 3 para buscar varias palabras y frases.

Si usas Ubuntu, puedes encontrar el archivo en la /usr/share/common-licensescarpeta. Cópialo a tu directorio personal:

cp /usr/share/common-licenses/GPL-3 .

Si estás en otro sistema, usa el curlcomando para descargar una copia:

curl -o GPL-3 https://www.gnu.org/licenses/gpl-3.0.txt

También usarás el archivo de licencia BSD en este tutorial. En Linux, puedes copiarlo a tu directorio personal con el siguiente comando:

cp /usr/share/common-licenses/BSD .

Si está en otro sistema, cree el archivo con el siguiente comando:

cat << 'EOF' > BSD
Copyright (c) The Regents of the University of California.
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:
1. Redistributions of source code must retain the above copyright
   notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
   notice, this list of conditions and the following disclaimer in the
   documentation and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors
   may be used to endorse or promote products derived from this software
   without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
SUCH DAMAGE.
EOF

Ahora que tienes los archivos, puedes empezar a trabajar con grep.

En su forma más básica, se usa greppara buscar patrones literales dentro de un archivo de texto. Esto significa que, si se pasa grepuna palabra a buscar, se imprimirán todas las líneas del archivo que la contengan.

Ejecute el siguiente comando para grepbuscar cada línea que contenga la palabra GNU:

grep "GNU" GPL-3

El primer argumento, GNU, es el patrón que estás buscando, mientras que el segundo argumento, GPL-3, es el archivo de entrada que deseas buscar.

La salida resultante será cada línea que contenga el texto del patrón:

Output                    GNU GENERAL PUBLIC LICENSE
  The GNU General Public License is a free, copyleft license for
the GNU General Public License is intended to guarantee your freedom to
GNU General Public License for most of our software; it applies also to
  Developers that use the GNU GPL protect your rights with two steps:
  "This License" refers to version 3 of the GNU General Public License.
  13. Use with the GNU Affero General Public License.
under version 3 of the GNU Affero General Public License into a single
...
...

En algunos sistemas, el patrón que buscó aparecerá resaltado en la salida.

Opciones comunes

De forma predeterminada, grepbuscará el patrón exacto especificado en el archivo de entrada y devolverá las líneas que encuentre. Sin embargo, puede hacer que este comportamiento sea más útil añadiendo indicadores opcionales a grep.

Si desea grepignorar las mayúsculas y minúsculas de su parámetro de búsqueda y buscar variaciones en mayúsculas y minúsculas, puede especificar la opción -io .--ignore-case

Busque cada instancia de la palabra license(con mayúsculas, minúsculas o mixtas) en el mismo archivo que antes con el siguiente comando:

grep -i "license" GPL-3

Los resultados contienen: LICENSE, license, y License:

Output                    GNU GENERAL PUBLIC LICENSE
 of this license document, but changing it is not allowed.
  The GNU General Public License is a free, copyleft license for
  The licenses for most software and other practical works are designed
the GNU General Public License is intended to guarantee your freedom to
GNU General Public License for most of our software; it applies also to
price.  Our General Public Licenses are designed to make sure that you
(1) assert copyright on the software, and (2) offer you this License
  "This License" refers to version 3 of the GNU General Public License.
  "The Program" refers to any copyrightable work licensed under this
...
...

Si hubiera habido una instancia con LiCeNsE, ésta también se habría devuelto.

Si desea encontrar todas las líneas que no contienen un patrón especificado, puede utilizar la opción -vo --invert-match.

Busque cada línea que no contenga la palabra theen la licencia BSD con el siguiente comando:

grep -v "the" BSD

Recibirás este resultado:

OutputAll rights reserved.

Redistribution and use in source and binary forms, with or without
are met:
    may be used to endorse or promote products derived from this software
    without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
...
...

Como no especificó la opción “ignorar mayúsculas y minúsculas”, los dos últimos elementos se devolvieron como si no tuvieran la palabra the.

Suele ser útil conocer el número de línea donde se producen las coincidencias. Puede hacerlo usando la opción -n“o” --line-number. Repita el ejemplo anterior con esta opción añadida:

grep -vn "the" BSD

Esto devolverá el siguiente texto:

Output2:All rights reserved.
3:
4:Redistribution and use in source and binary forms, with or without
6:are met:
13:   may be used to endorse or promote products derived from this software
14:   without specific prior written permission.
15:
16:THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
17:ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
...
...

Ahora puedes referenciar el número de línea si quieres modificar todas las líneas que no contengan “<sub>” the. Esto resulta especialmente útil al trabajar con código fuente.

Expresiones regulares

En la introducción, aprendiste que grepsignifica “impresión de expresión regular global”. Una “expresión regular” es una cadena de texto que describe un patrón de búsqueda específico.

Distintas aplicaciones y lenguajes de programación implementan expresiones regulares de forma ligeramente distinta. En este tutorial, solo explorarás una pequeña parte de cómo grepse describen sus patrones.

Coincidencias literales

En los ejemplos anteriores de este tutorial, al buscar las palabras GNUy the, en realidad, buscaba expresiones regulares básicas que coincidieran con la cadena exacta de caracteres GNUy the. Los patrones que especifican con precisión los caracteres que se deben buscar se denominan “literales” porque coinciden con el patrón literalmente, carácter por carácter.

Es útil pensar en ellos como si coincidieran con una cadena de caracteres en lugar de una palabra. Esta distinción será más importante a medida que aprendas patrones más complejos.

Todos los caracteres alfabéticos y numéricos (así como algunos otros caracteres) coinciden literalmente a menos que sean modificados por otros mecanismos de expresión.

Partidos de ancla

Los anclajes son caracteres especiales que especifican en qué parte de la línea debe producirse una coincidencia para que sea válida.

Por ejemplo, al usar anclas, puede especificar que solo desea conocer las líneas que coinciden GNUal principio de la línea. Para ello, puede usar el ^ancla antes de la cadena literal.

Ejecute el siguiente comando para buscar en el GPL-3archivo y encontrar líneas donde GNUaparece al principio de una línea:

grep "^GNU" GPL-3

Este comando devolverá las siguientes dos líneas:

OutputGNU General Public License for most of our software; it applies also to
GNU General Public License, you may choose any version ever published

De manera similar, se utiliza el $ancla al final de un patrón para indicar que la coincidencia solo será válida si ocurre al final de una línea.

Este comando coincidirá con cada línea que termine con la palabra anden el GPL-3archivo:

grep "and$" GPL-3

Recibirás este resultado:

Outputthat there is no warranty for this free software.  For both users' and
  The precise terms and conditions for copying, distribution and
  License.  Each licensee is addressed as "you".  "Licensees" and
receive it, in any medium, provided that you conspicuously and
    alternative is allowed only occasionally and noncommercially, and
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
provisionally, unless and until the copyright holder explicitly and
receives a license from the original licensors, to run, modify and
make, use, sell, offer for sale, import and otherwise run, modify and

Coincidencia de cualquier personaje

El carácter de punto (.) se utiliza en expresiones regulares para indicar que cualquier carácter individual puede existir en la ubicación especificada.

Por ejemplo, para hacer coincidir cualquier cosa en el GPL-3archivo que tenga dos caracteres y luego la cadena cept, utilizaría el siguiente patrón:

grep "..cept" GPL-3

Este comando devuelve el siguiente resultado:

Outputuse, which is precisely where it is most unacceptable.  Therefore, we
infringement under applicable copyright law, except executing it on a
tells the user that there is no warranty for the work (except to the
License by making exceptions from one or more of its conditions.
form of a separately written license, or stated as exceptions;
  You may not propagate or modify a covered work except as expressly
  9. Acceptance Not Required for Having Copies.
...
...

Esta salida contiene instancias de ” accepty except” y variaciones de ambas palabras. El patrón también habría coincidido z2ceptsi se hubiera encontrado.

Expresiones entre paréntesis

Al colocar un grupo de caracteres entre corchetes ( \[y \]), puede especificar que el carácter en esa posición puede ser cualquier carácter que se encuentre dentro del grupo de corchetes.

Por ejemplo, para encontrar las líneas que contienen tooo two, deberá especificar esas variaciones sucintamente utilizando el siguiente patrón:

grep "t[wo]o" GPL-3

La salida muestra que ambas variaciones existen en el archivo:

Outputyour programs, too.
freedoms that you received.  You must make sure that they, too, receive
  Developers that use the GNU GPL protect your rights with two steps:
a computer network, with no transfer of a copy, is not conveying.
System Libraries, or general-purpose tools or generally available free
    Corresponding Source from a network server at no charge.
...
...

La notación entre corchetes ofrece opciones interesantes. Puedes hacer que el patrón coincida con cualquier carácter excepto los dentro de un corchete, comenzando la lista de caracteres dentro de los corchetes con un ^carácter.

Este ejemplo es como el patrón .ode, pero no coincidirá con el patrón code:

grep "[^c]ode" GPL-3

Aquí está el resultado que recibirás:

Output  1. Source Code.
    model, to give anyone who possesses the object code either (1) a
the only significant mode of use of the product.
notice like this when it starts in an interactive mode:

Observe que en la segunda línea devuelta, se encuentra la palabra code. Esto no se debe a un error de la expresión regular ni de grep. Más bien, esta línea se devolvió porque anteriormente se encontró el patrón mode, presente en la palabra model. La línea se devolvió porque existía una instancia que coincidía con el patrón.

Otra característica útil de los corchetes es que puedes especificar un rango de caracteres en lugar de escribir individualmente cada carácter disponible.

Esto significa que si desea encontrar cada línea que comience con una letra mayúscula, puede utilizar el siguiente patrón:

grep "^[A-Z]" GPL-3

Aquí está el resultado que devuelve esta expresión:

OutputGNU General Public License for most of our software; it applies also to
States should not allow patents to restrict development and use of
License.  Each licensee is addressed as "you".  "Licensees" and
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
System Libraries, or general-purpose tools or generally available free
Source.
User Product is transferred to the recipient in perpetuity or for a
...
...

Debido a algunos problemas de clasificación heredados, a menudo es más preciso utilizar clases de caracteres POSIX en lugar de rangos de caracteres como los que acaba de utilizar.

Analizar cada clase de carácter POSIX quedaría fuera del alcance de esta guía, pero un ejemplo que lograría el mismo procedimiento que el ejemplo anterior utiliza la \[:upper:\]clase de carácter dentro de un selector de corchetes:

grep "^[[:upper:]]" GPL-3

La salida será la misma que antes.

Repetir el patrón cero o más veces

Por último, uno de los metacaracteres más utilizados es el asterisco, o *, que significa “repetir el carácter o expresión anterior cero o más veces”.

Para encontrar cada línea en el GPL-3archivo que contiene un paréntesis de apertura y cierre, con solo letras y espacios simples en el medio, use la siguiente expresión:

grep "([A-Za-z ]*)" GPL-3

Obtendrá el siguiente resultado:

Output Copyright (C) 2007 Free Software Foundation, Inc.
distribution (with or without modification), making available to the
than the work as a whole, that (a) is included in the normal form of
Component, and (b) serves only to enable use of the work with that
(if any) on which the executable work runs, or a compiler used to
    (including a physical distribution medium), accompanied by the
    (including a physical distribution medium), accompanied by a
    place (gratis or for a charge), and offer equivalent access to the
...
...

Hasta ahora has utilizado puntos, asteriscos y otros caracteres en tus expresiones, pero a veces necesitas buscar esos caracteres específicamente.

Escapar de metacaracteres

En ocasiones, necesitará buscar un punto literal o un corchete de apertura literal, especialmente al trabajar con código fuente o archivos de configuración. Dado que estos caracteres tienen un significado especial en las expresiones regulares, deberá “escaparlos” para indicar grepque no desea usar su significado especial en este caso.

Para escapar caracteres, utilice el carácter de barra invertida ( \) delante del carácter que normalmente tendría un significado especial.

Por ejemplo, para encontrar cualquier línea que comience con una letra mayúscula y termine con un punto, utilice la siguiente expresión que escapa del punto final para que represente un punto literal en lugar del significado habitual de “cualquier carácter”:

grep "^[A-Z].*\.$" GPL-3

Este es el resultado que verás:

OutputSource.
License by making exceptions from one or more of its conditions.
License would be to refrain entirely from conveying the Program.
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
SUCH DAMAGES.
Also add information on how to contact you by electronic and paper mail.

Ahora veamos otras opciones de expresiones regulares.

Expresiones regulares extendidas

El grepcomando admite un lenguaje de expresiones regulares más extenso al usar la -Ebandera o al llamar al egrepcomando en lugar de grep.

Estas opciones amplían las posibilidades de las expresiones regulares extendidas. Estas expresiones regulares incluyen todos los metacaracteres básicos, además de metacaracteres adicionales para expresar coincidencias más complejas.

Agrupamiento

Una de las capacidades más útiles que ofrecen las expresiones regulares extendidas es la capacidad de agrupar expresiones para manipularlas o referenciarlas como una unidad.

Para agrupar expresiones, enciérrelas entre paréntesis. Si desea usar paréntesis sin usar expresiones regulares extendidas, puede escaparlas con la barra invertida para habilitar esta función. Esto significa que las siguientes tres expresiones son funcionalmente equivalentes:

grep "\(grouping\)" file.txt
grep -E "(grouping)" file.txt
egrep "(grouping)" file.txt

Alternancia

De manera similar a cómo las expresiones entre corchetes pueden especificar diferentes opciones posibles para coincidencias de un solo carácter, la alternancia le permite especificar coincidencias alternativas para cadenas o conjuntos de expresiones.

Para indicar alternancia, utilice el carácter de barra vertical |. Estos se utilizan a menudo en la agrupación entre paréntesis para especificar que una de dos o más posibilidades debe considerarse una coincidencia.

GPLLo siguiente lo encontrará General Public Licenseen el texto:

grep -E "(GPL|General Public License)" GPL-3

El resultado se ve así:

Output  The GNU General Public License is a free, copyleft license for
the GNU General Public License is intended to guarantee your freedom to
GNU General Public License for most of our software; it applies also to
price.  Our General Public Licenses are designed to make sure that you
  Developers that use the GNU GPL protect your rights with two steps:
  For the developers' and authors' protection, the GPL clearly explains
authors' sake, the GPL requires that modified versions be marked as
have designed this version of the GPL to prohibit the practice for those
...
...

La alternancia puede seleccionar entre más de dos opciones agregando opciones adicionales dentro del grupo de selección separadas por |caracteres de barra vertical ( ).

Cuantificadores

Al igual que el *metacarácter que coincidió con el carácter o conjunto de caracteres anterior cero o más veces, hay otros metacaracteres disponibles en expresiones regulares extendidas que especifican la cantidad de ocurrencias.

Para que un carácter coincida cero o una vez, puedes usar el ?carácter. Esto hace que los caracteres o conjuntos de caracteres anteriores sean, en esencia, opcionales.

Los siguientes partidos copyrighty rightponiendo copyen un grupo opcional:

grep -E "(copy)?right" GPL-3

Recibirás este resultado:

Output Copyright (C) 2007 Free Software Foundation, Inc.
  To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights.  Therefore, you have
know their rights.
  Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
  "Copyright" also means copyright-like laws that apply to other kinds of
...

El +carácter coincide con una expresión una o más veces. Es similar al *metacarácter, pero con el +carácter, la expresión debe coincidir al menos una vez.

La siguiente expresión coincide con la cadena freemás uno o más caracteres que no sean espacios en blanco:

grep -E "free[^[:space:]]+" GPL-3

Verás este resultado:

Output  The GNU General Public License is a free, copyleft license for
to take away your freedom to share and change the works.  By contrast,
the GNU General Public License is intended to guarantee your freedom to
  When we speak of free software, we are referring to freedom, not
have the freedom to distribute copies of free software (and charge for
you modify it: responsibilities to respect the freedom of others.
freedomss that you received.  You must make sure that they, too, receive
protecting users' freedom to change the software.  The systematic
of the GPL, as needed to protect the freedom of users.
patents cannot be used to render the program non-free.

Especificación de la repetición de coincidencias

Para especificar el número de veces que se repite una coincidencia, utilice las llaves ( {y }). Estas llaves permiten especificar un número exacto, un rango o un límite superior o inferior para la cantidad de veces que una expresión puede coincidir.

Utilice la siguiente expresión para encontrar todas las líneas del GPL-3archivo que contienen vocales triples:

grep -E "[AEIOUaeiou]{3}" GPL-3

Cada línea devuelta tiene una palabra con tres vocales:

Outputchanged, so that their problems will not be attributed erroneously to
authors of previous versions.
receive it, in any medium, provided that you conspicuously and
give under the previous paragraph, plus a right to possession of the
covered work so as to satisfy simultaneously your obligations under this

Para encontrar cualquier palabra que tenga entre 16 y 20 caracteres, utilice la siguiente expresión:

grep -E "[[:alpha:]]{16,20}" GPL-3

Aquí está el resultado de este comando:

Output    certain responsibilities if you distribute copies of the software, or if
    you modify it: responsibilities to respect the freedom of others.
        c) Prohibiting misrepresentation of the origin of that material, or

Sólo se muestran las líneas que contienen palabras dentro de esa longitud.

Casos de uso práctico

1. Validación de campos CSV

Para validar campos CSV, puede usar grepexpresiones regulares para buscar patrones o formatos específicos. Por ejemplo, para comprobar si todas las líneas de un archivo CSV tienen exactamente 5 campos separados por comas, puede usar el siguiente comando:

grep -E "^[^,]+,[^,]+,[^,]+,[^,]+,[^,]+$" yourfile.csv

Este comando imprimirá solo las líneas que coincidan con el patrón especificado, indicando campos CSV válidos.

2. Filtrar registros por nivel de error (por ejemplo, grep “ERROR” logs.txt)

Filtrar registros por nivel de error es un uso común de grep. Para filtrar registros por líneas que contengan la palabra “ERROR”, puede usar el siguiente comando:

grep "ERROR" logs.txt

Este comando imprimirá todas las líneas logs.txtque contengan la palabra “ERROR”, lo que le permitirá centrarse en los mensajes de error.

3. Búsqueda de funciones específicas en el código fuente

Al buscar en el código fuente, grepse puede usar para encontrar funciones o patrones específicos. Por ejemplo, para encontrar todas las ocurrencias de una función nombrada calculateTotalen un directorio de archivos de código fuente, se puede usar el siguiente comando:

grep -r "calculateTotal" /path/to/source/code/directory

Este comando buscará recursivamente todos los archivos en el directorio especificado e imprimirá las líneas que contienen el nombre de la función.

4. Coincidencia de URL o direcciones de correo electrónico en el texto

Se pueden usar expresiones regulares para buscar coincidencias entre URL o direcciones de correo electrónico en texto. Por ejemplo, para encontrar todas las líneas de un archivo que contienen una URL, puede usar el siguiente comando:

grep -E "https?://[^ ]+" yourfile.txt

Este comando imprimirá todas las líneas que contengan una URL que comience con “http://” o “https://”.

5. Preprocesamiento de PNL: filtrado de líneas con palabras vacías

Las palabras vacías son palabras comunes como “el”, “y”, etc., que no tienen mucho significado en una oración. Para filtrar líneas que contienen palabras vacías, puede usar grepuna lista de palabras vacías. Por ejemplo, para filtrar líneas que contienen las palabras vacías “el”, “y” o “un”, puede usar el siguiente comando:

grep -vE "the|and|a" yourfile.txt

Este comando imprimirá todas las líneas que no contengan ninguna de las palabras vacías especificadas.

6. Detección de entradas casi duplicadas o errores ortográficos

Las expresiones regulares permiten detectar entradas casi duplicadas o errores ortográficos mediante la búsqueda de patrones similares. Por ejemplo, para encontrar líneas que contengan palabras con una sola diferencia de carácter, se puede usar el siguiente comando:

grep -E "(\w)\1" yourfile.txt

Este comando imprimirá todas las líneas que contengan palabras con un solo carácter repetido, lo que indica posibles duplicados o errores ortográficos.

7. Patrones de expresiones regulares para entidades con nombre o frases comunes

Las expresiones regulares permiten encontrar coincidencias entre entidades con nombre o frases comunes en el texto. Por ejemplo, para encontrar todas las líneas que contienen una frase específica como “reconocimiento de entidad con nombre”, se puede usar el siguiente comando:

grep -E "named entity recognition" yourfile.txt

Este comando imprimirá todas las líneas que contengan la frase especificada, lo que le permitirá centrarse en la información relevante.

Errores comunes y depuración

1. Usar operadores de expresiones regulares como *, + o ? sin escaparlos

Al usar operadores de expresiones regulares como *, +, o ?, es fundamental escaparlos correctamente para evitar coincidencias inesperadas. Por ejemplo, si desea que coincida con el carácter literal *, debe escaparlo con una barra invertida ( \*). De igual forma, para que coincida con los caracteres literales +o ?, escápelos con una barra invertida ( \+o \?).

Ejemplo de comando para hacer coincidir un *carácter literal:

grep -E "a\*" yourfile.txt

2. Coincidencia de líneas vacías o líneas con solo espacios en blanco

Para hacer coincidir líneas vacías o líneas con solo espacios en blanco, puede utilizar el siguiente patrón de expresión regular:

grep -E "^\s*$" yourfile.txt

Este patrón coincide con líneas que comienzan ( ^) y terminan ( $) con cualquier carácter de espacio en blanco ( \s*).

3. Tabulaciones (\t) y retornos de carro (\r)

Para hacer coincidir tabulaciones ( \t) o retornos de carro ( \r) en su texto, puede utilizar los siguientes comandos:

# Match lines containing tabs
grep -E "\t" yourfile.txt

# Match lines containing carriage returns
grep -E "\r" yourfile.txt

Tenga en cuenta que en algunos casos, es posible que necesite usar la -Eopción para habilitar patrones de expresiones regulares extendidos, que le permiten usar funciones de expresiones regulares más avanzadas.

Diferencias entre grep, egrep y fgrep

DominioDescripciónCaracterísticasCasos de usoComando de muestra
grepCoincidencia de patrones básicosAdmite expresiones regulares básicasCoincidencia de patrones generalesgrep "pattern" file.txt
egrepCoincidencia de patrones extendidaAdmite expresiones regulares extendidasCoincidencia de patrones complejosegrep "pattern" file.txt
fgrepCoincidencia de patrones fijosSin soporte para expresiones regularesCoincidencia de cadenas fijasfgrep "pattern" file.txt

<$>[noe] Nota: La principal diferencia entre estos comandos es el tipo de coincidencia de patrones que admiten. grepAdmite expresiones regulares básicas, egrepadmite expresiones regulares extendidas y fgrepno admite expresiones regulares en absoluto. <$>

Manejo de patrones multilínea

grepNo es adecuado para gestionar patrones multilínea debido a su naturaleza lineal. Sin embargo, existen herramientas alternativas que pueden gestionar eficazmente estos patrones. awkSon perldos opciones populares para buscar patrones que abarcan varias líneas.

awkEs una potente herramienta de procesamiento de texto que permite encontrar patrones en varias líneas. Permite definir un patrón y realizar acciones en las líneas coincidentes. Por ejemplo, para encontrar líneas que contengan un patrón en varias líneas, se puede usar el siguiente comando:

awk '/pattern/ {print $0}' yourfile.txt

Este comando imprimirá todas las líneas que coincidan con el patrón especificado. Tenga en cuenta que awktambién puede usarse para realizar operaciones más complejas en las líneas coincidentes, como imprimir todo el bloque de texto que coincide con el patrón.

perlEs otra herramienta potente que permite gestionar patrones multilínea. Ofrece una forma más flexible y expresiva de encontrar coincidencias de patrones mediante su motor de expresiones regulares integrado. Por ejemplo, puede usar el siguiente comando para buscar líneas que contengan un patrón en varias líneas:

perl -0777 -ne 'print if /pattern/s' yourfile.txt

Este comando indica perlque se lea el archivo en modo “slurp” ( -0777), lo que permite leerlo completo en memoria de una sola vez. La -neopción especifica que el script debe ejecutarse para cada línea del archivo. La print if /pattern/sinstrucción busca la coincidencia del patrón en varias líneas (gracias al smodificador) e imprime el bloque de texto completo que coincide.

Ambos ofrecen funciones más avanzadas y flexibilidad cuando awkse trata de manejar patrones multilínea, lo que los convierte en alternativas ideales para tales tareas.perlgrep

Preguntas frecuentes

1. ¿Cuál es la diferencia entre grep y egrep?

grepy egrepambos se utilizan para la coincidencia de patrones, pero difieren en el tipo de patrones que admiten. grepadmite expresiones regulares básicas, mientras que egrepadmite expresiones regulares extendidas, que permiten una coincidencia de patrones más avanzada.

2. ¿Puedo usar grep para buscar en varios archivos?

Sí, puedes grepbuscar en varios archivos especificando varios nombres de archivo o usando comodines. Por ejemplo:

grep "pattern" file1.txt file2.txt

o

grep "pattern" *.txt

3. ¿Cómo puedo buscar líneas que no coinciden con un patrón?

Para buscar líneas que no coincidan con un patrón, use la -vopción. Por ejemplo:

grep -v "pattern" yourfile.txt

Esto imprimirá todas las líneas que no contengan el patrón especificado.

4. ¿Cómo incluyo números de línea en la salida de grep?

Para incluir números de línea en grepla salida, utilice la -nopción. Por ejemplo:

grep -n "pattern" yourfile.txt

Esto imprimirá los números de línea junto con las líneas que coincidan con el patrón especificado.

5. ¿Por qué mi expresión regular grep no funciona como se esperaba?

Puede haber varias razones por las que tu grepexpresión regular no funciona como se espera. Aquí tienes algunos problemas comunes que debes revisar:

  • Asegúrese de estar utilizando la sintaxis correcta para su patrón de expresión regular.
  • Asegúrese de estar utilizando las opciones correctas para su grepcomando (por ejemplo, -Epara expresiones regulares extendidas).
  • Comprueba si tu patrón contiene caracteres especiales que es necesario escapar.
  • Verifique que su patrón esté citado correctamente para evitar la interpretación del shell.

6. ¿Cómo puedo buscar un patrón que incluya espacios en blanco o caracteres especiales?

Para buscar un patrón que incluya espacios o caracteres especiales, debe escaparlos correctamente en su patrón de expresión regular. Por ejemplo, para buscar un patrón que incluya espacios, utilice el siguiente comando:

grep "pattern\ with\ whitespace" yourfile.txt

De forma similar, para buscar un patrón que incluya caracteres especiales, escápelos con una barra invertida ( \). Por ejemplo:

grep "pattern\ with\ special\ characters" yourfile.txt

Conclusión

grepEs una herramienta poderosa para encontrar patrones dentro de archivos o en la jerarquía del sistema de archivos. Dominar sus opciones y sintaxis mejorará enormemente su capacidad para trabajar con datos de texto.

Las expresiones regulares son un concepto fundamental en informática, y comprenderlas abre un amplio abanico de posibilidades. Desde la búsqueda y el reemplazo avanzados de texto en editores de texto hasta la validación de datos en lenguajes de programación, las expresiones regulares son una habilidad esencial.

Para mejorar aún más tus habilidades, te recomendamos consultar los siguientes tutoriales:

  • El comando Grep en Linux/Unix
  • Introducción a las expresiones regulares
  • Comandos de Linux
  • Las mejores herramientas de recuperación de datos de Linux

Al explorar estos tutoriales, obtendrá una comprensión más profunda de grep, expresiones regulares y otras herramientas esenciales de Linux, lo que le permitirá abordar una amplia gama de tareas con confianza.

Stephen Dove
Comments

April 27, 2025

Cómo usar SFTP para transferir archivos con un servidor remoto de manera segura

Introducción

FTP, o “File Transfer Protocol” (Protocolo de transferencia de archivos), era un método popular sin cifrar para transferir archivos entre dos sistemas remotos.

SFTP, que significa Protocolo de transferencia de archivos SSH o Protocolo de transferencia segura de archivos, es un protocolo independiente empaquetado con SSH que funciona de forma similar pero a través de una conexión segura. La ventaja es la capacidad de aprovechar una conexión segura para transferir archivos y recorrer el sistema de archivos en los sistemas local y remoto.

En casi todos los casos, es preferible usar SFTP, en vez de FTP, debido a sus características de seguridad subyacentes y a su capacidad para aprovechar una conexión SSH. FTP es un protocolo no seguro que solo debería utilizarse en casos limitados o en redes de confianza.

Aunque SFTP está integrado en muchas herramientas gráficas, esta guía mostrará cómo utilizarlo en su interfaz de línea de comandos interactiva.

Cómo conectarse con SFTP

De forma predeterminada, SFTP utiliza el protocolo SSH para autenticarse y establecer una conexión segura. Por eso, están disponibles los mismos métodos de autenticación que en SSH.

Aunque las contraseñas son fáciles de usar y se configuran de forma predeterminada, le recomendamos crear claves SSH y transferir su clave pública a cualquier sistema al que necesite acceder. Eso es mucho más seguro y puede ahorrarle tiempo a largo plazo.

Consulte esta guía para configurar claves SSH para acceder a su servidor si aún no lo hizo.

Si puede conectarse al equipo usando SSH, habrá completado todos los requisitos necesarios para usar SFTP para administrar archivos. Pruebe el acceso SSH con el siguiente comando:

ssh sammy@your_server_ip_or_remote_hostname

Si esto funciona, salga de nuevo escribiendo:

exit

Ahora, podemos establecer una sesión SFTP ejecutando el siguiente comando:

sftp sammy@your_server_ip_or_remote_hostname

Conectará el sistema remoto, y la entrada de su línea de comandos cambiará a una instrucción SFTP.

Si está trabajando en un puerto SSH personalizado (no el puerto 22 predeterminado), puede iniciar una sesión SFTP de la siguiente manera:

sftp -oPort=custom_port sammy@your_server_ip_or_remote_hostname

Eso lo conectará al sistema remoto mediante el puerto especificado.

Cómo obtener ayuda en SFTP

El comando más útil que debe conocer primero es el comando help. Este comando le da acceso a un resumen de la ayuda en SFTP. Puede invocarlo escribiendo cualquiera de estos en la instrucción:

help

o

?

Eso mostrará una lista de los comandos disponibles:

OutputAvailable commands:
bye                                Quit sftp
cd path                            Change remote directory to 'path'
chgrp grp path                     Change group of file 'path' to 'grp'
chmod mode path                    Change permissions of file 'path' to 'mode'
chown own path                     Change owner of file 'path' to 'own'
df [-hi] [path]                    Display statistics for current directory or
                                   filesystem containing 'path'
exit                               Quit sftp
get [-Ppr] remote [local]          Download file
help                               Display this help text
lcd path                           Change local directory to 'path'
. . .

En las siguientes secciones, exploraremos algunos de los comandos que verá.

Cómo navegar con SFTP

Podemos navegar a través de la jerarquía de archivos del sistema remoto usando varios comandos que funcionan de forma similar a sus contrapartes de shell.

Primero, orientémonos averiguando en qué directorio estamos actualmente en el sistema remoto. Al igual que en una sesión típica de shell, podemos escribir lo siguiente para obtener el directorio actual:

pwd

OutputRemote working directory: /home/demouser

Podemos ver el contenido del directorio actual del sistema remoto con otro comando familiar:

ls

OutputSummary.txt     info.html       temp.txt        testDirectory

Tenga en cuenta que los comandos en la interfaz SFTP no son los comandos de shell normales y no cuentan con la misma cantidad de funciones, pero implementan algunos de los indicadores opcionales más importantes:

ls -la

Outputdrwxr-xr-x    5 demouser   demouser       4096 Aug 13 15:11 .
drwxr-xr-x    3 root     root         4096 Aug 13 15:02 ..
-rw-------    1 demouser   demouser          5 Aug 13 15:04 .bash_history
-rw-r--r--    1 demouser   demouser        220 Aug 13 15:02 .bash_logout
-rw-r--r--    1 demouser   demouser       3486 Aug 13 15:02 .bashrc
drwx------    2 demouser   demouser       4096 Aug 13 15:04 .cache
-rw-r--r--    1 demouser   demouser        675 Aug 13 15:02 .profile
. . .

Para llegar a otro directorio, podemos ejecutar este comando:

cd testDirectory

Ahora, podemos recorrer el sistema de archivos remotos, pero ¿qué pasa si necesitamos acceder a nuestro sistema de archivos local? Podemos dirigir los comandos al sistema de archivos locales precediéndolos con una l que hace referencia a “local”.

Todos los comandos examinados hasta ahora tienen equivalentes locales. Podemos imprimir el directorio local de trabajo:

lpwd

OutputLocal working directory: /Users/demouser

Podemos enumerar el contenido del directorio actual en el equipo local:

lls

OutputDesktop			local.txt		test.html
Documents		analysis.rtf		zebra.html

También podemos cambiar el directorio con el que deseamos interactuar en el sistema local:

lcd Desktop

Cómo transferir archivos con SFTP

Navegar por los sistemas de archivos locales y remotos es muy poco útil si no se puede transferir archivos entre ambos.

Transferencia de archivos remotos al sistema local

Si queremos descargar archivos de nuestro host remoto, podemos hacerlo ejecutando el siguiente comando:

get remoteFile

OutputFetching /home/demouser/remoteFile to remoteFile
/home/demouser/remoteFile                       100%   37KB  36.8KB/s   00:01

Como puede ver, de forma predeterminada, el comando get descarga un archivo remoto a un archivo con el mismo nombre en el sistema de archivos locales.

Podemos copiar el archivo remoto a un nombre diferente especificando el nombre después:

get remoteFile localFile

El comando get también toma algunos indicadores de opción. Por ejemplo, podemos copiar un directorio y todo su contenido especificando la opción recursiva:

get -r someDirectory

Podemos indicarle a SFTP que mantenga los permisos y los tiempos de acceso adecuados utilizando el indicador -P o -p:

get -Pr someDirectory

Transferencia de archivos locales al sistema remoto

Transferir archivos al sistema remoto es tan fácil como utilizar el comando correctamente llamado “put”:

put localFile

OutputUploading localFile to /home/demouser/localFile
localFile                                     100% 7607     7.4KB/s   00:00

Los mismos indicadores que funcionan con get se aplican a put. Para copiar un directorio local completo, puede ejecutar:

put -r localDirectory

Nota: Actualmente, hay un error en las versiones de OpenSSH incluidas en las versiones actuales de Ubuntu (al menos de la versión 14.04 a la 15.10) que impide que el comando anterior funcione correctamente. Cuando se ejecuta el comando anterior para transferir contenido a un servidor utilizando la versión con errores de OpenSSH, se producirá el siguiente error: Couldn't canonicalise: No such file or directory (No se pudo canonizar: no existe tal archivo o directorio).

Para resolver este problema, primero cree el directorio de destino en el extremo remoto escribiendo mkdir localDirectory. Luego, el comando anterior debería completarse sin errores.

Una herramienta familiar que es útil para descargar y cargar archivos es el comando df, que funciona de forma similar a la versión de la línea de comandos. Al utilizarla, puede verificar que tiene suficiente espacio para completar las transferencias que le interesan:

df -h

Output    Size     Used    Avail   (root)    %Capacity
  19.9GB   1016MB   17.9GB   18.9GB           4%

Tenga en cuenta que no hay ninguna variación local de este comando, pero podemos solucionarlo ejecutando ! como comando.

El comando ! nos lleva a un shell local, donde podemos ejecutar cualquier comando disponible en nuestro sistema local. Podemos verificar el uso del disco escribiendo lo siguiente:

!

y luego

df -h

OutputFilesystem      Size   Used  Avail Capacity  Mounted on
/dev/disk0s2   595Gi   52Gi  544Gi     9%    /
devfs          181Ki  181Ki    0Bi   100%    /dev
map -hosts       0Bi    0Bi    0Bi   100%    /net
map auto_home    0Bi    0Bi    0Bi   100%    /home

Cualquier otro comando local funcionará de la manera esperada. Para volver a su sesión SFTP, escriba lo siguiente:

exit

Ahora, debería ver el retorno de la instrucción de SFTP.

Manipulaciones de archivos simples con SFTP

SFTP le permite realizar el tipo de mantenimiento básico de archivos que es útil cuando se trabaja con jerarquías de archivos.

Por ejemplo, puede cambiar el propietario de un archivo en el sistema remoto con:

chown userID file

Observe cómo, a diferencia del comando chmod del sistema, el comando SFTP no acepta nombres de usuario, sino que utiliza UID. Lamentablemente, no hay una manera sencilla de saber el UID adecuado desde la interfaz SFTP.

Se puede realizar una solución alternativa más compleja con:

get /etc/passwd
!less passwd

Outputroot:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
. . .

Observe cómo en vez de utilizar el comando ! en sí, lo utilizamos como prefijo para un comando de shell local. Eso funciona para ejecutar cualquier comando disponible en nuestro equipo local y podría haberse utilizado anteriormente con el comando local df.

El UID se encuentra en la tercera columna del archivo, delimitado por caracteres de dos puntos.

De manera similar, podemos cambiar el propietario del grupo de un archivo con:

chgrp groupID file

De nuevo, no existe una forma sencilla de obtener una lista de los grupos del sistema remoto. Podemos solucionarlo con el siguiente comando:

get /etc/group
!less group

Outputroot:x:0:
daemon:x:1:
bin:x:2:
sys:x:3:
adm:x:4:
tty:x:5:
disk:x:6:
lp:x:7:
. . .

La tercera columna contiene el ID del grupo asociado con el nombre en la primera columna. Eso es lo que buscamos.

Por suerte, el comando chmod funciona correctamente en el sistema de archivos remotos:

chmod 777 publicFile

OutputChanging mode on /home/demouser/publicFile

No existe ningún comando para manipular permisos de archivo locales, pero puede quitar la máscara local para que todos los archivos que se copien al sistema local tengan los permisos adecuados.

Eso se puede lograr con el comando lumask:

lumask 022

OutputLocal umask: 022

Ahora, todos los archivos regulares descargados (siempre que no se utilice el indicador -p) tendrán 644 permisos.

SFTP permite crear directorios en sistemas locales y en sistemas remotos con lmkdir y mkdir, respectivamente. Estos funcionan de la manera prevista.

El resto de los comandos del archivo solo apuntan al sistema de archivos remotos:

ln
rm
rmdir

Estos comandos replican el comportamiento básico de las versiones del shell. Si necesita realizar estas acciones en el sistema de archivos local, recuerde que puede ingresar a un shell ejecutando este comando:

!

O ejecutar un comando único en el sistema local anteponiendo ! al comando de esta manera:

!chmod 644 somefile

Cuando termine con la sesión SFTP, utilice exit o bye para cerrar la conexión.

bye

Conclusión

Aunque SFTP es una herramienta simple, es muy útil para administrar servidores y transferir archivos entre ellos.

Por ejemplo, puede usar SFTP para permitir que determinados usuarios transfieran archivos sin acceso SSH. Para obtener más información sobre este proceso, consulte nuestro tutorial Cómo habilitar SFTP sin acceso de shell.

Si está acostumbrado a utilizar FTP o SCP para realizar sus transferencias, SFTP es una buena forma de aprovechar las ventajas de ambos. Si bien no es adecuado para todas las situaciones, es útil tenerlo en su repertorio por ser una herramienta flexible.

Stephen Dove
Comments

April 18, 2025

Cómo instalar Docker en Ubuntu: guía paso a paso

Introducción

Docker es una aplicación que simplifica la gestión de procesos de aplicaciones en contenedores . Los contenedores permiten ejecutar aplicaciones en procesos con recursos aislados. Son similares a las máquinas virtuales, pero son más portátiles, consumen menos recursos y dependen más del sistema operativo host.

Para obtener una introducción detallada a los diferentes componentes de un contenedor Docker, consulte El ecosistema de Docker: una introducción a los componentes comunes .

En este tutorial, instalarás y usarás Docker Community Edition (CE) en Ubuntu. Instalarás Docker, trabajarás con contenedores e imágenes, y subirás una imagen a un repositorio de Docker. Además, aprenderás a iniciar, detener y eliminar contenedores, así como a confirmar los cambios de un contenedor en una nueva imagen de Docker. Este tutorial también explica cómo instalar Docker con compatibilidad con GPU, errores comunes y cómo solucionarlos, y las mejores prácticas de seguridad.

Implemente directamente desde GitHub en minutos.

Prerrequisitos

Para seguir este tutorial, necesitarás lo siguiente:

  • Un servidor Ubuntu configurado siguiendo la guía de configuración inicial del servidor Ubuntu , incluido un usuario sudono root y un firewall.
  • Una cuenta en Docker Hub si desea crear sus propias imágenes y enviarlas a Docker Hub, como se muestra en los pasos 7 y 8.

Paso 1: Instalación de Docker

El paquete de instalación de Docker disponible en el repositorio oficial de Ubuntu podría no ser la última versión. Para asegurarnos de obtener la última versión, instalaremos Docker desde el repositorio oficial. Para ello, añadiremos una nueva fuente de paquete, añadiremos la clave GPG de Docker para garantizar que las descargas sean válidas y, a continuación, instalaremos el paquete.

Primero, actualice su lista existente de paquetes:

sudo apt update

A continuación, instale algunos paquetes de requisitos previos que permitan aptutilizar paquetes a través de HTTPS:

sudo apt install apt-transport-https ca-certificates curl software-properties-common

Luego, agregue la clave GPG del repositorio oficial de Docker a su sistema:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

Agregue el repositorio de Docker a las fuentes de APT:

echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Actualice nuevamente su lista existente de paquetes para que se reconozca la adición:

sudo apt update

Asegúrate de que estás a punto de instalar desde el repositorio de Docker en lugar del repositorio predeterminado de Ubuntu:

apt-cache policy docker-ce

Verá un resultado como este, aunque el número de versión de Docker puede ser diferente: Salida de la política apt-cache docker-ce

docker-ce:
  Installed: (none)
  Candidate: 5:20.10.14~3-0~ubuntu-jammy
  Version table:
     5:20.10.14~3-0~ubuntu-jammy 500
        500 https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages
     5:20.10.13~3-0~ubuntu-jammy 500
        500 https://download.docker.com/linux/ubuntu jammy/stable amd64 Packages

Tenga en cuenta que docker-ceno está instalado, pero el candidato para la instalación es del repositorio Docker para Ubuntu.

Por último, instala Docker:

sudo apt install docker-ce

Docker ya debería estar instalado, el demonio iniciado y el proceso habilitado para iniciarse al arrancar. Compruebe que se esté ejecutando:

sudo systemctl status docker

La salida debería ser similar a la siguiente, mostrando que el servicio está activo y en ejecución:

Output● docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
     Active: active (running) since Fri 2022-04-01 21:30:25 UTC; 22s ago
TriggeredBy: ● docker.socket
       Docs: https://docs.docker.com
   Main PID: 7854 (dockerd)
      Tasks: 7
     Memory: 38.3M
        CPU: 340ms
     CGroup: /system.slice/docker.service
             └─7854 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

Al instalar Docker ahora, no solo obtendrá el servicio Docker (daemon), sino también la utilidad de línea de comandos o el cliente Docker. Más adelante en este tutorial, dockerveremos cómo usar el comando.docker

Paso 2: Ejecutar el comando Docker sin sudo (opcional)

De forma predeterminada, el dockercomando solo puede ser ejecutado por el usuario root o por un usuario del grupo Docker , que se crea automáticamente durante la instalación de Docker. Si intenta ejecutar el dockercomando sin prefijarlo con sudoo sin pertenecer al grupo Docker , obtendrá un resultado como este:

Outputdocker: Cannot connect to the Docker daemon. Is the docker daemon running on this host?.
See 'docker run --help'.

Si desea evitar escribir sudocada vez que ejecuta el dockercomando, agregue su nombre de usuario al dockergrupo:

sudo usermod -aG docker ${USER}

Para aplicar la nueva membresía del grupo, cierre la sesión del servidor y vuelva a iniciarla, o escriba lo siguiente:

su - ${USER}

Se le pedirá que ingrese su contraseña de usuario para continuar.

Confirme que su usuario ahora está agregado al grupo Docker escribiendo:

groups
Outputsammy sudo docker

Si necesita agregar un usuario al dockergrupo con el que no ha iniciado sesión, declare ese nombre de usuario explícitamente usando:

sudo usermod -aG docker username

El resto de este artículo asume que está ejecutando el dockercomando como usuario del grupo Docker . Si no lo hace, anteponga “<nombre del usuario>” a los comandos sudo.

Exploremos el dockercomando a continuación.

Paso 3: Uso del comando Docker

Usar dockerconsiste en pasarle una cadena de opciones y comandos seguidos de argumentos. La sintaxis es la siguiente:

docker [option] [command] [arguments]

Para ver todos los subcomandos disponibles, escriba:

docker

A partir de la versión de Docker20.10.14La lista completa de subcomandos disponibles incluye:

Output  attach      Attach local standard input, output, and error streams to a running container
  build       Build an image from a Dockerfile
  commit      Create a new image from a container's changes
  cp          Copy files/folders between a container and the local filesystem
  create      Create a new container
  diff        Inspect changes to files or directories on a container's filesystem
  events      Get real time events from the server
  exec        Run a command in a running container
  export      Export a container's filesystem as a tar archive
  history     Show the history of an image
  images      List images
  import      Import the contents from a tarball to create a filesystem image
  info        Display system-wide information
  inspect     Return low-level information on Docker objects
  kill        Kill one or more running containers
  load        Load an image from a tar archive or STDIN
  login       Log in to a Docker registry
  logout      Log out from a Docker registry
  logs        Fetch the logs of a container
  pause       Pause all processes within one or more containers
  port        List port mappings or a specific mapping for the container
  ps          List containers
  pull        Pull an image or a repository from a registry
  push        Push an image or a repository to a registry
  rename      Rename a container
  restart     Restart one or more containers
  rm          Remove one or more containers
  rmi         Remove one or more images
  run         Run a command in a new container
  save        Save one or more images to a tar archive (streamed to STDOUT by default)
  search      Search the Docker Hub for images
  start       Start one or more stopped containers
  stats       Display a live stream of container(s) resource usage statistics
  stop        Stop one or more running containers
  tag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
  top         Display the running processes of a container
  unpause     Unpause all processes within one or more containers
  update      Update configuration of one or more containers
  version     Show the Docker version information
  wait        Block until one or more containers stop, then print their exit codes

Para ver las opciones disponibles para un comando específico, escriba:

docker docker-subcommand --help

Para ver información de todo el sistema sobre Docker, utilice:

docker info

Exploremos algunos de estos comandos. Empezaremos trabajando con imágenes.

Paso 4: Trabajar con imágenes de Docker

Los contenedores Docker se crean a partir de imágenes de Docker. Por defecto, Docker obtiene estas imágenes de Docker Hub , un registro de Docker gestionado por Docker, la empresa responsable del proyecto Docker. Cualquiera puede alojar sus imágenes de Docker en Docker Hub, por lo que la mayoría de las aplicaciones y distribuciones de Linux que necesite tendrán imágenes alojadas allí.

Para comprobar si puede acceder y descargar imágenes desde Docker Hub, escriba:

docker run hello-world

La salida indicará que Docker funciona correctamente:

OutputUnable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256:bfea6278a0a267fad2634554f4f0c6f31981eea41c553fdf5a83e95a41d40c38
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

...

Inicialmente, Docker no pudo encontrar la hello-worldimagen localmente, por lo que la descargó de Docker Hub, el repositorio predeterminado. Una vez descargada, Docker creó un contenedor a partir de ella y la aplicación dentro del contenedor se ejecutó, mostrando el mensaje.

Puedes buscar imágenes disponibles en Docker Hub usando el dockercomando con el searchsubcomando. Por ejemplo, para buscar la imagen de Ubuntu, escribe:

docker search ubuntu

El script rastreará Docker Hub y devolverá una lista de todas las imágenes cuyo nombre coincida con la cadena de búsqueda. En este caso, el resultado será similar a este:

OutputNAME                             DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
ubuntu                           Ubuntu is a Debian-based Linux operating sys…   14048     [OK]
websphere-liberty                WebSphere Liberty multi-architecture images …   283       [OK]
ubuntu-upstart                   DEPRECATED, as is Upstart (find other proces…   112       [OK]
neurodebian                      NeuroDebian provides neuroscience research s…   88        [OK]
open-liberty                     Open Liberty multi-architecture images based…   51        [OK]
...

En la columna OFICIAL , OK indica una imagen creada y respaldada por la empresa responsable del proyecto. Una vez identificada la imagen que desea usar, puede descargarla a su computadora con el pullsubcomando.

Ejecute el siguiente comando para descargar la ubuntuimagen oficial a su computadora:

docker pull ubuntu

Verá el siguiente resultado:

OutputUsing default tag: latest
latest: Pulling from library/ubuntu
e0b25ef51634: Pull complete
Digest: sha256:9101220a875cee98b016668342c489ff0674f247f6ca20dfc91b91c0f28581ae
Status: Downloaded newer image for ubuntu:latest
docker.io/library/ubuntu:latest

Tras descargar una imagen, puede ejecutar un contenedor con ella mediante el runsubcomando. Como vio en el hello-worldejemplo, si no se ha descargado una imagen al dockerejecutar el runsubcomando, el cliente Docker primero la descargará y luego ejecutará un contenedor con ella.

Para ver las imágenes que se han descargado en tu ordenador, escribe:

docker images

El resultado será similar al siguiente:

OutputREPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              1d622ef86b13        3 weeks ago         73.9MB
hello-world         latest              bf756fb1ae65        4 months ago        13.3kB

Como verá más adelante en este tutorial, las imágenes que utiliza para ejecutar contenedores se pueden modificar y usar para generar nuevas imágenes, que luego pueden cargarse ( el término técnico es “push “) en Docker Hub u otros registros de Docker.

Veamos cómo ejecutar contenedores con más detalle.

Paso 5: Ejecución de un contenedor Docker

El hello-worldcontenedor que ejecutaste en el paso anterior es un ejemplo de un contenedor que se ejecuta y finaliza tras emitir un mensaje de prueba. Los contenedores pueden ser mucho más útiles y pueden ser interactivos. Al fin y al cabo, son similares a las máquinas virtuales, solo que consumen menos recursos.

A modo de ejemplo, ejecutemos un contenedor con la imagen más reciente de Ubuntu. La combinación de las opciones -i y -t proporciona acceso interactivo al contenedor a través del shell:

docker run -it ubuntu

El símbolo del sistema debería cambiar para reflejar el hecho de que ahora está trabajando dentro del contenedor y debería adoptar este formato:

Outputroot@d9b100f2f636:/#

Anote el ID del contenedor en el símbolo del sistema. En este ejemplo, es d9b100f2f636. Necesitará ese ID más adelante para identificar el contenedor cuando desee eliminarlo.

Ahora puedes ejecutar cualquier comando dentro del contenedor. Por ejemplo, actualicemos la base de datos de paquetes dentro del contenedor. No necesitas prefijar ningún comando con sudo, ya que estás operando dentro del contenedor como usuario root :

apt update

Luego, instala cualquier aplicación. Instalemos Node.js:

apt install nodejs

Esto instala Node.js en el contenedor desde el repositorio oficial de Ubuntu. Al finalizar la instalación, verifique que Node.js esté instalado:

node -v

Verás el número de versión mostrado en tu terminal:

Outputv12.22.9

Cualquier cambio que realice dentro del contenedor sólo se aplicará a ese contenedor.

Para salir del contenedor, escriba exiten el aviso.

A continuación veamos cómo administrar los contenedores en nuestro sistema.

Paso 6: Administrar contenedores Docker

Después de usar Docker durante un tiempo, tendrás muchos contenedores activos (en ejecución) e inactivos en tu equipo. Para ver los activos , usa:

docker ps

Verá un resultado similar al siguiente:

OutputCONTAINER ID        IMAGE               COMMAND             CREATED

En este tutorial, iniciaste dos contenedores: uno desde la hello-worldimagen y otro desde la ubuntuimagen. Ambos contenedores ya no se ejecutan, pero aún existen en tu sistema.

Para ver todos los contenedores (activos e inactivos), ejecute docker psel -ainterruptor:

docker ps -a

Verá un resultado similar a este:

OutputCONTAINER ID   IMAGE         COMMAND   CREATED         STATUS                     PORTS     NAMES
1c08a7a0d0e4   ubuntu        "bash"     About a minute ago   Exited (0) 7 seconds ago             dazzling_taussig
587000e49d53   hello-world   "/hello"   5 minutes ago        Exited (0) 5 minutes ago             adoring_kowalevski

Para ver el último contenedor que ha creado, pásele el -linterruptor:

docker ps -l
OutputCONTAINER ID   IMAGE     COMMAND   CREATED         STATUS                     PORTS     NAMES
1c08a7a0d0e4   ubuntu    "bash"    3 minutes ago   Exited (0) 2 minutes ago             dazzling_taussig

Para iniciar un contenedor detenido, utilice docker start, seguido del ID o el nombre del contenedor. Iniciemos el contenedor basado en Ubuntu con el ID de 1c08a7a0d0e4:

docker start 1c08a7a0d0e4

El contenedor se iniciará y podrás usar docker pspara ver su estado:

OutputCONTAINER ID   IMAGE     COMMAND   CREATED         STATUS         PORTS     NAMES
1c08a7a0d0e4   ubuntu    "bash"    6 minutes ago   Up 8 seconds             dazzling_taussig

Para detener un contenedor en ejecución, use docker stop, seguido del ID o nombre del contenedor. En esta ocasión, usaremos el nombre que Docker le asignó al contenedor, que es dazzling_taussig:

docker stop dazzling_taussig

Una vez que haya decidido que ya no necesita un contenedor, elimínelo con el docker rmcomando, usando nuevamente el ID o el nombre del contenedor. Use el docker ps -acomando para encontrar el ID o el nombre del contenedor asociado a la hello-worldimagen y elimínelo.

docker rm adoring_kowalevski

Puedes crear un nuevo contenedor y asignarle un nombre con el --namemodificador. También puedes usarlo --rmpara crear un contenedor que se elimine automáticamente al detenerse. Consulta el docker run helpcomando para obtener más información sobre estas y otras opciones.

Los contenedores se pueden convertir en imágenes que puedes usar para crear nuevos contenedores. Veamos cómo funciona.

Paso 7: Confirmar cambios en un contenedor a una imagen de Docker

Al iniciar una imagen de Docker, puedes crear, modificar y eliminar archivos igual que con una máquina virtual. Los cambios que realices solo se aplicarán a ese contenedor. Puedes iniciarlo y detenerlo, pero una vez que lo destruyas con el docker rmcomando, los cambios se perderán definitivamente.

Esta sección le muestra cómo guardar el estado de un contenedor como una nueva imagen de Docker.

Tras instalar Node.js en el contenedor de Ubuntu, tendrás un contenedor que se ejecuta a partir de una imagen, pero este contenedor es diferente de la imagen que usaste para crearlo. Sin embargo, podrías reutilizar este contenedor de Node.js como base para nuevas imágenes más adelante.

Luego, confirme los cambios en una nueva instancia de imagen de Docker usando el siguiente comando.

docker commit -m "What you did to the image" -a "Author Name" container_id repository/new_image_name

El parámetro -m se utiliza para el mensaje de confirmación que te ayuda a ti y a otros a saber qué cambios realizaste, mientras que -a se usa para especificar el autor. container_idEs el que anotaste anteriormente en el tutorial al iniciar la sesión interactiva de Docker. A menos que hayas creado repositorios adicionales en Docker Hub, repositorysuele ser tu nombre de usuario de Docker Hub.

Por ejemplo, para el usuario sammy , con el ID de contenedor de d9b100f2f636, el comando sería:

docker commit -m "added Node.js" -a "sammy" d9b100f2f636 sammy/ubuntu-nodejs

Al confirmar una imagen, esta se guarda localmente en tu ordenador. Más adelante en este tutorial, aprenderás a subir una imagen a un registro de Docker como Docker Hub para que otros usuarios puedan acceder a ella.

Al enumerar nuevamente las imágenes de Docker, se mostrará la nueva imagen, así como la antigua de la que se derivó:

docker images

Verás un resultado como este:

OutputREPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
sammy/ubuntu-nodejs   latest              7c1f35226ca6        7 seconds ago       179MB
...

En este ejemplo, ubuntu-nodejsse muestra la nueva imagen, derivada de la ubuntuimagen existente de Docker Hub. La diferencia de tamaño refleja los cambios realizados. En este ejemplo, el cambio fue la instalación de NodeJS. Así, la próxima vez que necesite ejecutar un contenedor en Ubuntu con NodeJS preinstalado, podrá usar la nueva imagen.

También puedes crear imágenes desde un archivo Dockerfile, lo que te permite automatizar la instalación de software en una nueva imagen. Sin embargo, esto queda fuera del alcance de este tutorial.

Ahora compartamos la nueva imagen con otros para que puedan crear contenedores a partir de ella.

Paso 8: Enviar imágenes de Docker a un repositorio de Docker

El siguiente paso lógico tras crear una imagen a partir de una existente es compartirla con algunos amigos, con todo el mundo en Docker Hub o en otro registro de Docker al que tengas acceso. Para subir una imagen a Docker Hub o a cualquier otro registro de Docker, debes tener una cuenta allí.

Para enviar su imagen, primero inicie sesión en Docker Hub.

docker login -u docker-registry-username

Se te pedirá que te autentiques con tu contraseña de Docker Hub. Si la especificaste correctamente, la autenticación debería ser correcta.

Nota: Si el nombre de usuario del registro de Docker es diferente del nombre de usuario local que usó para crear la imagen, deberá etiquetarla con el nombre de usuario del registro. Para el ejemplo del paso anterior, escriba:

docker tag sammy/ubuntu-nodejs docker-registry-username/ubuntu-nodejs

Luego puedes enviar tu propia imagen usando:

docker push docker-registry-username/docker-image-name

Para enviar la ubuntu-nodejsimagen al repositorio sammy , el comando sería:

docker push sammy/ubuntu-nodejs

El proceso puede tardar algún tiempo en completarse mientras se cargan las imágenes, pero una vez completado, el resultado se verá así:

OutputThe push refers to a repository [docker.io/sammy/ubuntu-nodejs]
e3fbbfb44187: Pushed
5f70bf18a086: Pushed
a3b5c80a4eba: Pushed
7f18b442972b: Pushed
3ce512daaf78: Pushed
7aae4540b42d: Pushed

...


Después de enviar una imagen a un registro, debería aparecer en el panel de su cuenta, como se muestra en la imagen a continuación.

Nueva lista de imágenes de Docker en Docker Hub

Si un intento de inserción da como resultado un error de este tipo, es probable que no haya iniciado sesión:

OutputThe push refers to a repository [docker.io/sammy/ubuntu-nodejs]
e3fbbfb44187: Preparing
5f70bf18a086: Preparing
a3b5c80a4eba: Preparing
7f18b442972b: Preparing
3ce512daaf78: Preparing
7aae4540b42d: Waiting
unauthorized: authentication required

Inicia sesión con docker loginy repite el intento de envío. Luego, verifica que exista en la página del repositorio de Docker Hub.

Ahora puedes usarla para extraer la imagen a una nueva máquina y usarla para ejecutar un nuevo contenedor.docker pull sammy/ubuntu-nodejs

Instalación de Docker con soporte para GPU

Para instalar Docker con compatibilidad con GPU, deberá seguir un proceso ligeramente diferente al de la instalación estándar. Esto se debe a que la compatibilidad con GPU requiere controladores y configuraciones adicionales para que Docker pueda utilizar los recursos de la GPU. Estos son los pasos para instalar Docker con compatibilidad con GPU:

  • Asegúrese de que su sistema tenga una GPU NVIDIA compatible.
  • Instala el controlador NVIDIA para tu GPU. Puedes encontrar las instrucciones de instalación en el sitio web de NVIDIA .
  • Instale el nvidia-docker2paquete, que proporciona las herramientas necesarias para que Docker interactúe con la GPU NVIDIA.

Pasos de instalación

  • Agregue el repositorio Docker de NVIDIA:
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
  • Actualice su lista de paquetes e instale el nvidia-docker2paquete:
sudo apt update && sudo apt install nvidia-docker2
  • Reinicie el servicio Docker para aplicar los cambios:
sudo service docker restart
  • Verifique que el entorno de ejecución de NVIDIA esté disponible:
sudo docker info | grep Runtime

Esto debería mostrar el tiempo de ejecución de NVIDIA como un tiempo de ejecución disponible.

Uso de la compatibilidad con GPU

Para usar la compatibilidad con GPU con tus contenedores Docker, deberás especificar el --gpusindicador al ejecutar el contenedor. Por ejemplo:

sudo docker run --gpus all nvidia/cuda:10.2-base nvidia-smi

Este comando ejecuta un contenedor con la imagen NVIDIA CUDA y ejecuta el nvidia-smicomando para verificar la compatibilidad con la GPU.

Para obtener más información sobre la instalación y el uso de Docker con soporte de GPU, consulte los siguientes recursos:

Si sigue estos pasos y utiliza los recursos proporcionados, podrá instalar y utilizar con éxito Docker con soporte de GPU en su sistema.

Configuración de las mejores prácticas de seguridad de Docker

La seguridad de Docker Engine es crucial para garantizar que sus contenedores y el sistema host estén protegidos contra posibles vulnerabilidades. A continuación, se indican algunas prácticas recomendadas:

  • Utilice el principio de mínimo privilegio : asegúrese de que sus contenedores se ejecuten con los mínimos privilegios necesarios para realizar sus tareas.
  • Utilice un usuario que no sea root : ejecute sus contenedores como un usuario que no sea root para limitar la superficie de ataque en caso de una violación.
  • Mantenga su versión de Docker actualizada : actualice periódicamente su versión de Docker para asegurarse de tener los últimos parches de seguridad.
  • Usar Docker Content Trust : habilite Docker Content Trust para garantizar la integridad de las imágenes que extrae de Docker Hub.
  • Limitar la exposición de la red : exponga únicamente los puertos necesarios a la red para minimizar la superficie de ataque.

Uso de Docker Compose

Docker Compose es una herramienta para definir y ejecutar aplicaciones Docker multicontenedor. Permite definir los servicios que componen la aplicación y cómo interactúan entre sí. Estas son algunas ventajas de usar Docker Compose:

  • Implementación simplificada de aplicaciones : Docker Compose simplifica el proceso de implementación de aplicaciones multicontenedor.
  • Gestión sencilla de servicios : Docker Compose le permite iniciar, detener y escalar sus servicios fácilmente.
  • Control de versiones : los archivos de Docker Compose pueden controlarse por versiones, lo que facilita el seguimiento de los cambios en la configuración de su aplicación.

Eliminación de paquetes de Docker

Eliminar paquetes de Docker es esencial para mantener el sistema y garantizar que tenga instaladas las últimas versiones de Docker. A continuación, se indican algunos pasos a seguir:

  • Enumerar todos los paquetes Docker instalados : utilice el comando dpkg -l | grep dockerpara enumerar todos los paquetes Docker instalados.
  • Eliminar el paquete Docker : utilice el comando sudo apt remove docker-cepara eliminar el paquete Docker.
  • Eliminar dependencias de Docker : use el comando sudo apt autoremovepara eliminar cualquier dependencia que ya no sea necesaria.
  • Actualice su lista de paquetes : use el comando sudo apt updatepara actualizar su lista de paquetes después de eliminar los paquetes de Docker.

Las imágenes, contenedores, volúmenes o archivos de configuración personalizados de su host no se eliminan automáticamente. Para eliminar todas las imágenes, contenedores y volúmenes:

sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd

Eliminar lista de fuentes y llaveros:

sudo rm /etc/apt/sources.list.d/docker.list
sudo rm /etc/apt/keyrings/docker.asc

Errores comunes y depuración

El demonio Docker no se inicia

Si el demonio de Docker no se inicia, puede deberse a varias razones, como problemas de configuración, conflictos con otros servicios o limitaciones de recursos del sistema. Para solucionar este problema, puede que vea mensajes de error como:

OutputFailed to start Docker Application Container Engine.

o

Outputdocker.service: Main process exited, code=exited, status=1/FAILURE

Para resolver este problema:

  1. Compruebe el estado del servicio Docker:sudo systemctl status docker
  2. Revise los registros de Docker para detectar errores:sudo journalctl -u docker
  3. Asegúrese de que el servicio Docker esté habilitado para iniciarse en el arranque:sudo systemctl enable docker
  4. Reinicie el servicio Docker:sudo systemctl restart docker

Errores de permisos al ejecutar comandos de Docker

Los errores de permisos ocurren cuando el usuario que ejecuta comandos de Docker no tiene suficientes privilegios. Para solucionar este problema, puede observar mensajes de error como:

Outputdocker: Cannot connect to the Docker daemon. Is the docker daemon running on this host?.
See 'docker run --help'.

Para resolver este problema:

  1. Asegúrese de que el usuario sea parte del dockergrupo:sudo usermod -aG docker ${USER}
  2. Cierre sesión y vuelva a iniciarla para aplicar los cambios de membresía del grupo
  3. Alternativamente, utilice sudoantes de ejecutar los comandos de Docker:sudo docker <command>

Si sigue estos pasos, debería poder resolver errores comunes relacionados con el demonio Docker que no se inicia y errores de permisos al ejecutar comandos Docker.

Preguntas frecuentes

¿Cómo instalo Docker en Ubuntu 22.04?

Para instalar Docker en Ubuntu , siga estos pasos:

  1. Actualice su lista de paquetes:sudo apt update
  2. Instalar los paquetes necesarios:sudo apt install apt-transport-https ca-certificates curl software-properties-common
  3. Agregue la clave GPG de Docker:curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
  4. Agregue el repositorio de Docker:echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  5. Actualice su lista de paquetes nuevamente:sudo apt update
  6. Instalar Docker:sudo apt install docker-ce

¿Cómo verifico que Docker esté instalado en Ubuntu?

Para verificar que Docker esté instalado en Ubuntu, ejecute el siguiente comando:sudo systemctl status docker

Este comando le mostrará el estado del servicio Docker. Si Docker está instalado y en ejecución, debería ver un resultado que indique que el servicio está activo y en ejecución. A continuación, se muestra un ejemplo de lo que podría ver:

Output● docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
     Active: active (running) since Fri 2025-04-08 21:30:25 UTC; 22s ago
TriggeredBy: ● docker.socket
       Docs: https://docs.docker.com
   Main PID: 7854 (dockerd)
      Tasks: 7
     Memory: 38.3M
        CPU: 340ms
     CGroup: /system.slice/docker.service
             └─7854 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

¿Cómo ejecuto Docker sin sudo?

Para ejecutar Docker sin usar sudo, debes agregar tu usuario al dockergrupo. Así es como se hace:

  1. Añade tu usuario al dockergrupo:sudo usermod -aG docker ${USER}
  2. Cierre sesión y vuelva a iniciarla para aplicar los cambios.

Después de agregar su usuario al dockergrupo, debería poder ejecutar comandos de Docker sin usar sudo.

¿Cómo desinstalo Docker de Ubuntu?

Para desinstalar Docker de Ubuntu , siga estos pasos:

  1. Detener el servicio Docker:sudo systemctl stop docker
  2. Eliminar paquetes de Docker:sudo apt purge docker-ce
  3. Eliminar dependencias de Docker:sudo apt autoremove
  4. Eliminar el repositorio de Docker:sudo rm /etc/apt/sources.list.d/docker.list

Conclusión

En este tutorial, instalaste Docker, trabajaste con imágenes y contenedores, y subiste una imagen modificada a Docker Hub. Ahora que conoces los conceptos básicos, explora. Para configuraciones de Docker más avanzadas, considera los siguientes tutoriales:

Stephen Dove