La Command Line Interface (CLI), habitualmente llamada “consola” o “terminal” es la forma más potente de interactuar con un sistema operativo Linux. Una vez nos familiaricemos con sus comandos podremos trabajar mucho más rápido, y en entornos como los servidores web no vamos a tener una interfaz gráfica en la que apoyarnos.
De ahí que sea imprescindible aprender los básicos de cómo utilizar la CLI en Linux. Ten en cuenta que esta interfaz nos permite realizar prácticamente cualquier tarea. Además, podemos implementar scripts para realizar tareas y procesos repetitivos o tediosos y conectarnos a máquinas en remoto.
Otra ventaja de la CLI es que no varía a través de las diferentes distribuciones, como sí lo hace la GUI. De modo que una vez aprendamos a utilizar la CLI podremos utilizar cualquier sistema Linux.
Los emuladores de terminal
Pese a estar utilizando la GUI, tenemos a nuestra disposición emuladores de terminal, que se comportarán como si estuviéramos accediendo a la máquina directamente desde una terminal de texto.
Cada distribución puede tener su propia terminal, siendo gnome-terminal la que viene incluida en los sistemas con esta GUI. También tenemos disponibles otros emuladores, como xterm, konsole o terminator.
Como ya sabes, podemos acceder a la terminal mediante el shortcut ALT-F2 e introduciendo a continuación el comando correspondiente a nuestro emulador (gnome-terminal, por defecto).
También podemos hacer click derecho en nuestra interfaz gráfica y seleccionar la opción “Open in Terminal”.
Las terminales virtuales
En los entornos gráficos también tenemos la posibilidad de utilizar terminales virtuales (VT por Virtual Terminals). Se trata de terminales a las que podemos acceder pulsando CTRL-ALT-F2, CTRL-ALT-F3, CTRL-ALT-F4 o CTRL-ALT-F5 y que tomarán el control de la pantalla y el teclado.
Las VT no son emuladores de terminal, en el sentido de que podemos tener varias sesiones del emulador abiertas en nuestro dispositivo, pero la terminal virtual ocupará la totalidad del sistema.
Para volver a la GUI podemos pulsar CTRL-ALT-F1.
Comandos básicos
Lo primero que debes entender para utilizar la consola es el sistema de archivos. Ten en cuenta que la terminal opera sobre una ruta. Podemos entender que es “donde estamos” en cada momento.
Con el comando cd podemos cambiar de una ruta a otra. Siempre sabremos la ruta donde nos encontramos porque el emulador la pinta a modo de “cursor”. Sin embargo, podemos utilizar el comando pwd (print working directory) para que la imprima en pantalla.
Algunos de los comandos más básicos que podemos utilizar son los siguientes:
Comando | Función |
cd | Change Directory - Nos permite desplazarnos entre directorios |
ls | List - Ofrece un listado de los directorios y archivos en la ruta actual |
pwd | Print working directory - Imprime el directorio actual |
touch | Crea un archivo |
cat | Lee un archivo |
head | Muestra las primeras líneas de un archivo |
tail | Muestra las últimas líneas de un archivo |
man | Muestra la documentación del CLI |
help | Ofrece ayuda sobre cómo utilizar un comando |
Lo mejor para familiarizarse con el uso de la terminal es probar estos comandos. También hay recursos online que nos pueden ayudar a practicar, como https://cmdchallenge.com/
Las “piezas” de los comandos
Cuando queremos insertar una instrucción en la terminal podemos utilizar una o más “piezas”:
- El comando. Es la pieza básica, ya que da la instrucción al sistema.
- Opciones. Las opciones modifican la instrucción, personalizándola y adaptándola al caso de uso. Se identifican porque llevan uno o dos guiones (normalmente, uno para la versión reducida y dos para la versión completa). Por ejemplo, -v o --version cuando queremos comprobar la versión de un programa.
- Argumentos. Concretan la instrucción, proporcionando por ejemplo una ruta, un criterio de búsqueda, etc.
Dependiendo del comando que utilicemos, podremos usar una o más opciones o argumentos. Hay comandos que no utilizan ni opciones ni argumentos.
sudo
A la hora de gestionar la terminal es importante saber gestionar permisos. Cada archivo o fichero tiene unos permisos asociados, que pueden permitir o bloquear la realización de ciertas acciones a ciertos usuarios.
Si queremos utilizar la terminal como un super-usuario (con todos los permisos disponibles) podemos hacerlo con el prefijo sudo. Normalmente el super usuario (root) se configura durante el proceso de instalación. Pero hay distribuciones donde deberemos configurarlo a mano.
Operaciones básicas
A continuación veremos cómo realizar algunas operaciones básicas a través de la interfaz de línea de comandos. Lo mejor es que hagas pruebas por tu cuenta, porque es imposible que memorices este tipo de operaciones si no las practicas. De hecho, sería idóneo que al menos durante los próximos días utilices estos comandos para realizar las operaciones descritas.
Apagado y reinicio del sistema
Podemos utilizar los comandos shutdown, halt, poweroff y reboot para apagar o reiniciar el sistema. Estos comandos requieren acceso sudo.
Localización de aplicaciones
Podemos utilizar los comandos which o whereis, seguidos del nombre de una aplicación, para localizar su ruta en el sistema (habitualmente /bin, /usr/bin, /sbin, /usr/sbin o /opt).
Acceso a directorios
La navegación entre directorios es una de las operaciones más importantes a realizar desde la terminal. Recuerda que siempre estamos en una ruta determinada, que aparecerá a modo de cursor en la línea activa de la terminal.
Si quieres imprimir la ruta donde te encuentras en pantalla, podrás utilizar el comando pwd.
Para cambiar de directorio utilizaremos el comando cd (change directory). Ten en cuenta que existen algunos atajos a la hora de gestionar rutas:
- . Indica “en el directorio actual”.
- .. Indica “en el directorio inmediatamente superior al actual”.
- ~ Indica “en el directorio del usuario”.
- - Indica “en el directorio en que estuviéramos previamente”.
Es importante controlar la navegación entre directorios. Sin ella no podemos utilizar la CLI. Además, es una competencia básica a la hora de desarrollar cuando utilizamos sistemas modulares.
En este sentido, debemos diferenciar:
- Rutas absolutas. Empiezan en la raíz (“/”).
- Rutas relativas. Empiezan en el directorio de trabajo actual, y nunca llevan la barra al inicio.
Si encontramos una ruta con varias barras seguidas, el sistema ignorará las repetidas. Por ejemplo, //usr///bin es lo mismo que /usr/bin.
Normalmente, es más cómodo utilizar rutas relativas, aunque la ventaja de las rutas absolutas es que no cambiarán mientras la estructura de archivos persista, lo que nos permitiría acceder al recurso desde cualquier sitio siempre con la misma ruta.
Exploración del sistema de archivos
En la anterior lección vimos cómo utilizar nautilus para explorar el sistema de archivos. Ahora estamos en la CLI y, por tanto, no tenemos una interfaz gráfica que nos ayude con esta tarea. Sin embargo, sí tenemos una colección de comandos útiles:
- ls. Lista los contenidos del directorio de trabajo. Con la opción -a podemos forzarle a listar también los archivos y directorios ocultos.
- tree. Lista un diagrama de vista de árbol del sistema de archivos. Con la opción -d podemos forzarle a listar solo los directorios.
Otro comando de utilidad es df, procedente de disk filesystem, que nos arrojará información del espacio disponible y utilizado en la máquina.
El histórico
Ten en cuenta que a la hora de navegar por el sistema vamos elaborando un histórico. Como se ha comentado previamente, puedes volver al directorio de trabajo previo utilizando el comando cd -
Si quieres que tu histórico sea más largo, puedes navegar entre directorios utilizando pushd. Posteriormente, podrás ir dando pasos atrás con el comando popd.
Symbolic Links o symlinks
Los Symbolic Links funcionan como accesos directos. Podemos asociar diferentes nombres en diferentes rutas para el mismo fichero. Los creamos utilizando el comando ln, seguido del fichero objetivo y de la ruta para el acceso directo:
ln <original file> <destination path>
Tenemos dos tipos de symbolic links:
- Hard links. Nos ayudan a ahorrar espacio evitando copias de archivos, pero debemos tener cuidado a la hora de eliminar el archivo o su acceso directo para no dejar el link huérfano.
- Soft links. Se crean con la opción -s. Al contrario que el hard link, no es un archivo en sí mismo, sino simplemente una referencia al inodo que almacena la información en el disco duro. Además, pueden acceder a objetos en otros filesystems, particiones o discos, e incluso a información todavía inexistente o no disponible.
Trabajando con la CLI: archivos
La CLI pone a nuestra disposición diferentes comandos básicos para trabajar con archivos:
- cat - lee archivos (sin scroll-back)
- tac - lee archivos desde la última línea
- less - lee archivos de forma paginada. Con la opción -N numera las líneas. Podemos navegar por el archivo con las teclas abajo o espacio, y salir con la tecla q.
- tail - imprime las 10 últimas líneas de un archivo (se puede configurar el número de líneas con la opción -n)
- head - imprime las 10 primeras líneas de un archivo.
- wc - Word Count - informa del número de palabras en un archivo.
Creación de archivos
Si lo que necesitamos es crear un archivo, podemos utilizar el comando touch, seguido de su ruta. Este comando está ideado para modificar el timestamp de un archivo, por lo que incluye funcionalidades para ello.
Otra opción sería utilizar el comando echo > <nombre del archivo>.
Otras operaciones con archivos
La CLI también nos permite mover un archivo mediante el comando mv <ruta al archivo original> <ruta de destino>. Si la ruta de destino está en el mismo directorio, podemos utilizar mv para renombrar el archivo.
Para eliminar un archivo podemos utilizar el comando rm, que además acepta varias opciones como una eliminación interactiva (-i) o eliminación forzosa (-f).
Por último, podemos copiar un archivo con el comando cp <ruta del archivo original> <ruta del archivo de destino>.
Trabajando con directorios
Si lo que queremos crear es un directorio, podemos hacerlo con el comando mkdir (make directory) seguido de su ruta. Con la opción -p nos permite crear directorios anidados y evitar errores si el directorio ya existe.
Siempre que el directorio esté vacío podremos eliminarlo con rmdir (remove directory). Por contra, necesitaremos ejecutar rm -rf cuando el directorio no esté vacío, para eliminar su contenido recursivamente.
Cuidado con estos comandos, porque podríamos eliminar el sistema entero si así lo solicitamos.
Buscando archivos
A la hora de buscar archivos en el sistema podemos utilizar dos programas, principalmente:
- locate
- find
Pero para poder sacarles el máximo partido es importante que antes entendamos cómo funcionan los standard file streams y los pipes.
Un stream representa un flujo de datos. Su característica principal es que permite que se empiece a trabajar con ellos sin necesidad de que haya concluido la operación anterior o se haya terminado de leer el archivo. El ejemplo más frecuente es el streaming de vídeo en cualquier red social.
Los standard file streams
El sistema cuenta con tres streams utilizables:
- Standard Input. stdin, valor 0. Ejemplo: teclado.
- Standard Output. stdout, valor 1. Ejemplo: terminal.
- Standard Error. stderr, valor 2. Ejemplo: archivo de registro.
Estos streams son archivos que se pueden utilizar. De hecho, si abrimos más archivos simultáneamente recibirán el valor simbólico o descriptor de 3 en adelante.
Desde la CLI podemos redirigir estos streams para que puedan recibir un input desde una fuente diferente a nuestro teclado o enviar un output o error a un lugar diferente de la consola.
- Para reasignar el output de un programa utilizamos el símbolo >
- Por ejemplo, cat <archivo de origen> > <archivo de destino> crearía una copia de cat, ya que el output no se dirigiría a la consola, sino a ese nuevo archivo.
- Podemos especificar el stream que queremos utilizar por medio de su valor simbólico. El ejemplo anterior sería equivalente a cat <archivo de origen> 1> <archivo de destino> (nótese que no hay espacio entre el valor simbólico y el signo).
- Para reasignar el input de un programa utilizamos el símbolo <.
- Podemos combinar ambas operaciones.
Pipes
El operador pipe (|) nos permite utilizar el output de un programa como input del siguiente programa. Ejemplo:
<programa 1> | <programa 2>
Esto permite a Linux combinar numerosos programas de reducidas dimensiones en un único comando, capaz de realizar operaciones complejas. Además, tiene la ventaja adicional de que al tratarse de streams, los programas 2 y consecutivos no tienen que esperar a que los anteriores hayan terminado para empezar su ejecución.
La herramienta locate
locate busca en el sistema de archivos entradas que tengan una cadena de texto indicada. El problema es que en ocasiones podemos obtener una lista excesivamente larga, por lo que podemos combinarlo utilizando una pipe con grep, que imprimirá tan solo aquellas líneas que contengan una o más strings proporcionadas.
La herramienta locate funciona sobre una base de datos que podría estar desactualizada, por lo que es posible que tengamos que actualizarla a mano con el comando sudo updatedb.
La herramienta find
El comando find también es útil para encontrar y filtrar archivos. Su estructura básica es:
find <directorio donde comienza la búsqueda> <opciones> <término de búsqueda>
En general, find es una herramienta más sencilla de utilizar, pero a la vez más potente, ya que nos permite utilizar la opción -name para limitar el criterio de búsqueda al nombre del archivo. Además, podemos combinarlo con wildcards si queremos que parte del nombre esté indefinido.
Por ejemplo, si quiero obtener todos los archivos .js del directorio actual puedo lanzar
find . -name “*.js”
En este sentido es útil saber que:
- * hace match con cualquier número de caracteres.
- ? hace match con un caracter.
- [set] hace match con un set de caracteres (s, e, t, en este ejemplo).
- [!set] hace match con los caracteres que no entren en el set.
Otras opciones útiles son:
- iname. Es insensible a mayus/minus.
- not. Invierte la búsqueda
- delete. Elimina los archivos encontrados
- type. Indica qué tipo de recurso buscamos
- d. Busca directorios
- f. Busca ficheros.
- l. Busca enlaces simbólicos.
También se puede buscar por fecha (de creación, acceso o modificación), permisos, propietarios, tamaño del archivo… Además, podemos combinar estas opciones para restringir todavía más los resultados de la búsqueda.
Por último, destacar que mediante la opción -exec podemos lanzar un comando sobre los archivos que cumplan los criterios indicados a find. Podremos utilizar su output con el placeholder {} y deberemos cerrar la instrucción con ;
Ejemplo:
find -name “*.js” -exec rm {} \;
Este comando borraría todos los archivos .js de la ruta actual. También podemos utilizar -ok para seguir la misma lógica pero con confirmación antes de la ejecución de cada comando.
Como ves, el comando find es extremadamente potente y versátil, así que le dedicaremos una entrada especial más adelante.
Instalando aplicaciones
Cada familia Linux tiene su propio gestor de paquetes (Package Management System). Básicamente, un paquete es un conjunto de código que incluye las instrucciones necesarias para que un programa funcione. Gracias al gestor de paquetes podemos instalar, actualizar o eliminar aplicaciones desde la CLI.
Los gestores de paquetes funcionan a dos niveles:
- Bajo nivel, con programas como dpkg o rpm, que se encargan de paquetes individuales.
- Alto nivel, con herramientas como apt, dnf o zypper, que se encargan de grupos de paquetes y dependencias.
Normalmente, podemos interactuar simplemente con las aplicaciones de alto nivel, que gestionan a nivel interno las utilidades de bajo nivel.
Comandos básicos de gestión de paquetes
Operación | rpm | deb |
Instalar un paquete | rpm -i <pack>.rpm | dpkg --install <pack>.deb |
Instalar un paquete y sus dependencias | dnf install <pack> | apt install <pack> |
Eliminar un paquete | rpm -e <pack>.rpm | dpkg --remove <pack>.deb |
Eliminar un paquete y sus dependencias | dnf remove <pack> | apt autoremove <pack> |
Actualizar un paquete | rpm -U <pack>.rpm | dpkg --install <pack>.deb |
Actualizar un paquete y sus dependencias | dnf update <pack> | apt install <pack> |
Actualizar el sistema | dnf update | apt dist-upgrade |
Mostrar los paquetes instalados | rpm -qa dnf list installed | dpkg --list |
Obtener información de u paquete | rpm -quil <pack> | dpkg --listfiles <pack> |
Mostrar paquetes con el nombre “test” | dnf list “test” | apt-cache search test |
Mostrar todos los paquetes disponibles | dnf list | apt-cache dumpaval |
Resumen
- Las terminales virtuales (VT) son consolas que utilizan el teclado y el monitor conectados al sistema. Por su parte, los emuladores de terminales simulan una terminal en una ventana del escritorio.
- Podemos acceder a las VT y movernos entre ellas con las teclas CTRL-ALT-F2, CTRL-ALT-F3, CTRL-ALT-F4 y CTRL-ALT-F5.
- Podemos volver a la GUI con las teclas CTRL-ALT-F1.
- Podemos conectarnos a un sistema Linux desde su terminal o remotamente, vía SSH.
- Las rutas pueden ser absolutas (si empiezan en la raíz) o relativas (si empiezan en el working directory).
- Las rutas absolutas empiezan con una barra: /
- Las rutas relativas nunca empiezan con una barra. Tenemos shortcuts como ., .., ~ o - para acceder a funcionalidades específicas.
- Por defecto contamos con un stream de entrada, otro de salida y otro de errores. Podemos utilizarlos y reasignarlos para combinar funcionalidades de nuestros programas. También podemos pasar un stream de salida a uno de entrada de un programa a otro por medio del pipe operator |
- El Package Management System se encarga de gestionar paquetes por nosotros. Presenta un nivel bajo (dpkg/rm) para gestionar paquetes individuales y un nivel alto (apt/dnf/zypper) para resolver dependencias.
Comandos y shortcuts
- cd <ruta al nuevo directorio> - cambia de directorio.
- ls - lista el contenido del directorio.
- pwd - muestra el working directory actual.
- touch <nombre del archivo> - crea un archivo.
- cat <nombre del archivo> - lee un archivo.
- head <nombre del archivo> - lee las primeras líneas de un archivo.
- tail <nombre del archivo> - lee las últimas líneas de un archivo.
- man - muestra documentación
- --help - muestra ayuda.
- sudo - activa el super usuario.
- shutdown / halt / poweroff - apagan la máquina.
- reboot - reinicia el sistema.
- which <nombre del programa> - muestra la ruta al programa.
- whereis <nombre del programa> - muestra la ruta al programa.
- tree - lista un diagrama con vista de árbol del filesystem.
- df - muestra el espacio disponible y utilizado.
- pushd - cambia de directorio y guarda el anterior en el historial.
- popd - vuelve al directorio anterior del historial.
- ln - crea un enlace simbólico.
- less - lee un archivo de forma paginada.
- wc - cuenta palabras.
- mv - mueve o renombra un archivo.
- cp - copia un archivo.
- rm - elimina un archivo.
- mkdir - crea un directorio.
- rmdir - elimina un directorio vacío.
- rm -rf - elimina recursivamente un directorio y sus contenidos.
- locate - localiza archivos en el sistema.
- find - localiza archivos en el sistema, con funcionalidades añadidas.