Skip to main content

Command Palette

Search for a command to run...

Shell Bash

Updated
•7 min read•View as Markdown
Shell Bash
A

¡Gracias por leer! Si tiene alguna pregunta o comentario, no dude en comunicarse. ¡Happy Hacking! 🚀💻

Los informáticos sabemos que las computadoras son geniales en ayudarnos con tareas repetitivas. Sin embargo, olvidamos que tenemos un gran numero de herramientas disponibles a nuestro alcance para ser más productivos y resolver problemas complejos relacionados con la computación. Todaviá muchos de nosotros utilizamos un pequeño conjunto de esas herramienta: en ocaciónes llegamos a sobrevivir con ayuda de tutoriales y copipegando comandos de internet.

Hoy aprenderemos a utilizar al máximo las herramientas y espero infundirte emoción para explorar (y tal vez construir) otras por tu propia cuenta

¿Qué es la shell?

Las computadoras en estos días tienen una variedad de interfaces: sofisticadas interfaces gráficas de usuarios, interfaces de voz, AR/VR y muchas otras. Éstas son geniales para el 80% de los casos de uso, pero ellas fundamentalmente te restringen de lo que puedes hacer: tú no puedes presionar un botón que no exista o dar una instrucción por voz que no esté programada. Para aprovechar por completo las herramientas que tu computadora provee, tenemos que ir a la vieja escuela y ejecutar una intarfaz textual: la shell

Básicamente, es la interfaz de línea de comandos con la que los usuarios avanzados (de ahora en adelante, eso te incluye a ti) controlan el sistema operativo de su computadora

Tanto Linux como Windows tienen CLI ( Command Line Interface ) con las que operaremos como usuarios avanzados.

Linux:

  • Hay una variedad de shells que existen en el ecosistema Linux, pero el predeterminado para muchos sistemas operativos se conoce como Bash (Bourne Again SHell). Eventualmente serás el mejor amigo de esto.

Windows:

  • CDM

    • Una interfaz heredada que permite el acceso a comandos de DOS

    • MS-DOS fue el primer sistema operativo de Microsoft y contenía muchas funciones básicas a las que todavía se puede acceder a través de CMD

  • Power Shell

    • Una interfaz y un lenguaje con todas las funciones que permiten secuencias de comandos complejas mediante cmdlets y canalizaciones. Como todo el lenguaje fue escrito para trabajar con Windows, permite un control detallado y una fácil manipulación del sistema operativo.
  • Subsistema de Windows para Linux (WSL): solo Windows 10

    • El Subsistema de Windows para Linux permite a los desarrolladores ejecutar un entorno Linux, incluida la mayoría de las herramientas, utilidades y aplicaciones de línea de comandos, directamente en Windows, sin modificaciones, sin la sobrecarga de una máquina virtual tradicional o una configuración de arranque dual.

    • Básicamente, es una máquina virtual mini-Linux, con acceso a los mismos archivos en la máquina host de Windows.

No trabajaremos con Windows en este curso.

En esta lección, nos enfocamos en la “Bourne Again Shell”, o “bash” para abreviar.

Diseño de comando

Entonces, veamos cómo el verdadero hacker usa la línea de comando, comenzando con una escena de Matrix, una gran película de hacker de todos los tiempos.

Esa escena es bastante realista y muchos de los comandos que ejecuta son cosas reales que usarás a lo largo de este curso.

Entremos en el formato de los comandos. Primero, habrá un $ o un #, en el futuro. Por ahora usaré $ para indicar el comienzo de un comando.

Usando la shell

cuando lanzas tu terminal, ves un promp que frecuentemente luce así:

┌──(Sapce㉿monkey)-[~]
└─$

La terminal nos dice el nombre de usuario monkey-space, tambien nos dice el directorio de trabajo actual que es: ~ ( abrevia "Home"). El $ cuenta que no eres el usuario administrador (root). En este prompt tú puedes escribir un comando, el cual será interpretado por la shell.

El primer comando que vamos a escribir nos dirá quiénes somos, lo cual es claramente rudo :

┌──(Space㉿monkey)-[~]
└─$ whoami
monkey

El siguiente comando nos dirá nuestra ruta dentro el directorio, también conocido como nuestro directorio de trabajo. En linux, llamamos directorios a las carpetas porque suena mejor, no te dejes llevar.

┌──(Space㉿monkey)-[~]
└─$ pwd
/home/monkey

pwd ( print working directory )

  • home : La primer carpeta (directorio) es la que almacena a los usuarios

  • monkey : en este caso es un directorio que almacena todos los datos del usuario

El proximo comando que vamos a ver es el comando ls (List) este comando imprime todo lo que se encuentra en nuestro director de trabajo actual, que en nuestro caso es el direcotorio /monkey

┌──(Space㉿monkey)-[~]
└─$ ls
Desktop    Public     Documents  Music   
Templates  Downloads  Pictures   Videos

┌──(Space㉿monkey)-[~]
└─$ ls -l
total 32
drwxr-xr-x 2 monkey monkey 4096 mar  9 18:41 Desktop
drwxr-xr-x 2 monkey monkey 4096 mar 12 18:16 Documents
drwxr-xr-x 2 monkey monkey 4096 mar 12 09:49 Downloads
drwxr-xr-x 2 monkey monkey 4096 mar  9 18:41 Music
drwxr-xr-x 2 monkey monkey 4096 mar  9 18:41 Pictures
drwxr-xr-x 2 monkey monkey 4096 mar  9 18:41 Public
drwxr-xr-x 2 monkey monkey 4096 mar  9 18:41 Templates
drwxr-xr-x 2 monkey monkey 4096 mar  9 18:41 Videos

El comando ls no solo muestra los nombres sino también puede mostrarnos un poco más y todo esto gracias a los indicadores (flags). El indicador -l es un indicador que imprime la informacion del archivo en un formato largo en donde nos muestra mas datos :

  • **drwxr-xr-x :**Permisos no te preocupes si aun no lo entiendes lo veremos mas a delante.

  • monkey : Despues tenemos el nombre el Usuario a quien le pertenece el archivo.

  • monkey : Despues tenemos el grupo.

  • 4096 : Tamaño que esta utilizando.

  • 9 18:41 : Fecha con la cual fue creado el archivo o directorio

También podemos ejecutar un comando con argumentos :

┌──(Space㉿monkey)-[~]
└─$ echo hello

En este caso, le ordenamos a la shell ejecutar el programa echo con el argumento hello, lo que hace echo es simplemente imprir sus argumentos. La shell analiza el comando dividiéndolo por espacios en blanco, y entonces corre el programa indicando en la primer palabra, dando a cada palabra siguiente como un argumento al que el programa puede acceder. Si tú quieres proveer un argumento que contiene espacios u otro carácter especial (por ejemplo, un directorio nombrado Mis fotos), puedes citarlo con comillas simples 'Mis fotos' o con comillas dobles "Mis fotos", o ejecutarlo solamente con el carácter \ (*este caracter eleminia el espacio delante de el ) barra invertida *Mis\ fotos.

Vamos a crearlo para entender más el ejemplo utilizando otro comando que tambien requiere de argumentos, el siguiente comando es mkdir (make directory):

┌──(Space㉿monkey)-[~]
└─$ mkdir "Mis fotos"

Ahora que ya creamos el directorio vamos a ver si existe utilizando el comando ls

┌──(Space㉿monkey)-[~]
└─$ ls
Desktop    Public     Documents  Music   
Templates  Downloads  Pictures   Videos
'Mis fotos'

Y ahí se encuentra el directorio 'Mis fotos'. Ahora para ingresar a ese directorio especial lo hacemos con el comando cd + las iniciales de la ruta relativa Mis y precionando el tabulador nos arrojara la ruta.

┌──(Space㉿monkey)-[~]
└─$ cd Mis\ fotos

Preciona Enter y listo esta dentro.

Una pregunta importante es ¿cómo logra la shell encontrar los programas date, whoami, mkdir, ls y echo? Bueno, la shell es un entorno de programación, como Python o Ruby tiene variables, condiciones, bucles y funciones. Cuando corres un comando en tu shell, tú realmente escribes una pequeña porción de código que tu shell interpreta. Si pides a la shell ejecutar un comando que no coincide con las palabras reservadas de su lenguaje te marcara un error.

┌──(Space㉿monkey)-[~]
└─$ fñofnfjkn
fñofnfjkn: no se encontró la orden

Navegando en la shell

Una ruta en la shell es una lista de directorios separados por un / (slash) en Linux y Mac Os la ruta / (slash) es el principio del arbol del sistema de archivos, bajo la cual se encuentran el resto de archivos, mientras que en Widows hay una raíz para cada partición ( ejemplo: C:\ ).

Cuando una ruta que empieza con / es llamada ruta absoluta. Cualquier otra ruta es una ruta relativa. Las rutas relativas son relativas con respecto al directorio de trabajo actual.

Veamos ahora una flag del comando ls -a esta flag nos muestra las entradas que comienzan con ( . ) un punto estos archivos o directorios que empiezan con un punto al inicio son archivos ocultos:

┌──(Space㉿monkey)-[~]
└─$ ls -a
.              ..            .dmrc                      .local                     
Videos           bDocuments      .mozilla                   .Xauthority
.bash_logout      Downloads      Music                      .xsession-errors
.bashrc           .face          Pictures                   .xsession-errors.old
.bashrc.original  .face.icon     .pki                       .zsh_history
bootcamp          .gnupg         .profile                   .zshrc
.cache            .ICEauthority  Public
.config           .java          .sudo_as_admin_successful
Desktop           .lesshst       Templates

Si prestamos atención al listar el directorio actual nos muestra un directorio que es un . punto y un segundo directorio que son dos .. puntos. En la ruta, . un punto hace referencia al directorio actual y .. dos puntos al directorio padre. Utilicemos otro comando muy importante que es cd (change directory):

┌──(Space㉿monkey)-[~]
└─$ cd ..
┌──(Space㉿monkey)-[/home]
└─$ ls
monkey

como te das cuenta acabamos de pasar del directorio monkey al directorio /home y tirando de un ls podemos ver listado el directorio monkey. Si continuamos más arriba encontraremos

┌──(Space㉿monkey)-[/home]
└─$ cd ..
┌──(Space㉿monkey)-[/]
└─$ ls 
bin   etc         initrd.img.old  lib64       mnt   root  srv  usr      vmlinuz.old
boot  home        lib             lost+found  opt   run   sys  var
dev   initrd.img  lib32           media       proc  sbin  tmp  vmlinuz

El directorio raiz / aqui encontraremos todas las ramas a las cuales nosotros podemos acceder :