Índice

Introducción a la línea de comandos: 

En el mundo de la informática, hay una herramienta poderosa que a menudo pasa desapercibida para muchos usuarios: la línea de comandos. A diferencia de las interfaces gráficas con las que estamos más familiarizados, la línea de comandos nos permite interactuar con un sistema operativo de manera directa y eficiente, sin necesidad de hacer clics o usar el ratón. En este artículo, te introduciremos al fascinante mundo de la línea de comandos y te mostraremos cómo puede facilitar tus tareas diarias en la computadora.

¿Qué es la línea de comandos?

La línea de comandos es una interfaz de texto que te permite comunicarte con un sistema operativo a través de comandos escritos en un lenguaje específico. Aunque puede parecer intimidante al principio, una vez que comprendas los conceptos básicos, descubrirás que es una forma eficiente y rápida de realizar diversas tareas en tu computadora.

Ventajas de la línea de comandos

Aunque estamos acostumbrados a las interfaces gráficas, la línea de comandos tiene varias ventajas que la hacen atractiva para muchos usuarios:

  1. Eficiencia: Con la línea de comandos, puedes ejecutar comandos de forma rápida y precisa, sin la necesidad de navegar a través de menús o hacer múltiples clics.

  2. Automatización: Mediante scripts y programas, puedes automatizar tareas repetitivas y ahorrar tiempo en tus actividades diarias.

  3. Acceso remoto: La línea de comandos te permite acceder y controlar sistemas remotos de forma segura, incluso a través de una conexión de red.

  4. Potencia y flexibilidad: La línea de comandos ofrece una amplia gama de comandos y herramientas, lo que te brinda un mayor control sobre el sistema operativo y sus funciones.

Consola, Terminal y Shell

En el mundo de la informática, especialmente en el entorno de Linux, es común encontrarse con los términos «consola», «terminal» y «shell». A primera vista, estos conceptos pueden resultar confusos o intercambiables, pero en realidad cada uno tiene un significado y una función específicos. En este artículo, exploraremos qué son la consola, el terminal y el shell, y cuáles son las diferencias entre ellos.

¿Qué es una Consola?

La consola es un dispositivo físico que se utiliza para proporcionar acceso a un sistema operativo mediante texto. Es el entorno en el que se pueden ejecutar comandos y recibir respuestas o resultados en forma de texto. La consola se basa en un ambiente de línea de comandos y se utiliza para interactuar directamente con el sistema operativo sin una interfaz gráfica.

La función principal de la consola es permitir al usuario ingresar comandos y recibir la salida correspondiente del sistema operativo. Es un entorno potente y flexible que ofrece un control completo sobre el sistema y la posibilidad de realizar tareas avanzadas de administración y configuración.

Actualmente, existen las llamadas consolas virtuales, lo que significa que la consola puede ser completamente un software. Además, es bastante común que, en el aspecto práctico, no se establezcan diferencias entre consola y terminal.

¿Qué es una Terminal?

El terminal es una aplicación. Es una interfaz gráfica que simula una consola en una ventana en la que se pueden escribir y ejecutar comandos. El terminal proporciona una forma más conveniente y visual de interactuar con la consola. La función principal del terminal es proporcionar una interfaz gráfica para acceder y utilizar la consola. A través del terminal, los usuarios pueden ingresar comandos utilizando el teclado y recibir la salida correspondiente en la ventana del terminal. Además, el terminal ofrece características como la capacidad de desplazarse por el historial de comandos, copiar y pegar texto, y personalizar la apariencia. En Kali Linux por ejemplo, una distribución especializada en seguridad informática y pruebas de penetración, las terminales más utilizadas son:
  1. GNOME Terminal: Es el emulador de terminal predeterminado en Kali Linux, basado en el entorno de escritorio GNOME. Proporciona una interfaz gráfica intuitiva y diversas características, como pestañas, división de pantalla y personalización.
  2. Konsole: Es la terminal predeterminada del entorno de escritorio KDE, que también está disponible en Kali Linux. Ofrece una interfaz potente y altamente configurable, con soporte para pestañas, división de paneles y perfiles personalizados.
  3. Terminator: Es un emulador de terminal avanzado que permite dividir la ventana en múltiples paneles, lo que facilita la ejecución de varios comandos simultáneamente. También ofrece características adicionales como búsqueda de texto, reorganización de paneles y personalización de colores y fuentes.
  4. Tilix: Es una terminal moderna y personalizable que ofrece características avanzadas, como el uso de pestañas, división de paneles y diseño flexible de la interfaz. Tilix permite guardar y restaurar sesiones, lo que es útil cuando se trabaja en proyectos o tareas específicas.
  5. Xterm: Es una terminal minimalista y ligera, que se enfoca en la simplicidad y en el cumplimiento de los estándares. Aunque carece de algunas características avanzadas, es una opción popular en Kali Linux debido a su eficiencia y rendimiento.
  •  Abrir Terminal en Linux

Para abrir la terminal podemos hacerlo de diversas formas, una es dirigirnos al icono que se encuentra arriba a la izquierda y buscar el icono de la terminal y otra forma, es abrir la barra de búsqueda de Linux, escribir Terminal y nos aparecerá el mismo icono que antes. Y finalmente podemos abrir la terminal mediante su atajo de teclado. Los atajos de teclado son teclas predefinidas con una función, abrir un programa, ejecutar una acción, etc. En este caso pulsado Ctrl + Alt + T no se abrirá la terminal.

¿Qué es una Shell?

En el ámbito informático, una shell es un intérprete de comandos que proporciona una interfaz de línea de comandos para interactuar con el sistema operativo y sus programas. La shell se ejecuta en la terminal o consola, y permite al usuario ingresar comandos y recibir la respuesta del sistema. La shell es una capa intermedia entre el usuario y el núcleo del sistema operativo. Cuando el usuario ingresa un comando, la shell lo interpreta y lo ejecuta en el sistema operativo. La shell también puede proporcionar funciones adicionales, como la capacidad de redirigir la entrada y salida de los comandos, o la capacidad de utilizar variables y scripts para automatizar tareas comunes. Existen varias shells disponibles en el mundo del software libre y de código abierto, como Bash, Zsh, Fish, Ksh, y Tcsh, entre otras. Cada una tiene sus propias características y ventajas, y los usuarios pueden elegir la que mejor se adapte a sus necesidades y preferencias.

Diferencias entre Consola, Terminal y Shell

Cuando se habla de la línea de comandos y el entorno de trabajo en sistemas operativos basados en Unix, es común escuchar los términos «terminal», «consola» y «shell». Aunque a menudo se utilizan indistintamente, cada uno tiene un significado específico y desempeña un papel único en el funcionamiento del sistema. En este artículo, exploraremos las diferencias y la relación entre estos conceptos clave. La terminal, en su sentido más básico, es una interfaz de texto que nos permite interactuar con el sistema operativo a través de comandos. Proporciona un entorno en el que podemos escribir y ejecutar comandos, ver la salida de los programas y recibir respuestas del sistema. La terminal suele ser una ventana o un emulador que muestra un prompt o indicador donde podemos escribir nuestros comandos. Ejemplos comunes de terminales son GNOME Terminal, Konsole y Xterm. La consola, por otro lado, es un dispositivo físico o virtual que se utiliza para acceder al sistema operativo mediante una interfaz de texto. Históricamente, se refería a un teletipo o una pantalla y un teclado conectados directamente a un sistema informático. Hoy en día, la consola se refiere más a menudo a una conexión remota o una ventana que proporciona acceso a la línea de comandos. La consola puede ser una terminal física conectada a un servidor o una ventana de emulación de terminal en un entorno de escritorio. En resumen, la consola es el medio a través del cual interactuamos con la terminal y enviamos comandos al sistema. El shell es el programa que interpreta los comandos que ingresamos en la terminal y los ejecuta. Es una interfaz de software entre el usuario y el núcleo del sistema operativo. El shell toma los comandos escritos en la terminal y los traduce en instrucciones que el sistema operativo puede entender y ejecutar. Además de interpretar comandos, el shell también puede manejar variables, scripts, automatización y otras funcionalidades avanzadas. En sistemas basados en Unix, el shell más común es el Bourne Shell (sh), pero también existen otros como Bash, Zsh y Fish, cada uno con sus propias características y mejoras. En resumen, la terminal es la interfaz de usuario en la que interactuamos con el sistema operativo, la consola es el medio a través del cual accedemos a la terminal, y el shell es el programa que interpreta y ejecuta los comandos que ingresamos en la terminal. La terminal y la consola están estrechamente relacionadas, ya que la consola proporciona el acceso a la terminal, y la terminal a su vez utiliza el shell para interpretar los comandos. Comprender estas diferencias y relaciones es fundamental para trabajar eficientemente en la línea de comandos y aprovechar al máximo su potencial.

Resumen de las principales diferencias:

  • La consola es un entorno de línea de comandos que permite interactuar directamente con el sistema operativo, mientras que el terminal es una interfaz gráfica que brinda acceso a la consola.
  • La consola y el terminal son entornos, mientras que el shell es el programa que interpreta y ejecuta los comandos.

Archivos y Directorios

Uno de los aspectos fundamentales de cualquier sistema operativo es la gestión de archivos y directorios. En el caso de Linux, este sistema operativo de código abierto, es esencial entender cómo se estructuran y funcionan estos conceptos para aprovechar al máximo su potencial. En este artículo, exploraremos qué son los archivos y directorios en Linux, su estructura y función, y lo esencial que debemos saber sobre ellos.

Archivos en Linux

En Linux, un archivo es una unidad básica de almacenamiento de información. Puede contener cualquier tipo de datos, ya sea texto, imágenes, música, programas ejecutables, entre otros. A diferencia de otros sistemas operativos, en Linux, todo se trata como un archivo, incluso los dispositivos de hardware.

Cada archivo en Linux tiene un nombre único que lo identifica y se encuentra organizado en una estructura jerárquica de directorios. Los archivos se pueden crear, modificar, copiar, mover y eliminar utilizando comandos de la línea de comandos o mediante interfaces gráficas.

Los archivos en Linux se clasifican en diferentes tipos según su contenido y cómo se pueden utilizar. Algunos tipos comunes de archivos incluyen:

  • Archivos de texto: Contienen información en formato de texto sin formato y se pueden leer y editar con editores de texto como Vim o Nano. 
  • Archivos binarios: Contienen información en un formato específico y generalmente no son legibles directamente por humanos. Incluyen programas ejecutables y archivos de bibliotecas compartidas (.so).
  • Archivos de configuración: Almacenan configuraciones específicas del sistema o de aplicaciones, como el archivo de configuración de red (/etc/network/interfaces) o el archivo de configuración de Apache (/etc/apache2/apache2.conf).
  • Archivos de dispositivo: Representan dispositivos de hardware, como discos duros (/dev/sda) o impresoras (/dev/lp0).
  • Archivos de enlace simbólico: Son referencias a otros archivos o directorios. Actúan como «atajos» para acceder a un archivo o directorio ubicado en otra ubicación del sistema.

Directorios en Linux

Los directorios en Linux son contenedores utilizados para organizar y estructurar los archivos en el sistema de archivos. Siguen una estructura jerárquica en forma de árbol, comenzando desde el directorio raíz, representado por una barra (/). Cada directorio puede contener archivos y subdirectorios.

Algunos directorios importantes en Linux incluyen:

  • /: Directorio raíz. Contiene todos los archivos y directorios del sistema.
  • /bin: Contiene los archivos ejecutables fundamentales para el sistema.
  • /home: Directorio principal de los usuarios, donde cada usuario tiene su propio subdirectorio para almacenar archivos personales.
  • /etc: Almacena archivos de configuración del sistema y de las aplicaciones.
  • /var: Contiene archivos variables, como registros de sistema, archivos de correo y datos de aplicaciones en ejecución.
  • /tmp: Directorio para almacenar archivos temporales.
  • /dev: Contiene archivos de dispositivo que representan dispositivos de hardware y virtuales.
  • /usr: Contiene programas, bibliotecas y archivos de datos para usuarios.
  • /root: Directorio de inicio del usuario root, el superusuario del sistema.

Navegación y manipulación de archivos y directorios

A través de comandos simples pero poderosos, podemos explorar la estructura de directorios, crear, copiar, mover y eliminar archivos y directorios, entre otras operaciones. En este curso, aprenderemos las principales herramientas y técnicas para la navegación y manipulación de archivos y directorios en un nivel básico.

Navegación de directorios

La navegación por los directorios en Linux se realiza utilizando el comando cd (change directory). Con cd, podemos movernos de un directorio a otro dentro del sistema de archivos. A continuación, se presentan algunas técnicas clave:
  • Navegación relativa: Podemos cambiar al directorio actualmente contenido en el directorio actual utilizando «cd .". Para subir un nivel y acceder al directorio padre, utilizamos «cd ..«. Por ejemplo, si estamos en el directorio /home/usuario/documentos y queremos acceder al directorio padre /home/usuario, simplemente ingresamos «cd ..«.
  • Navegación absoluta: Podemos cambiar directamente a un directorio específico utilizando la ruta absoluta desde el directorio raíz. Por ejemplo, si deseamos acceder al directorio /var/log, ingresamos cd /var/log.
  • Autocompletar: Linux ofrece una función de autocompletado que facilita la navegación. Cuando estemos escribiendo una ruta o nombre de directorio, podemos presionar la tecla Tab para que el sistema complete automáticamente el nombre si es único. Si hay múltiples opciones, al presionar Tab dos veces se mostrarán todas las opciones disponibles.
  • Directorio personal: El directorio personal del usuario se puede acceder utilizando cd sin ningún argumento. Por ejemplo, «cd» nos llevará directamente al directorio personal (/home/usuario).

Listado de archivos y directorios

El comando `ls` (list) se utiliza para listar los archivos y directorios en un directorio específico. Veamos algunas opciones útiles:
  • Listado simple: Simplemente ingresamos `ls` para obtener una lista básica de archivos y directorios en el directorio actual.
  • Listado detallado: Utilizamos `ls -l` para obtener un listado detallado que muestra información adicional, como permisos, propietario, tamaño y fecha de modificación.
  • Listado de todos los archivos: Para mostrar todos los archivos, incluidos los ocultos (los que comienzan con un punto), utilizamos `ls -a`.
  • Listado ordenado por fecha: Podemos obtener una lista ordenada por fecha y hora de modificación utilizando `ls -lt`.

Creación y eliminación de archivos y directorios

En Linux, podemos crear y eliminar archivos y directorios de manera sencilla. A continuación, se describen los comandos más utilizados:
  • Crear un directorio: Utilizamos el comando mkdir (make directory) seguido del nombre del directorio que deseamos crear. Por ejemplo, para crear un directorio llamado «nuevo_directorio», ingresamos `mkdir nuevo_directorio`.
  • Crear un archivo: Podemos crear un archivo vacío utilizando el comando touch seguido del nombre del archivo. Por ejemplo, para crear un archivo llamado «nuevo_archivo.txt», ingresamos `touch nuevo_archivo.txt`.
  • Eliminar un directorio: Utilizamos el comando rmdir (remove directory) seguido del nombre del directorio que deseamos eliminar. Es importante tener en cuenta que el directorio debe estar vacío para poder eliminarlo con este comando. Por ejemplo, para eliminar el directorio «nuevo_directorio», ingresamos `rmdir nuevo_directorio`.
  • Eliminar un archivo: Utilizamos el comando rm (remove) seguido del nombre del archivo que deseamos eliminar. Por ejemplo, para eliminar el archivo «nuevo_archivo.txt», ingresamos `rm nuevo_archivo.txt`. Ten en cuenta que la eliminación de archivos es irreversible, por lo que debes tener cuidado al utilizar este comando.
  • Eliminación recursiva: Si deseamos eliminar un directorio y todos sus contenidos de forma recursiva, utilizamos el comando rm -r seguido del nombre del directorio. Por ejemplo, para eliminar el directorio «directorio_principal» y todos sus archivos y subdirectorios, ingresamos `rm -r directorio_principal`. Ten precaución al utilizar este comando, ya que no se solicitará confirmación antes de eliminar los archivos.

Copia y movimiento de archivos y directorios

En Linux, podemos copiar y mover archivos y directorios utilizando los siguientes comandos:
  • Copiar un archivo: Utilizamos el comando cp (copy) seguido del nombre del archivo de origen y el nombre del archivo de destino. Por ejemplo, para copiar el archivo «archivo_origen.txt» en el archivo «archivo_destino.txt», ingresamos `cp archivo_origen.txt archivo_destino.txt`.
  • Copiar un directorio: Para copiar un directorio y todo su contenido, utilizamos el comando «cp -r» seguido del nombre del directorio de origen y el nombre del directorio de destino. Por ejemplo, para copiar el directorio «directorio_origen» en el directorio «directorio_destino», ingresamos `cp -r directorio_origen directorio_destino`.
  • Mover un archivo: Utilizamos el comando mv (move) seguido del nombre del archivo de origen y la ubicación de destino. Por ejemplo, para mover el archivo «archivo.txt» al directorio «directorio_destino», ingresamos `mv archivo.txt directorio_destino`.
  • Mover un directorio: Para mover un directorio y todo su contenido, utilizamos el comando mv seguido del nombre del directorio de origen y la ubicación de destino. Por ejemplo, para mover el directorio «directorio_origen» al directorio «directorio_destino», ingresamos `mv directorio_origen directorio_destino`.
 

Gestión de permisos y propietarios

Si hay un aspecto que destaca de Linux respecto a otros sistemas, como Windows, es la seguridad. Y no solo hablamos de vulnerabilidades y privacidad, sino también de la forma en la que gestiona los archivos personales de sus usuarios.
 
Cada archivo y directorio en el sistema Linux tiene un conjunto de permisos y un propietario asignado. Estos permisos determinan qué acciones pueden realizar diferentes usuarios en relación con un archivo o directorio específico.
 

El sistema de archivos que utiliza Linux es mucho más avanzado, y a la vez sencillo, que el que utilizan otros sistemas, como Windows. Este se basa en especificar si el propietario, el grupo de usuarios o cualquiera, puede leer, escribir o ejecutar el archivo. Sin duda, es una forma muy eficaz de mantener a cada usuario del sistema controlado, evitando que este pueda acceder a los datos de los demás sin permiso.

Permisos en Linux

En Linux, los permisos se dividen en tres categorías: propietario, grupo y otros. Cada categoría tiene tres tipos de permisos: lectura (r), escritura (w) y ejecución (x). A continuación, se muestra cómo se representan los permisos en Linux:

  • Lectura (r): Permite ver el contenido de un archivo o listar el contenido de un directorio.
  • Escritura (w): Permite modificar o eliminar un archivo, y crear, modificar o eliminar archivos dentro de un directorio.
  • Ejecución (x): Permite ejecutar un archivo como programa o acceder a un directorio y sus contenidos.

     

Los permisos se asignan a tres grupos diferentes: propietario, grupo y otros.

  • Propietario: El propietario se refiere al usuario que creó el archivo o directorio.
  • Grupos: El grupo es un conjunto de usuarios al que pertenece el archivo o directorio.
  • Otros: El termino otros se refiere a cualquier usuario que no sea el propietario ni pertenezca al grupo.

     

Los permisos se representan en una notación de diez caracteres (Usuarios/Grupos/Otros), donde los primeros tres caracteres indican los permisos del propietario, los siguientes tres caracteres indican los permisos del grupo y los últimos tres caracteres indican los permisos de otros. Los permisos están definidos por las letras (r, w, x) y cuando el permiso no está aplicado se sustituye por –.

Por ejemplo, «rwxr-xr–» indica que el propietario tiene todos los permisos, el grupo tiene permisos de lectura y ejecución, y otros tienen solo permisos de lectura

Cada archivo o carpeta que nos encontremos al listar el contenido de un directorio irá indicado con un símbolo:

  • o . : Indica que se trata de un archivo.
  • d : Indica que se trata de un directorio.
  • l : Indica que se trata de un enlace (acceso directo, por ejemplo).

Cambio de permisos en Linux

Para cambiar los permisos de un archivo o directorio en Linux, utilizamos el comando chmod (change mode) seguido de la notación de permisos y el nombre del archivo o directorio. Hay dos formas comunes de especificar los permisos: la notación numérica y la notación simbólica.

Notación numérica: Utiliza un número de tres dígitos para representar los permisos. Cada dígito representa los permisos de propietario, grupo y otros, respectivamente. El número se calcula sumando los valores correspondientes de los permisos.

  •      4 (lectura)
  •      2 (escritura)
  •      1 (ejecución)

Sumando estos valores, podemos obtener diferentes combinaciones de permisos. Por ejemplo, 7 significa todos los permisos (4+2+1), 6 significa lectura y escritura (4+2), y 5 significa lectura y ejecución (4+1).

Para aplicar la notación numérica, utilizamos el comando chmod seguido del número de permisos y el nombre del archivo o directorio. Por ejemplo, para otorgar permisos de lectura y escritura al propietario de un archivo llamado «archivo.txt», ingresamos `chmod 600 archivo.txt`.

Notación simbólica: Utiliza caracteres especiales para asignar o quitar permisos. Los caracteres más comunes son:

  • «+» (agregar permiso)
  • «-» (quitar permiso)
  • «r» (lectura)
  • «w» (escritura)
  • «x» (ejecución)

Utilizamos la notación simbólica con el comando chmod seguido de los caracteres de permisos y el nombre del archivo o directorio. Por ejemplo, para otorgar permisos de escritura y ejecución a todos los usuarios en un archivo llamado «script.sh», ingresamos `chmod a+wx script.sh`.

Asignar Permisos con Números Octales con Chmod:

Manual Comando Chmod

Para representar los permisos en octal,  cada dígito es una combinación de los números 4 , 2 , 1 y 0:

  • 4 significa «leer».
  • 2 significa «escribir».
  • 1 significa «ejecutar».
  • 0 significa «sin permiso». 

 

Por ejemplo, en caso de querer representar chmod 754 archivo, entonces 7 es la combinación de permisos 4 + 2 + 1 (leer, escribir y ejecutar), 5 es 4 + 0 + 1 (leer, no escribir y ejecutar), y 4 es 4 + 0 + 0 (leer, no escribir y no ejecutar).

Los números de permisos que nos podemos encontrar serán los siguientes:

  • 0 = — (Sin permisos)    
  • 1 = –x (Solo permisos de ejecución)
  • 2 = -w- (Solo permisos de escritura)
  • 3 = -wx (Permisos de escritura y ejecución)
  • 4 = r– (Solo permisos de lectura)
  • 5 = r-x (Permisos de lectura y ejecución)
  • 6 = rw- (Permisos de lectura y escritura)
  • 7 = rwx (Todos los permisos)

Dependencias en los permisos:

Debemos tener en consideración que cuando nos referimos a estos permisos en el sistema operativo de código abierto sobre un archivo, generalmente estos dependen de forma directa de los permisos de la carpeta que los alberga. Básicamente con esto lo que os queremos decir es que, aunque un archivo tenga una serie de permisos determinados, los usuarios tendrán que adaptarse a los que estén en un principio asignados a la carpeta principal donde se guardan. Es decir que, si se les asigna en el fichero un permiso de lectura y escritura, si esto está bloqueado en la carpeta superior, no se harán efectivos.

Evidentemente esto puede resultar muy útil para los administradores del sistema, ya que, para efectuar determinadas restricciones en multitud de archivos al mismo tiempo, basta con configurar correctamente los permisos de la carpeta contenedora. Por tanto, esto es lo que realmente significa la dependencia que tienen esos ficheros con respecto al directorio donde se guardan y que está a un nivel por encima.

Descriptores de Archivos

Un descriptor de archivos (file descriptor o fd) es un número entero positivo que se asigna a un proceso para identificar un archivo abierto dentro del sistema.

Cuando un programa quiere acceder a un archivo abierto, el kernel le devuelve un descriptor de archivos. Este fd apunta a una entrada específica dentro de la tabla de archivos del kernel. Esta tabla contiene información sobre el archivo al que hace referencia el descriptor de archivos. Entre esta información se especifican las propiedades read-only(solo lectura), write-only(solo escritura), read-write(escritura/lectura), etc.

Tres de los descriptores de archivos más importantes y con los que más se trabaja son:

  • Standard Input (fd = 0): Los datos se mandan por la entrada estándar. Por defecto, son los datos que se envían cuando escribimos por teclado.
  • Standard Output (fd = 1): Los datos se mandan por la salida estándar. Por defecto, son los datos que se muestran por la pantalla.
  • Standard Error (fd = 2): Los datos se mandan por la salida de error. Por defecto, son los datos que se mandan por la pantalla para indicar que un programa ha fallado.

Entrada (stdin) y Salida (stdout) estándar del sistema.

Como usuarios, para poder comunicarnos con nuestro ordenador necesitamos de una serie de herramientas que nos permitan establecer tal comunicación. Además, una vez se ha establecido la comunicación, el usuario tiene que ser capaz de enviar la información al ordenador y tiene que ser capaz de recibir la información que el ordenador le proporciona.

Estas herramientas son comúnmente conocidas como dispositivos de entrada/salida. Así, al dispositivo de entrada se le llama entrada estándar o stdin y al dispositivo de salida se le llama salida estándar o stdout.

Es importante saber que hay un tercer flujo por el cual se envía la información en caso de error. Este flujo de transmisión de datos es conocido como salida de error o error estándar.

Entrada estándar (stdin)

El término stdin hace referencia a un flujo de entrada a donde se envían los datos y de donde un programa recibe la información que necesita para poder ejecutarse.

Se entiende como flujo una transferencia de datos. En el caso de la entrada estándar, será texto lo que se envíe como información a través de este flujo.

Cuando un programa requiere que el usuario le proporcione información, como un nombre, un número, un día, etc., el usuario le proporcionará esta información a través de la entrada estándar utilizando el teclado. No obstante, esta entrada de datos no siempre proviene del teclado. Hay ocasiones en las que se toman los datos de un archivo o el retorno de un programa como información de entrada para que otro programa pueda ejecutarse. Sin embargo, a no ser que se produzca alguna modificación, la entrada estándar siempre estará asociada al descriptor de archivos 0 (fd = 0).

Salida estándar (stdout)

Cuando un programa termina de ejecutarse, en muchas ocasiones debe mostrar en algún sitio el resultado de dicha ejecución. En la mayoría de las ocasiones este sitio se corresponde con la pantalla del ordenador y es la salida estándar (stdout) la que permite que dicho resultado se muestre por pantalla.

Esto es importante ya que para nuestro sistema operativo todo lo relacionado con el ordenador es un fichero. Por tanto, la pantalla va a comunicarse con un fichero que le permita comunicarse con el resto de programas, un fichero representado por STDOUT_FILENO y apuntado por stdout.

No obstante, es importante saber que la pantalla del ordenador no es la salida estándar. Cuando un programa envía el resultado de su ejecución a la salida estándar, la pantalla muestra dicho resultado porque ambas están conectadas. Por defecto, stdout está conectada a la pantalla, pero no significa que sean lo mismo.

Fácilmente puede redireccionarse la salida estándar a un archivo y evitar así que el resultado se muestre por pantalla y ser guardados en un archivo por ejemplo.

La salida estándar siempre estará asociada al descriptor de archivos 0 (fd = 1).

Salida de error o error estándar (stderr)

El stderr también conocido como error estándar, es el descriptor de archivo predeterminado donde un proceso puede escribir mensajes de error.

En la mayoría de las ocasiones, el mensaje de error se muestra por pantalla. Sin embargo, esto no significa que la salida estándar y el error estándar formen parte del mismo flujo de transmisión. En realidad, son dos flujos totalmente distintos que, por defecto, se encuentran conectados con la pantalla del ordenador.

También importante saber que el error estándar está asociado al descriptor de archivos 2 o fd = 2. A no ser que se especifique lo contrario, este descriptor de archivos siempre va a mostrar su contenido por pantalla. No obstante, al igual que sucede con stdout, podemos redireccionar a stderr para que en lugar de mostrar el contenido por pantalla, lo envíe a un archivo o a otro programa.

Redireccionamiento de descriptores de archivos

En Linux, los redireccionamientos de descriptores de archivos son una funcionalidad poderosa que permite manipular el flujo de entrada y salida estándar de los comandos. Estos redireccionamientos permiten redirigir la entrada y salida de un comando desde y hacia archivos, dispositivos o incluso otros comandos. En este artículo, exploraremos los diferentes tipos de redireccionamientos de descriptores de archivos y cómo utilizarlos en Linux.

  • Redireccionamiento de salida estándar (>)

El redireccionamiento de salida estándar, representado por el símbolo «>», permite redirigir la salida de un comando hacia un archivo en lugar de mostrarla en la pantalla. El archivo puede ser uno existente o uno nuevo que se creará. Por ejemplo:

 

				
					comando > archivo_salida.txt

				
			

En este caso, la salida del comando se escribirá en el archivo archivo_salida.txt. Si el archivo ya existe, se sobrescribirá; de lo contrario, se creará uno nuevo.

Si se desea agregar la salida al final de un archivo existente en lugar de sobrescribirlo, se puede utilizar el operador «>>«. Por ejemplo:

				
					comando >> archivo_salida.txt

				
			
  • Redireccionamiento de entrada estándar (<)

El redireccionamiento de entrada estándar, representado por el símbolo «<«, permite redirigir la entrada de un comando desde un archivo en lugar de recibir datos del teclado. El contenido del archivo se proporcionará como entrada al comando. Por ejemplo:

				
					comando < archivo_entrada.txt

				
			

En este caso, el comando leerá la entrada desde el archivo archivo_entrada.txt en lugar de esperar la entrada del usuario desde el teclado.

Procesos y Servicios

En el mundo de Linux, los procesos y servicios son componentes fundamentales del sistema operativo. Comprender cómo funcionan y cómo interactúan entre sí es esencial para administrar y optimizar un sistema Linux. En este artículo, exploraremos a fondo los procesos y servicios en Linux, desde su definición básica hasta su gestión y control.

¿Qué es un proceso?

En términos simples, un proceso es una instancia en ejecución de un programa en un sistema operativo. Cada vez que ejecutamos un programa en Linux, se crea un proceso para dicho programa. Los procesos son entidades dinámicas que tienen su propio espacio de memoria y recursos asignados.

Cada proceso tiene un identificador único llamado PID (Process ID), que lo distingue de otros procesos en ejecución. Los procesos se crean y destruyen constantemente a medida que se inician y se cierran los programas.

Gestión de procesos en Linux

Linux proporciona herramientas y comandos para administrar y controlar los procesos en el sistema. Algunas de las operaciones comunes de gestión de procesos incluyen:

  • Ejecutar procesos en segundo plano: Agregar un & al final de un comando permite ejecutar un proceso en segundo plano, lo que significa que se ejecutará en segundo plano sin bloquear la terminal.

  • Ver procesos en ejecución: El comando ps muestra información sobre los procesos en ejecución, como el PID, el estado y el uso de recursos.

  • Terminar procesos: El comando kill se utiliza para enviar señales a los procesos y terminarlos. Por defecto, kill envía la señal SIGTERM, que solicita al proceso que termine de manera ordenada. Para forzar la terminación de un proceso, se puede usar kill -9, que envía la señal SIGKILL.

  • Controlar procesos en segundo plano: Los comandos bg y fg se utilizan para cambiar el estado de los procesos en segundo plano. bg mueve un proceso suspendido a segundo plano, mientras que fg trae un proceso en segundo plano a primer plano.

Servicios en Linux

Un servicio en Linux es un tipo especial de proceso que se ejecuta en segundo plano y proporciona funcionalidades específicas del sistema. Los servicios suelen iniciarse durante el arranque del sistema y continúan en ejecución mientras el sistema esté activo.

Los servicios se gestionan mediante un sistema llamado init o systemd en las distribuciones modernas de Linux. Este sistema se encarga de iniciar, detener y supervisar los servicios del sistema.

Los servicios se definen mediante archivos de configuración en directorios específicos, y se pueden habilitar o deshabilitar para que se inicien automáticamente al arrancar el sistema. Algunas herramientas comunes para administrar servicios incluyen:

  • systemctl: Es el principal comando utilizado para gestionar servicios en sistemas basados en systemd. Permite iniciar, detener, reiniciar, habilitar y deshabilitar servicios.

  • service: Es otro comando común utilizado para gestionar servicios en sistemas basados en init. Proporciona una interfaz simplificada para iniciar, detener y reiniciar servicios.

Demonios (Daemons)

Un daemon es un tipo especial de servicio que se ejecuta en segundo plano sin interacción directa con los usuarios. Los demonios son procesos que se ejecutan de forma continua y realizan tareas específicas en segundo plano, como administrar servicios de red, realizar tareas de programación o llevar a cabo procesos de respaldo.

Los demonios se caracterizan por ejecutarse de forma persistente y no estar vinculados a una sesión de usuario. Se inician durante el arranque del sistema y se mantienen en ejecución mientras el sistema esté activo. Algunos ejemplos de demonios comunes en Linux incluyen:

  • sshd: El demonio SSH que permite el acceso remoto seguro al sistema.
  • httpd: El demonio que se encarga de servir páginas web utilizando el protocolo HTTP.
  • cron: El demonio responsable de ejecutar tareas programadas en momentos específicos.

Control y administración de servicios y demonios

La gestión de servicios y demonios en Linux se realiza a través de comandos y herramientas específicas. Algunas de las acciones comunes que se pueden realizar incluyen:

  • Iniciar un servicio/demonio: Utiliza el comando start o systemctl start para iniciar un servicio o demonio específico. Por ejemplo, systemctl start apache2 inicia el servicio de Apache.

  • Detener un servicio/demonio: Utiliza el comando stop o systemctl stop para detener un servicio o demonio en ejecución. Por ejemplo, systemctl stop sshd detiene el servicio SSH.

  • Reiniciar un servicio/demonio: Utiliza el comando restart o systemctl restart para reiniciar un servicio o demonio. Esto detiene y vuelve a iniciar el servicio en cuestión.

  • Habilitar o deshabilitar un servicio/demonio: Utiliza el comando enable o systemctl enable para habilitar que un servicio o demonio se inicie automáticamente durante el arranque del sistema. Por ejemplo, systemctl enable nginx habilita el servicio de Nginx.

  • Ver el estado de un servicio/demonio: Utiliza el comando status o systemctl status para obtener información sobre el estado actual de un servicio o demonio. Esto incluye si está en ejecución, los PID asociados y otros detalles relevantes.

Es importante destacar que la administración de servicios y demonios en Linux puede variar según la distribución específica utilizada. Algunas distribuciones pueden utilizar init, mientras que otras utilizan systemd. 

Redirección y tuberías (pipes)

Las redirecciones y tuberías (pipes) son herramientas poderosas en Linux que permiten gestionar la entrada, salida y flujo de datos en la línea de comandos. En este curso completo, exploraremos en detalle cómo utilizar redirecciones y tuberías para maximizar tu productividad y eficiencia en la administración del sistema.

Redirecciones

  • Redirección de entrada (<)

La redirección de entrada permite tomar datos desde un archivo y usarlos como entrada para un comando.

				
					comando < archivo.txt

				
			
  • Redirección de salida (>)

La redirección de salida dirige la salida de un comando hacia un archivo en lugar de la pantalla. 

				
					comando > archivo.txt

				
			
  • Redirección de salida y anexado (>>)

La redirección de salida y anexado agrega la salida de un comando a un archivo existente en lugar de sobrescribirlo.

				
					comando >> archivo.txt

				
			
  • Redirección de errores (2>)

La redirección de errores envía los mensajes de error generados por un comando hacia un archivo en lugar de la pantalla.  En caso de solo querer librarnos de los errores, una práctica común es enviar esos mensajes de error al directorio /dev/null, este directorio es como agujero negro donde se eliminan los datos enviados.

				
					comando 2> errores.txt # Los mensajes de error serán guardados en el archivo errores.txt 

comando 2>/dev/null #Los mensajes de erros serán enviados al direcotiro /dev/null
				
			

Tuberías (Pipes)

Las tuberías (pipes) permiten enviar la salida de un comando como entrada a otro comando, lo que facilita el procesamiento de datos en cadena.

Una vez sabemos como funciona la dinámica de los comandos, podemos ejecutar varios al mismo tiempo utilizando las distintas variables según la acción que vayamos a realizar.

A la acción de colocar distintos comandos concatenados en la misma línea de comando se le conoce como one-liner.

Cada variable concatena los comandos de una forma particular.

  • Variable ;

Con ; el segundo comando se ejecutará sin importar el resultado del primero. Esto quiere decir, que aunque el primer comando nos reportará un código de error, el segundo se ejecutará independientemente mostrando el resultado.

				
					whoami ; ls
				
			
  • Variable &&

Con && el segundo comando se ejecutará solo si el primero termina con éxito. En caso de el primer comando reportar un error el siguiente comando no se ejecutará.

				
					whoami && ls
				
			
  • Variable ||

Con || el segundo comando solo se ejecutará si el primero termina sin éxito. Si el primer comando se realiza de manera exitosa el siguiente no se ejecutará.

				
					whoami || ls
				
			
  • Variable &

Con & hará que los dos (o más) comandos se ejecuten de manera simultanea.

				
					whoami & ls
				
			
  • Variable |

Con | la salida del primer comando se convierte en la entrada del segundo. De está forma podemos utilizar el resultado o el output de un comando para ejecutar otra acción. 

Scripts y automatización de tareas –> Curso de Bash Scripting

Los scripts son archivos de texto que contienen una serie de comandos y secuencias de instrucciones. Estos scripts pueden ser escritos en diferentes lenguajes de scripting como Bash, Python o Perl. Los scripts permiten automatizar tareas repetitivas, simplificar procesos complejos y mejorar la productividad.

  • Automatización de Tareas en Linux

La automatización de tareas consiste en realizar acciones repetitivas de forma automática, eliminando la necesidad de intervención manual. Esta capacidad es especialmente útil en entornos de servidores, administración de sistemas y tareas de rutina. Al automatizar tareas, se ahorra tiempo y se reduce la posibilidad de errores humanos.

  • Automatización de Tareas a Nivel de Sistema

En Linux, se pueden programar tareas recurrentes utilizando herramientas como cron o systemd. Cron permite programar scripts o comandos para que se ejecuten en momentos específicos, mientras que systemd permite definir servicios y tareas programadas a nivel de sistema. Estas herramientas son fundamentales para la automatización de tareas en Linux.

  • Automatización de Tareas en la Línea de Comandos

La línea de comandos ofrece un entorno ideal para la automatización de tareas en Linux. Mediante el uso de scripts, es posible agrupar una serie de comandos y ejecutarlos de forma secuencial. Esto permite automatizar procesos complejos, como el procesamiento de archivos, la generación de informes o la configuración del sistema.

  • Automatización de Tareas en Entornos de Escritorio

La automatización de tareas también es aplicable a entornos de escritorio en Linux. Es posible configurar macros y atajos de teclado para realizar acciones repetitivas de forma rápida. Además, algunas aplicaciones ofrecen funcionalidades para automatizar tareas específicas, como la organización de archivos, la edición de imágenes o la gestión de proyectos.

  • Herramientas y Utilidades para la Automatización en Linux

Existen diversas herramientas y utilidades diseñadas específicamente para la automatización en Linux. Ejemplos populares incluyen Ansible, Puppet, Chef y SaltStack, que permiten gestionar la configuración y automatizar tareas en múltiples sistemas. Estas herramientas simplifican la administración de infraestructuras y mejoran la eficiencia en la gestión de sistemas.