Está en la página 1de 81

StringManolo / hackingTermux101 Public

Libro sobre hacking básico/avanzado en Termux

stringmanolo.github.io/hackingtermux101/

394 stars 34 forks Branches Tags Activity

Star Notifications

Code Issues 4

master 1 Branch 0 Tags Go to file Go to file Code

StringManolo Comenta los ads del header porque no los estoy usando 7 months ago

_includes Comenta los ads del header porque no los estoy … 7 months ago

imagenes Sube imagen de prompt 2 years ago

paginas Sube web para comprobar arquitectura 2 years ago

FUNDING.yml Readme y funding 2 years ago

README.md Comenta los ads del header porque no los estoy … 7 months ago

TODO.md Añade scp 8 months ago


Languages

ESP

Este libro está escrito originalmente en español. Puedes acceder en otros lenguajes usando el
traductor de Google, si bien no es perfecto puede ser de utilidad.

EN

This book is original writen in spanish. You can access it in other languages too using google
translator. Even if not perfect may be usefull. English Translation

Tabla de Contenidos

Prefacio

Capítulo 0: Requisitos y Programas Extra

Capítulo 1: Qué es Termux?

Capitulo 2: Descarga e Instalación

Capítulo 3: Configuración Básica


Capítulo 4: Uso básico de la terminal

Capítulo 5: Introducción a Bash

Capítulo 6: Uso de VI y de VIM

Capitulo 7: Configuración de Bash

Capítulo 8: Sistema de Ficheros

Capítulo 9: Creando comandos

Capítulo 10: Comandos Intermedios

Capítulo 11: Proot-Distro

Capitulo 12: Introducción a Sistemas Linux

Capitulo 13: Uso básico de Debian

Capítulo 14: Uso básico de Ubuntu

Capítulo 15: Uso básico de Alpine

Capítulo 16: Uso básico de Fedora

Capítulo 17: Introducción a Servicios

Capítulo 18: Creando un Servidor

Capítulo 19: Ngrok y Exponer Servicios

Capítulo 20: Tor, Configuración y Uso

Capítulo 21: Servicios Ocultos

Capítulo 22: SSH, SCP y SSHD

Capítulo 23: Bots de Telegram

Capítulo 24: Telegram RAT

Capítulo 25: Protocolo HTTP

Capítulo 26: Protocolo DNS

Capítulo 27: Servicios Web

Capítulo 28: Hosting Gratuitos

Capítulo 29: Dominios Gratuitos

Capítulo 30: Introducción a Programación

Capítulo 31: Comparación de Lenguajes

Capitulo 32: Introducción a C

Capìtulo 33: Introducción a C++

Capítulo 34: Introducción a C#

Capítulo 35: Introducción a Go

Capítulo 36: Introducción a Java

Capítulo 37: Introducción a Javascript

Capítulo 38: Introducción a Lua

Capítulo 39: Introducción a PHP


Capítulo 40: Introducción a Python

Capítulo 41: Introducción a Rust

Capítulo 42: Introducción a Node

Capítulo 43: Introducción a Typescript

Capítulo 44: Introducción a la Criptografìa

Capítulo 45: Introducción al Malware

Capítulo 46: Desarrollo de RATs

Capítulo 47: Desarrollo de Ransomwares

Capítulo 48: Desarrollo de Greyware

Capítulo 49: Introducción a Hacking

Capítulo 50: Introducción a OSINT

Capitulo 51: Google Hacking (dorks)

Capitulo 52: Introducción a Hacking Web

Capítulo 53: Introducción a Ingeniería Social

Capítulo 54: Laboratorios y Páginas de Hacking legal.

Capìtulo 55: HTMLi (inyección de HTML)

Capítulo 56: XSS (Inyección de Javascript)

Capítulo 57: CSFR (Peticiones entre sitios)

Capítulo 58: Clickjacking (secuestro de clicks)

Capítulo 59: HPP (Polución de parámetros HTTP)

Capítulo 60: Open Redirects (redirecciones abiertas)

Capitulo 61: SSRF (falsificación de peticiones en el lado del servidor)

Capítulo 62: Path Traversal (recorrer rutas)

Capítulo 63: Referrer Leaks (Filtraciones del referido)

Capítulo 64: Dangling HTML (HTML pendiente)

Capítulo 65: Subdomain/Domain Takeover (secuestro de sub/dominios)

Capítulo 66: Template Injection (Inyección de plantillas)

Capítulo 67: IDOR (Referencia a objecto indirecta)

Capítulo 68: SQLi (Inyección del lenguaje de consultas estructurado)

Capítulo 69: Cookie Tossing (lanzamiento de cookies)

Capítulo 70: Web Cache Poisoning (envenenamiento de la caché web)

Capítulo 71: Malas prácticas

Capítulo 72: Post Explotación

Capítulo 73: Herramientas de Hacking

Capítulo 74: Dig

Capítulo 75: Dirstalk


Capítulo 76: Impulse

Capítulo 77: ncat

Capítulo 78: nmap

Capítulo 79: nuclei

Capítulo 80: searchsploit

Capítulo 81: shodan

Capítulo 82: sqlmap

Capítulo 83: turbolist3r

Capítulo 84: C++ intermedio

Capítulo 85: Go intermedio

Capítulo 86: Javascript intermedio

Capítulo 87: PHP intermedio

Capítulo 88: Python intermedio

Capítulo 89: Node intermedio

Capítulo 90: Quickjs intermedio

Capítulo 91: Typescript intermedio

Capítulo 92: Criptografía intermedio

Capítulo 93: Malware intermedio

Capítulo 94: Ingeniería Social intermedio

Capítulo 95: Creando laboratorios y aplicaciones vulnerables

Capítulo 96: Desarrollando aplicaciones de hacking

Capítulo 97: Retos nivel basico

Capítulo 98: Retos nivel intermedio

Capítulo 99: Retos nivel avanzado

Capítulo 100: Retos nivel 3l1t3

Glosario

Apéndice

Prefacio

Bienvenido a la primera edición del libro Termux Hacking 101. Aquí vas a aprender a instalar
Termux en Android, su uso básico, virus, programación y hacking.

Termux es un emulador de terminal para Android y un entorno de Linux que funciona


directamente sin necesidad de rootear el dispositivo o configurarlo. Un sistema base mínimo se
instala automáticamente - Y muchos paquetes adicionales están disponibles desde su gestor de
paquetes.
Un pequeño inciso antes de comenzar. Este libro es 100% gratuito y se financia a través e
donaciones. Si quieres contribuir a la creación de este libro, puedes realizar una tranferencia a la
cuenta ES59 2080 5029 1630 0011 2266 indicando como motivo de la transferencia "Libro
Termux". Por donaciones de 20$ o más, se ofrece un día de clases particulares por Telegram.
Indica tu nombre de Telegram en el asunto de la tranferencia. DONAR ES OPCIONAL, puedes leer
el libro aunque no dones. Por qué deberías donar entonces? Si obtengo múltiples donaciones,
me animará a seguir escribiendo el libro o a sacar nuevos libros.

Disfrútalo!

Tabla de Contenidos

Capítulo 0: Requisitos y Programas Extra

Para poder utilizar Termux, necesitas un dispositivo Android. Termux soporta versiones de
android comprendidas entre la versión 7 y la última version de Android.

Necesitas un mínimo de 300 megas de espacio en disco. Yo te recomiendo como mínimo 8


gigas disponibles de memoria interna. 64 Gigas está genial y suele ser mas que suficiente,
depende del uso que le des.

Antes de empezar, algunos programas extra son recomendados, aunque no necesarios.

Hackers Keyboard
Este sencillo teclado offline funciona de marabilla en la mayoría de dispositivos. No vende tus
datos, ya que no se conecta nunca a internet y te ofrece un teclado como el del PC, aunque no es
necesario. Yo no utilizo esta característica en concreto, pero si este es el único teclado que
utilizo en Android por seguridad.

Los que vienen preinstalados suelen vender tus datos aunque los configures para que no lo
hagan.

Fx File Explorer
Explorador de ficheros para Android que te permite el acceso a las carpetas de Termux. No lo he
probado pero es recomendado por los desarrolladores de Termux.

Tabla de Contenidos

Capítulo 1: Qué es Termux?

Termux es una aplicación para Android de código abierto que trae todo el poder Linux a tu
dispositivo móvil. Puedes realizar prácticamente cualquier tarea que realices en tu PC con un
Linux instalado. Todo se realiza directamente desde la terminal escribiendo comandos, aunque
también es posible instalar un entorno gráfico como X11.

Termux instala por defecto un sistema base con comandos y paquetes comunes que suelen ser
imprescindibles en cualquier distribución de Linux. Los paquetes se compilan de forma cruzada
con Android NDK y en la mayoría de casos solo necesitan añadirle pequeños parches para que
sean totalmente compatibles con Android. Hay miles de paquetes disponibles y cada día la
comunidad añade nuevos paquetes.

Es seguro, ya que todo es código abierto y miles de profesionales revisan el código y los nuevos
cambios a diario.

Tiene un montón de características extra, como poder ver los SMS, los archivos del dispositivo,
etc. Esto te premite automatizar un montón de tareas, hacer interfaces con distintas tecnologías
y todo lo que se te ocurra.

Totalmente customizable. Puedes modificar la apariencia, añadir atajos de teclado, nuevas


funcionalidades...
Soporta teclado y ratón externos. Puedes conectar Termux a una pantalla externa y utilizar un
teclado y un ratón.

Cómo funciona?

La terminal emulada es básicamente una aplicación que arranca los programas de linea de
comandos usando una llamada del sistema execve(2) y redirige la entrada y la salida de datos de
la función, hacia la pantalla.

La mayoría de terminales para Android, trabajan con conjuntos de herramientas pobres que ya
trae Android. Termux porta una gran cantidad de herramientas de GNU/Linux hacia Android.

Termux no es una máquina virtual ni otro tipo de sistema/entorno emulado. Todos los paquetes
son compilados en cruce con Android NDK y solo se parchean para que funcionen en
Android/Termux.

El sistema operativo no proporciona acceso completo al sistema de ficheros, por lo cual Termux
no puede instalar los paquetes en las rutas típicas /bin, /etc, /usr, /var. Termux traslada este
sistema de ficheros a un directorio privado de la aplicación en la ruta
/data/data/com.termux/files/usr

Este directorio se llama prefix y su ruta se puede visualizar en la variable de entorno "$PREFIX".
Esta ruta se hardcodea directamente en muchos de los binarios/paquetes disponibles para
Termux. Esto es uno de los típicos parches que se añaden.

Tabla de Contenidos

Capitulo 2: Descarga e Instalación

Descarga

Puedes instalar Termux descargando la última release directamente desde el repositorio del
proyecto en github. O desde la tienda de F-Droid.

La descarga también está disponible en Play Store, pero descargar la app de la Play Store NO SE
RECOMIENDA. El motivo está relacionado con políticas de Google con respecto a dar soporte a
nuevas versiones de Android. Si se cumpliese con dichas políticas, habría que dejar de dar
soporte a versiones anteriores. Aquí mas detalles.

Si no conoces la arquitectura de tu dispositivo, puedes pinchar aquí.

Instalacion

Abre F-Droid en tu Android pinchando aquí


Pincha en el primer enlace que dice Descargar Apk
Pincha en el archivo descargado para iniciar la instalación
Pincha en Permitir instalación de aplicaciones desde orígenes desconocidos
Espera a que se complete la instalación
Cuando finalice la instalación tendrás el icono de Termux en tu escritorio, haz click para arrancar
la app.

Tabla de Contenidos

Capítulo 3: Configuración Básica

Una vez tienes la consola de comandos ante ti, lo primero es configurar el acceso al sistema
interno de ficheros de Android. Para ello debes correr el comando

termux-setup-storage
Y permitir el acceso de termux al sistema interno de ficheros.

El comando termux-setup-storage va a configurar el acceso a las siguientes carpetas.

~/storage/shared
Carpeta utilizada por las aplicaciones de Android para compartir archivos
~/storage/downloads
La carpeta por defecto de descargas, por ejemplo donde tu navegador descarga los archivos.
~/storage/dcim
Aquí la cámara suele almacenar las fotos y videos del dispositivo
~/storage/pictures
En esta carpeta se suelen almacenar imágenes del dispositivo
~/storage/music
Esta es la carpeta que Android suele utilizar para guardar la música del usuario
~/storage/movies
Donde se suelen almacenar las películas
~/storage/external-1
Carpeta especial creada por Termux en el almacenamiento externo (si este está disponible),
normalmente una tarjeta micro-sd, aunque se permite también el acceso a pendrives y otro tipo
de dispositivos de memoria externos. No instales paquetes, programas o archivos de programas
aquí (como puedan ser logs de un servidor, archivos de configuración, ...) , ya que Android no
proporciona permisos de escritura/lectura directamente y es necesario utilizar una API a la que
los programas no tienen acceso.

Si utilizas Android 11 y se muestra el error Permission denied (Permiso denegado) cuando


intentas acceder a la carpeta shared, aún cuando le diste permisos, sigue los pasos siguientes:
Ve a Ajustes -> Aplicaciones -> Termux -> Permisos
Revoca el permiso de acceso a ficheros (Storage permission)
Autoriza de nuevo el permiso de acceso a ficheros.

Este es un bug de Android 11, no de Termux.

Nunca elimines Termux directamente desde Android, ya que si tienes archivos en la tarjeta sd,
todo su contenido será eliminado, incluyendo archivos que no tienen ninguna relación con
Termux

Tabla de Contenidos

Capítulo 4: Uso básico de la terminal

Una terminal es una interfaz conducida por comandos capaz de realizar todo tipo de tareas.
Usualmente realizamos las tareas utilizando interfaces, esto es, pulsando botones, arrastrando
carpetas, viendo la información en forma de imágenes e iconos... La terminal utiliza un modelo
completamente distinto, remplazando los iconos, las imágenes, los botones y toda la gestión de
ficheros por comandos y texto que se muestra en pantalla.

Utilizar una terminal en lugar de una interfaz gráfica, nos permite realizar tareas de todo tipo de
forma mas ágil y rápida.

Todas las terminales de GNU/Linux, así como Termux, incluyen una gran variedad de comandos
básicos que nos permiten realizar estas tareas. Este capítulo se enfoca en los comandos más
básicos de Linux.

Al entrar en Termux, veremos un $ que indica el "prompt" de la terminal, en Bash se guarda en la


variable de entorno "$PS1". Este caracter del dolar, nos indica que podemos escribir comandos
en la terminal. La sintaxis es $ comando, para enviar el comando y que este sea procesado,
pulsamos la tecla Enter. En caso de Hacker's Keyboard, esta tecla se representa como una flecha
situada en la esquina inferior derecha ⏎.

Comandos básicos de Linux

pwd

El comando pwd nos va a mostrar la ruta completa de la carpeta en la cual nos encontramos.

pwd son las siglas de Print Working Directory (Imprime Directorio de Trabajo)

cd

El comando cd sirve para cambiar el directorio en el cual estamos trabajando. Es el equivalente a


moverse a una carpeta haciendo doble-click en ella desde cualquier interfaz gráfica.
Si escribes el comando cd sin mas, se cambiará el directorio a la variable de entorno "$HOME",
por defecto /data/data/com.termux/files/home.

Existe un símbolo especial ~ que sirve para indicar explícitamente que nos mueva a la carpeta
home. Esto nos será útil cuando queramos crear o referenciar un archivo en home desde otro
directorio.

Podemos movernos a cualquier directorio alcanzable poniendo su ruta relativa tras el comando
cd, o poniendo su ruta absoluta desde cualquier lugar. En la siguiente imagen puedes comprobar
como se cambia el directorio a la carpeta ejemplo, que existe dentro de la carpeta home, y como
después se imprime el directorio actual de trabajo. Indicándonos la terminal, que nos
encontramos dentro de la carpeta ejemplo que existe en home.
Cuando quieras moverte al directorio anterior utiliza dos puntos.

cd ..

cd son las siglas de Change Directory (Cambia Directorio),

ls

El comando ls muestra la lista de archivos y carpetas que contiene el directorio actual de trabajo.

En este ejemplo nos movemos al directorio home, desde ahí al directorio ejemplo que está
dentro de home y con ls listamos todo lo que contiene el directorio actual.

En blanco se muestran los archivos comunes (foto_perfil.jpg, listaDeLaCompra.txt), en


azul/violeta se muestran los directorios que contiene el directorio ejemplo. En este caso hay un
directorio llamado documentosDelTrabajo. En verde se muestran archivos con permisos de
ejecución, en esta imagen no hay ninguno.

ls es una abreviatura de List (Listar)

cat

El comando cat muestra el contenido de un fichero.

En este ejemplo se muestra el contenido del fichero listaDeLaCompra.txt. Es simplemente un


texto que escribí en un fichero. La escritura de ficheros se detalla en el capítulo 6: Uso de VI y de
VIM.

cat viene de concatenate (concatenar)

touch

El comando touch crea ficheros vacios en el directorio actual.

touch miListaDeLaCompra.txt

Con este comando crearás un archivo miListaDeLaCompra.txt en el directorio actual, que podras
ver en el listado del directorio en el que crees el archivo. Por ejemplo si quisieses crear el archivo
en home y listar el contenido de home, usarías los siguientes comandos:

cd
touch miListaDeLaCompra.txt
ls
touch significa tocar

mkdir

El comando mkdir crea directorios/carpetas vacias en el directorio actual.

cd
mkdir ejemplo

Con estes comandos crearás una carpeta (puedes usar el nombre de carpeta/directorio
indistintamente) llamada ejemplo dentro de la carpeta home. Puedes listarla con ls.

Si intentas crear un nuevo directorio y un directorio hijo directamente, puede usar el argumento -p
(de parents, en español directorios padres)

mkdir ~/ejemplo/hijoDeEjemplo/hijoDeHijoDeEjemplo

mkdir es una abreviatura de Make Directory (Crea Directorio)

cp

El comando cp permire copiar archivos. Puedes copiarlos en el mismo directorio o en otro


directorio. Tambien puedes modificar el nombre de destino.

cp miListaDeLaCompra.txt miSegundaListaDeLaCompra.txt

El primer argumento del comando cp es el nombre del fichero del que deseamos realizar una
copia. El segundo argumento es el nuevo nombre que tendrá la copia. Si el archivo contiene texto
o cualquier otro contenido, este estará presente en ambos archivos, tanto en el original como en
la copia.

La mayoría de comandos nos permite especificar las ruta junto al nombre de los ficheros. Si nos
encontramos en la carpeta home, y dentro de esta tenemos una carpeta llamada ejemplo que
contiene un archivo miListaDeLaCompra.txt, podemos copiar este archivo directamente desde la
carpera home. El comando para realizar esta acción sería:

cd
cp ejemplo/miListaDeLaCompra.txt listaDeLaCompra.txt

Tras este comando tendremos una copia del archivo miListaDeLaCompra.txt (que se encuentra
en la carpeta ejemplo) en la carpeta home con el nombre de listaDeLaCompra.txt

cp es una abreviatura de copy (copiar)

mv

El comando mv permite mover archivos. El funcionamiente es exactamente igual al del comando


cp, con la diferencia de que el archivo original es eliminado y solo se conserva la nueva copia.

Esto hace de mv el comando ideal para mover archivos entre directorios.

mv es una abreviatura de move (mover)

rm

El comando rm se utiliza para eliminar archivos de forma permanente.

cd
rm listaDeLaCompra.txt

rm es una abreviatura de remove (eliminar)


clear

El comando clear, limpia el contenido de la pantalla.

clear

clear significa limpiar

pkg

El comando pkg es único de Termux, no existe en GNU/Linux, aunqie si existen sus equivalentes.
Este comando se encarga de gestionar por nosotros toda la instalación de paquetes, sus
versiones, actualizaciones, dependencias, ...

Si corres el comando:

pkg

Te mostrará la lista de subcomandos que soporta y una breve descripción de que hace cada uno.
Aquí me limito a explicar los subcomandos mas básicos:

pkg list-all

Muestra un listado todos los comandos/programas/paquetes disponibles para instalar. El listado


es bastante grande.

pkg list-all

pkg list-installed

Muestra el listado de los comandos que ya están instalados en tu Termux. Este listado solo hace
referencia a paquetes que se han instalado por pkg. Esto significa que no verás en la lista
comandos como cp, cat, mv, ls, ... También significa que puedan aparecer algunos paquetes que
tu no instalases.

Por ejemplo si instalas una herramienta que utiliza una base de datos, es común que en el listado
te aparezcan tanto la herramienta que descargaste como la base de datos. Esto sucede porque
pkg se encarga de bajar las dependencias necesarias (para que las herramientas funcionen) por
su cuenta.

pkg list-installed
README

pkg show

Muestra información adicional incluyendo una breve descripción sobre el paquete que se
indique. Puedes utilizar el nombre de cualquiera de los paquetes listados con los 2 anteriores
subcomandos

pkg show unzip

El comando pkg show unzip nos muestra esta descripción para el comando unzip.

Package: unzip
Version: 6.0-7
Maintainer: Termux members @termux
Installed-Size: 340 kB
Depends: libbz2
Homepage: https://sourceforge.net/projects/infozip/
Download-Size: 115 kB
APT-Manual-Installed: yes
APT-Sources: https://termux.org/packages stable/main aarch64 Packages
Description: Tools for working with zip files

En este ejemplo la información que se nos muestra indica:

El nombre del paquete


La versión del programa
Las personas/organización que se encargan de gestionar este paquete
El tamaño que ocupará en el sistema una vez instalado
Otros paquetes que necesita para funcionar
La página oficial del programa (o repositorio de su código fuente)
El tamaño de la descarga comprimida
Si se instaló manualmente
Repositorio donde está el paquete listado
Descripción de que es el paquete

Si tienes la opción de buscar en Google el paquete, te será de mas ayuda para saber
exactamente para que sirve.

pkg install

Instala un comando en Termux.

pkg install tree

Una vez instalado, ya podras utilizarlo.


Es posible que se muestre un error si el repositorio por defecto no está disponible. Si este es tu
caso, corre el comando termux-change-repo. Presiona enter sobre Main Repository para poder
ver un listado de los servidores disponibles y cambia el servidos moviéndote por el listado hacia
abajo, presionando espacio para marcar tu selección y enter para guardar los cambios.

Tree es similar a ls pero también muestra todos los subdirectorios.

tree

pkg uninstall

Desinstala un comando en Termux.

pkg uninstall tree

Una vez desinstalado, se borrará permanentemente del sistema el comando que hayas escrito en
este caso tree. Si intentas volver a utilizarlo tras desinstalarlo, verás que ya no existe.

Puedes borrarlo si quieres, siempre podrás volver a instalarlo si lo necesitas.

pkg upgrade

Actualiza todos los paquetes instalados.

pkg update

Si tienes espacio de sobra, es recomendado que todos los días actualices tus comandos usando
pkg upgrade Las actualizaciones, sirven principalmente para mantener tus paquetes seguros.
Cuando un programador o hacker, encuentra un fallo de seguridad en un programa, se programa
un código (parche de seguridad). Cuando tu le das a actualizar, se instalan estos parches
automáticamente. También se instalan parches de mejoras de rendimiento para que los
comandos se ejecuten mas rápido o utilicen menos batería, asi como también nuevas
funcionalidades.
man

El comando man sirve para mostrar el manual de un comando, si lo tiene.

man ls

Con man ls se nos muestra el manual para el comando ls, con todas sus opciones extra.

man son la iniciales de manual

Para salir de man utiliza la combinación de teclas ESC : q

exit

Cierra la terminal

Argumentos

Los comandos de GNU/Linux aceptan argumentos especiales que van precedidos de guiones.
Hay 2 formas de argumentos con guiones. La forma corta y la forma léxica del argumento. La
forma corta es siempre una letra, normalmente la inicial de la forma léxica.

Uno de los argumentos que vamos a encontrar presentes en prácticamente todos los comandos
es -h. Versión corta de --help. Normalmente podemos acompañar nuestros comandos de
cualquiera de estos indistintamente, aunque no hay ninguna norma escrita y muchos
desarrolladores muestran distintos mensajes de ayuda según utilizas la versión corta o la léxica.
Yo suelo dar prioridad a las opción léxica del argumento help.

ls --help

Tabla de Contenidos

Capítulo 5: Introducción a Bash

Bash es una shell de comandos. Todos los comandos que usamos hasta ahora, han sido
enviados a Bash y Bash es quien se ha encargado de interpretarlos y llamar a los paquetes
correspondientes. Se encarga de procesar el texto que le introducimos y el símbolo dolar $ nos
está indicando que se trata de una Shell normal.

En Linux cuando eres root usando el comando sudo su el dolar se cambia por un hash
(asterisco) #. En Android no disponemos de root por defecto, y este libro asume que no eres
root. Es posible obtenerlo, pero yo no lo recomiendo en Android por motivos de seguridad del
sistema.

Bash no es un simple intérprete, si no que admite un gran número de instrucciones muy diversas
y tambien algunas complejas, dando lugar a un lenguaje de programación potente ampliamente
utilizado para configurar sistemas GNU/Linux, crear comandos y otro tipo de utilidades.

Variables

Las variables te permiten almacenar valores para poder utilizarlos mas adelante.

Para almacenar texto en una variable usaremos la siguiente sintaxis


nombreDeLaVariable="valorDeLaVariable"

miNombre="Manolo"

También es posible almacenar el resultado de un comando en la variable utilizando la sintaxis


nombreDeLaVariable=$(comando argumentos)

listaArchivosEnHome=$(ls ~)
Podremos referenciar la variable anteponiendo el símbolo del dolar al nombre de la variable,
como veremos en el siguiente apartado.

Imprimir en pantalla

Para imprimir texto o el contenido de variables (en este caso en pantalla) podemos utilizar echo
o printf.

echo

echo es un comando sencillo para imprimir texto

miNombre="Manolo"
echo "Hola, mi nombre es $miNombre"

Puedes usar variables como en el ejemplo anterior, y también comandos:

echo "Hola, te encuentras en el directorio $(pwd)"

Si quieres que se imprima un salto de linea, puedes anteponer el argumento simple -e del texto. Y
en el texto incluyes la secuencia de caracteres \n para indicar un salto de linea.

echo "$(clear)\n\n\n\n\n\n\n\n\n\nHola, te encuentras en el directorio\n$(pwd)\nNo es genial\n?\n\n"

printf

printf hace lo mismo que echo pero se ejecuta mas rápido y permite mas opciones para
formatear el texto.

miNombre="Manolo"
printf "Hola, mi nombre es %s" "$miNombre"

Con respecto a echo, puedes apreciar que no se añade el salto de linea al final de la frase. Tienes
que añadirla manualmente. También ves en el comando que las variables se separan en otros
argumentos a parte. En este caso %s indica que la variable es un string (cadena de texto).

Otra de las ventajas de printf, es que nos avisa de errores. Por ejemplo %d sirve para imprimir
numeros enteros. Si le pasamos como argumento un numero que no es entero, nos avisará del
error

numeroPI="3.1416"
printf "El numero PI es %d" "$numeroPI"

Bash nos indicará el error: bash: printf: 3.1416: invalid number e imprimirá solo la parte entera.
Esta es la lista de tipos que acepta:
secuencia tipo descripción

%d digit Números enteros

%f float Números flotantes (numeros con decimales)

%s string Cadena de texto

%x hexadecimal Imprime un número en hexadecimal

%X hexadecimal Imprime un número en hexadecimal (letras en mayúsculas)

Leer de la terminal

Podemos interactura con el usuario de múltiples formas.

read

El comando read nos permite leer datos de la entrada de la terminal. Nosotros usaremos read
con el argumento simple -p (la p es de la palabra prompt, en español sugerencia) y nos srive para
sugerir al usuario el tipo de datos que queremos que introduza.

Si por ejemplo queremos preguntarle el nombre al usuario

read -p "Cómo te llamas? " nombre


echo "Tu nombre es $nombre"

En este ejemplo vemos que readme se parece a echo, pero admite un argumento extra, que será
el nombre de la variable en la cual queremos que se guarden los datos que introduzca el usuario.

read significa leer

Condicionales

Los condicionales permiten realizar acciones si se cumple una condición. if [ condición ]; then
comando fi. En español se traduciría a algo similar a sì [ seCumpleEstaCondición ]; entonces
ejecutaEsteComando fin. Podemos ver un ejemplo.

read -p "Introduce tu edad y pulsa enter: " edad


if [ "$edad" -gt 17 ]; then
echo "Eres mayor de edad"
fi

En este ejemplo tenemos:

Un read
Almacena la edad que introduce el usuario en la variable edad.
La palabra clave if
Indica que la expresión es un condicional
Unos corchetes (que también son comandos, aunque no lo parezcan)
Evaluan la siguiente expresión y delimitan donde empieza ([) y acaba (]) la condición
El punto y coma (;)
Sirve para indicar el final de los comandos asociados a if
La palabra then
Indica que a continuación vienen las instrucciones que queremos que se ejecuten si se ha
cumplido la condición.
Un echo que imprime un texto
Aunque podría ser cualquier otro comando, asignación de variables, etc.
Y la palabra fi (es if al revés) Indica el final del condicional

La condición "$edad" -gt 17 está compuesta de 3 elementos:

"$edad" Es una variable que contiene la edad del usuario


-gt Es un operador especial de Bash, siglas de Greater Than (Mayor Que). Sería equivalente al
operador matemático >
17
Si la edad del usuario es mayor que 17, entonces es mayor de edad (18 años o más en mi país)

Recuerdas que te dije que [ era un comando mas? Igual que echo o printf. Pues [ también tiene
argumentos. Hay distintos tipos de condiciones, aquí un listado de las mas comunes:

[ -a listaDeLaCompra.txt ]

Se cumple si el archivo existe

[ -d ejemplo ]

Se cumple si la carpeta existe

[ -f listaDeLaCompra.txt ]

Se cumple si el archivo existe y es un archivo normal

[ -s listaDeLaCompra.txt ]

Se cumple si el archivo existe y no está vacio

[ listaDeLaCompra.txt -nt otraListaDeLaCompra.txt ]

Se cumple si el primer archivo es mas reciente que el segundo

nt abreviado de newer than (mas nuevo que)

[ listaDeLaCompra.txt -ot recetaChurros.txt ]

Se cumple si el primer archivo es mas viejo que el segundo

ot abreviado de older than (mas viejo que)

[ -z "$nombre" ]

Se cumple si la variable está vacia

[ -n "$nombre" ]

Se cumple si la variable no está vacia


[ "$nombre" = "Paco" ]

Se cumple si el contendio de la variable $nombre es Paco

[ "$nombre" != "Paco" ]

Se cumple si el contenido de la variable $nombre no es Paco

[ "$nombre" < "Paco" ]

Se cumple si el contenido de la variable $nombre se posiciona antes que Paco, alfabéticamente

[ "$nombre" > "Paco" ]

Se cumple si el contenido de la variable $nombre se posiciona después que Paco,


alfabéticamente

[ -v "$nombre" ]

Se cumple si la variable existe

[ ! condicion ]

Se cumple si la condición no se cumple

[ condicion -o otraCondicion ]

Se cumple si cualquiera de las 2 condiciones se cumple (o ambas se cumplen)

[ condicion -a otraCondicion ]

Se cumple solo si ambas condiciones se cumplen

[ 7 -eq 7 ]

Se cumple si el primer número es igual al segundo (recuerda que puedes usar variables)

eq de equals (igual a)

[ 7 -ne 7 ]
Se cumple si el primer número es distinto al segundo

ne de not equal (no igual a)

[ 7 -lt 7 ]

Se cumple si el primer numero es menor que el segundo

lt de less than (menor que)

[ 7 -le 7 ]

Se cumple si el primer número es menor o igual al segundo

le de less equal (menor o igual a)

[ 7 -gt 7 ]

Se cumple si el primer número es mayor que el segundo

gt de greater than (mayor que)

[ 7 -ge 7 ]

Se cumple si el primer número es mayor o igual que el segundo

ge de greater equal (mayor o igual a)

A parte de if, hay un par de palabras mas que podemos utilizar en los condicionales.
El comando else permite ejecutar comandos si la condición no se ha cumplido. Queda mas claro
con un ejemplo:

read -p "Introduce tu edad y pulsa enter: " edad


if [ "$edad" -gt 17 ]; then
echo "Eres mayor de edad"
else
echo "Eres menor de edad"
fi

Si pruebas el ejemplo pegándolo en tu terminal y pulsando enter, verás que si se cumple la


condición mostrará el texto indicando que eres mayor de edad, y si no se cumple, te dirá que eres
menor de edad.

La última palabra clave es elif, y sirve para introducir mas if, que se ejecutarán solo si el anterior
if no se cumple. Ejemplo:

read -p "Introduce tu edad y pulsa enter: " edad


if [ "$edad" -lt 12 ]; then
echo "Eres un niño"
elif [ "$edad" -lt 18 ]; then
echo "Eres un adolescente"
elif [ "$edad" -lt 65 ]; then
echo "Eres un adulto"
else
echo "Eres un anciano"
fi

En español esto viene diciendo:

si (tienes menos de 12 años) entonces


muestra "Eres un niño"
en caso contrario, si (tienes menos de 18 años) entonces
muestra "Eres un adolescente"
en caso contrario, si (tienes menos de 65 años) entonces
muestra "Eres un adulto"
en caso contrario
muestra "Eres un anciano"

El comando case es una forma distinta de crear condicionales, en otros lenguajes se le conoce
como switch o también switch case y se utiliza principalmente cuando quieres comprobar la
variable con valores concretos

printf "1. Imprimir Directorio Actual\n2. Listar ficheros \n3. Crear Archivo\n4. Crear Carpeta\n\n0. Salir\n\nSelecci
read opcion
case $opcion in
1)
echo $(pwd)
;;

2)
echo $(ls)
;;

3)
read -p "Introduce el nombre que tendrá el nuevo fichero: " nombreFichero
touch $nombreFichero
;;

4)
read -p "Introduce el nombre que tendrá el nuevo directorio: " nombreDirectorio
mkdir $nombreDirectorio
;;

0)
echo "Adios"
;;

*)
echo "La opción que elegiste no existe"
;;
esac

Bucles

Los bucles nos permiten correr un comando/realizar una tarea de forma repetida.
Existen 4 tipos de bucles basicos en Bash. Los bucles while, until, for y select.

while

El comando while permite ejecutar comandos mientras la condición sea verdadera. Su sintaxis
es similar a la del condicional if. Ejemplo:

read -p "Introduce tu contraseña: " contra


while [ "$contra" != "admin123" ]; do
read -p "La contraseña '$contra' es incorrecta. Inténtalo de nuevo: " contra
done
echo "Acceso Permitido"
Si no supieses la contraseña, no sabrías como salir del programa. Cuando quieras cancelar la
ejecución de un programa que está en bucle, presiona las teclas CTRL y c. Si no funciona, prueba
con las teclas CTRL y d.

Otro tipo de bucles comunes son los bucles infinitos

while [ true ]; do
date
sleep 8s
done

En este ejemplo vamos a mostrar la fecha cada 8 segundos.

until

El bucle until es prácticamente igual al bucle while, con la diferencia de que se ejecutará
mientras no se alcance la condición.

read -p "Introduce tu contraseña: " contra


until [ "$contra" = "admin123" ]; do
read -p "La contraseña '$contra' es incorrecta. Inténtalo de nuevo: " contra
done
echo "Acceso Permitido"

Puedes usar while o until indistintamente. Until existe simplemente porque puede ser mas
sencilla de leer la expresión en inglés.
Los ejemplos anteriores en español dirían; Para while: Mientras (laContraseña no es igual a
"admin123") haz ...
Para until:
Hasta que (laContraseña no sea igual a "admin123") haz ...

for

El bucle for sirve principalmente para recorrer elemenos. Los elementos pueden ser frases,
palabras, secuencias numéricas, etc.

frase="Hola me llamo Manolo"


echo "La frase '$frase' tiene las siguientes palabras:"
for palabra in $frase; do
echo "$palabra"
done

Lo mismo que haces con palabras, puedes hacerlo directamente con la salida de comandos. Da
mucho juego

for archivo in $(ls ~); do


echo "$archivo"
done

También puedes recorrer rangos de números

echo "Los números del 1 al 20 son:"


for numero in {1..20}; do
printf "%d, " $numero
done

Si queremos omitir la última coma tras el 20, podemos usar un condicional:

echo "Los números del 1 al 20 son:"


for numero in {1..20}; do
if [ "$numero" -ne 20 ]; then
printf "%d, " $numero
else
printf "%d" $numero
fi
done

Hay otra forma de usar el for que le será familiar a quien utilice el for en otros lenguajes de
programación. Esta versión del for se le conoce como for clásico

for ((i=1; i <= 10; i++)) do


echo "$i"
done

Algunos lenguajes de programación no disponen del bucle for clásico, pero si tienen el while.
Hay una forma simple de conseguir esta misma funcionalidad con el bucle while

i=1
while [ $i -le 10 ]; do
echo "$i"
((++i))
done

select

El bucle select es un tipo de bucle ideal para hacer menus de forma sencilla.

opciones="Sumar Restar Multiplicar Dividir Salir"


select opcion in $opciones; do
if [ "$opcion" = "Salir" ]; then
echo "Adios"
break
fi

read -p "Introduce el primer número: " primerNumero


read -p "Introduce el segundo número: " segundoNumero
if [ "$opcion" = "Sumar" ]; then
resultado=$(( $primerNumero + $segundoNumero ))
elif [ "$opcion" = "Restar" ]; then
resultado=$(( $primerNumero - $segundoNumero ))
elif [ "$opcion" = "Multiplicar" ]; then
resultado=$(( $primerNumero * $segundoNumero ))
elif [ "$opcion" = "Dividir" ]; then
resultado=$(( $primerNumero / $segundoNumero ))
else
resultado="Opcion incorrecta."
fi

echo "El resultado es $resultado";


done

En este ejemplo podemos ver una calculadora simple en Bash. A destacar la palabra break que
sirve para salir de cualquier tipo de bucle.

funciones

Las funciones en Bash nos permiten agrupar varias instrucciones bajo el mismo nombre y son
similares a los comandos en su uso. Para crear una función:

saludar() {
echo "hola $1, bienvenido a mi programa"
}

De esta forma creamos una función que podremos reusar las veces que queramos. La principal
utilidad de las funciones es reducir el tamaño del código.
saludar() {
echo "hola $1, bienvenido a mi programa"
}

saludar "Manolo"
saludar "Arturo"

Como puedes ver, puedes saludar a tantos usuarios como quieras sin necesidad de tener que
escribir el mismo texto una y otra vez. Puedes poner cualquier tipo de comandos dentro de las
funciones.

Si quieres que quede mas claro que estás creando una función, puedes usar la palabra clave
function y omitir los paréntesis:

function saludar {
echo "hola $1, bienvenido a mi programa"
}

saludar "Manolo"
saludar "Arturo"

Puedes usar cualquier de las 2 formas, la que tu prefieras. A destacar el uso del dolar. Sirve para
referenciar argumentos. $1 referencia el primer argumento. Puedes utilizar todos los que tu
quieras:

saludar() {
echo "Quiero dar la bienvenida a $1, $2 y $3"
}

saludar "Manolo" "Arturo" "Jose"

Miscelanea (otros operadores)

Bash permite realizar redirecciones entre comandos, salida a pantalla, entrada a comandos y
ficheros. Una redirección es el envio de texto desde un fichero a otro. Todo lo que vemos en
pantalla en realidad es enviado a un fichero de texto y Bash se encarga de imprimir su contenido
para que lo veamos.

>

El caracter > nos permite enviar la salida de un comando hacia un fichero. Si el nombre del
fichero no existe, se creará uno nuevo.

echo -e "Lista de la compra:\n2 paquetes de letejas\n1 cartón de leche" > ~/miListaDeLaCompra.txt

Con el > indicamos que en lugar de mostrar el texto en pantalla queremos que se mande al
archivo miListaDeLaCompra.txt que está ubicado en la carpeta ~ (home). Si el archivo no existe
> se encarga de crearlo antes de volcar la salida del comando echo, y si este archivo ya existía en
home, se le borrará todo el contenido antes de añadir el nuevo contenido

Ahora puedes imprimir su contenido cuando quieras

cat ~/miListaDeLaCompra.txt

La extensión .txt no hace nada, ninguna extensión hace nada en particular. Solo se añaden para
ayudar al usuario o a otros programas a intuir que tipo de datos puede contener el fichero.

Otro uso común es ocultar la salida de un comando. Para ello redirigimos la salida a un archivo
especial diseñado para ello.

echo "Hola" > /dev/null


Redirigir a /dev/null es una práctica común cuando queremos correr un comando pero no nos
interesa lo que nos muestre. Puede ser el caso de un servidor de una página web cuando
muestra los logs en pantalla y no nos interesan.

Aunque redirigas la salida a /dev/null los comandos siguen mostrando los errores en pantalla si
estos se dan. Si quieres ocultar los errores, debes redirigir un archivo especial hacia /dev/null

cat esteArchicoNoExiste.txt 2>/dev/null

>>

Qué pasa si quiesieses añadir un nuevo producto a tu lista de la compra sin eliminar el contenido
del fichero? Se utiliza el operador >> en lugar de >. Al igual que >, si no existe el fichero también
se creará, pero si ya existe el fichero, en lugar de remplazar su contenido por el nuevo que
indiquemos, se añadirá al que ya existe.

echo -e "\n6 latas de mejillones" >> ~/miListaDeLaCompra.txt

Puedes redirigir la salida de cualquier comando, no solo de echo

El operador | sirve para redirigir la salida de un comando hacia otro comando.


Existen una multitud de utilidades que son perfectas para su uso con |

echo "Hola qué tal?" | wc

El comando wc (word counter en español, contador de palabras) muestra el número de lineas,


palabras y caracteres que tiene un texto. En este caso el texto lo pasamos del comando echo
hacia el comando wc utilizando |

||

El operador || (OR) sirve para ejecutar un comando si el anterior falla.

cat esteArchivoNoExiste.txt || echo "El archivo no existe"

Es común redirigir los errores a /dev/null y mostrar nuestros errores personalizados

cat archivoQueNoExiste 2>/dev/null || echo "No se pudo mostrar el contenido del archivo"

&

El operador & sirve para crear jobs (trabajos en español) mandando a comandos que se están
ejecutando a un segundo plano hasta que estos finalicen por si mismos o nosostros los
finalicemos de alguna de las múltiples formas que existen.

despedirse() {
sleep 5s
printf "Adios"
sleep 5s
printf ", ha sido un placer!"
}

despedirse &

El comando sleep (dormir en español) pausa el programa durante el tiempo que le indiquemos.
En este ejemplo son dos intervalos de 5s (segundos) cada uno.
Puedes ver los comandos que tengas corriendo en segundo plano (background) con el comando
jobs, la salida para este ejemplo sería:

[1]+ Running despedirse &

El número de la izquierda es un identificador. La primera palabra running (corriendo) nos dice el


estado actual del job y a la derecha de todo encontramos el comando que ejecutamos.

Puedes traer el proceso al frente (foreground) usando el comando fg %1, el número tiene que ser
el identificador mostrado en el comando jobs. Y como puede forzar el cierre del proceso con las
combinaciones de teclas que vimos en apartados anteriores de este mismo capítulo (CTRL C,
CTRL D)

&&

El operador && (AND) sirve para ejecutar un comando si el anterior funcionó correctamente.

cat archivoQueExista && echo "El archivo existe y se imprimió correctamente"

Muy útil cuando queramos que un comando solo se ejecute si el anterior funcionó

pkg install tree && tree

El operador ; es útil para indicar el fin de un comando. Es de uso común cuando quieres correr
varios comandos en la misma linea independientemente de si el comando anterior falla o no

cat archivo1.txt; cat archivo2.txt; echo "Adios"

help

El comando help nos proporciona ayuda con Bash.

help

Si corres el comando, verás un listado de los comandos internos de Bash que disponen de un
mensaje de ayuda. Puedes consultar cada uno de ellos escribiendo help y el nombre del
comando que quieres consultar.

help history

Extra

Puedes reutilizar los comandos de una linea de la terminal navegando por el historial si le das a
las flecha hacia arriba y hacia abajo.

Si pones # al inicio o final de una linea, estás indicando que la linea a partir del # es un
comentario que Bash debe ignorar. Los comentarios son útiles para indicar lo que hace el
código. Ejemplo:

# La siguiente linea imprime un texto en pantalla saludando


echo "Hola"
echo "Adios" # Esta linea imprime Adios en pantalla
Bash te permite autompletar comandos, nombre de carpetas y ficheros... Pulsa la tecla tab para
ello. Si hay varios resultados no sucederá nada, pero si vuelves a pulsar otra vez tab, los
resultados disponibles se mostraran para que puedas tener una vista previa de que comando o
archivo quieres autocompletar. Tendrás que escribir caracteres hasta que el texto que tengas
escrito solo coincida con uno de los comandos o archivos disponibles.

Si por ejemplo tienes un archivo que se llama


miFoto_729272927282729172917291919372919172728191928372891.jpg, y quisieses
eliminarlo, en lugar de escribir todo el nombre, podrías escribir solo rm miFo y pulsar la tecla tab
para que el nombre se autocompletase. Si también existe otro archivo que se llama
miFortaleza.txt, cuando pulsas tab, Bash no sabe cual de los 2 archivos autocompletar, ya que
ambos empiezan por miFo. Si vuelves a pulsar tab, ambos saldrán en pantalla para indicarte que
debes seguir escribiendo. rm miFot sería suciente para que se autocompletase miFoto_.... al
pulsar tab.

En Termux la tecla tab se representa por 2 flechas y esta ubicada entre ESC y CTRL

En lugar de utilizar secuencias de caracteres para saltos de linea, puedes usar comillas simples

echo 'Hola
Los saltos de linea también se imprimen asì
No es genial?'

Si utilizas comillas simples, todo lo que escribas dentro será interpretado como texto, entre otras
cosas esto te inhabilita de utilizar variables dentro. Ejemplo:

nombre=Manolo
echo 'Mi nombre es $nombre'

Si utilizas printf en lugar de echo, si podrás insertar variables de la siguiente forma

nombre=Manolo
printf 'Mi nombre es %s' $nombre

Tabla de Contenidos

Capítulo 6: Uso de VI y de VIM

VI y VIM son editores de texto muy completos. VI es la versión mas pequeña y suele venir por
defecto instalado en muchos sistemas. VIM es su hermano mayor e incluye cientos de
características. Por si fueran pocas, la comunidad de programadores va creando sus plugins,
temas y colores para VIM para extender aún mas su funcionalidad.

Dado lo extenso de VI y VIM, pondré el foco en los comandos y atajos que yo mas utilizo, dejando
de lado muchísima funcionalidad útil. VIM por si solo daría para un libro entero y no es mi idea
reinventar la rueda escribiendo un libro de VIM, asique centrando el tiro.

Instalar VIM

VI suele venir instalado, pero VIM no. Es un paquete mas, asique usaremos el comando que ya
conocemos para instalar paquetes en Termux

pkg install vim

Abrir un fichero

Para abrir un archivo que ya existe o crear uno nuevo, usaremos el siguiente comando

vim miListaDeLaCompra.txt
Verás que se abre una nueva pantalla desconocida hasta ahora. A lo primero que tenemos que
echar ojo es a la barra de estado de VIM. Se encuentra exactamente encima del teclado a la
izquierda y si no tocas nada tras abrir el archivo, verás el mensaje: "miListaDeLaCompra.txt"
[new] en la barra de estado de VIM.

Si el archivo ya existía, el mensaje será: "miListaDeLaCompra.txt" xL xB donde xL mostrará el


número de lineas que tiene el archivo y xB el número de Bytes (un caracter suele pesar al menos
1 Byte, asique es un buen indicador del número aproximado de caracteres que tiene el archivo)
que tiene.

Escribir en un fichero

Si pulsas la tecla i, verás como el estado cambia a -- INSERT --. Esto nos indica que ahora nos
encontramos en modo inserción de texto. Si ahora pulsas las teclas, podrás escribir en el archivo
al igual que haces en el mítico bloc de notas de Windows.

Una vez que tengas tu texto escrito, puedes salir del modo inserción pulsando la tecla ESC. Si te
fijas ahora, encima de la barra de estado, que se encontrará vacia tras pulsar ESC, se mostrará el
símbolo [+] que nos indica que el archivo tiene cambios sin guardar.

Guardar los cambios

Hay varias formas de guardar los cambios. Si queremos guardar los cambios pero continuar
usando VIM, usaremos la combinación de teclas ESC :w, verás que se muestra :w en la barra de
estado. Pulsa Enter para introducir la secuencia. El [+] desaparecerá, indicando que ya no hay
nuevos cambios sin guardar. En la barra de estado verás que se muestra el mismo tipo de
mensaje que antes y al final hay una nueva palabra written indicándonos que se han escrito los
cambios en el archivo.

Si quieres guardar los cambios y cerrar VIM, en lugar de :w, debes utilizar :x

Salir de VIM

Si no hay cambios pendientes en el archivo, puedes cerrar VIM utilizando :q. Recuerda que no
debes estar en el modo insercion, si estás en ese modo, en su lugar acabarás escribiendo el
texto ":q" en el documento.

Si tienes cambios en el documento pero quieres salir de todas formas y descartar los cambios
que hiciste, debes introducir :q!. Solo se descartarán los cambios que no guardases con :w

Cifrar un archivo

Es posible cifrar un archivo utilizando :X. VIM te pedirá una contraseña y que repitas tu
contraseña. Una vez cifrado debes guardar los cambios. Tras guardar los cambios, si no saliste
de VIM en la barra de estado se te indicará el algoritmo de cifrado utilizado. En mi caso es
blowfish2.

Navegación

En VIM puedes tocar sobre el texto del fichero para posicionar el cursor. Tras tener el cursor
posicionado, se puede usar el caracter i para entrar en modo insercion en el caracter en el que
esté el cursor. Si quieres posicionarte para escribir delante de donde tienes el cursor utiliza a en
lugar de i

También puedes entrar en modo inserción al principio de la linea usando I, al inicio de la linea
siguiente (añadiendo un salto de linea en el proceso) utilizando o, en la linea anterior (añadiendo
un salto de linea en el proceso) utilizando O, en el caracter actual (eliminándolo en el proceso)
utilizando x

A parte de moverte tocando el texto e insertar usando teclas, también puedes moverte utilizando
distintas teclas. Con w te mueves a la siguiente palabra, con b te mueves a la palabra anterior,
con e te mueves al final de la palabra actual, con $ te mueves al final de la linea actual, con 0 te
mueves al inicio de la linea.
Si quieres moverte a la linea anterior k, a la linea siguiente j, al caracter anterior h, al caracter
siguiente l. Si añades un número antes de cualquiera de estas opciones the moverás la cantidad
indicada de caracteres/lineas.

Si quieres moverte al inicio del archivo gg, a la última linea del archivo G. Puedes ir a lineas
concretas poniendo : y el número de la linea concreta a la que quires ir. Por ejemplo si quieres ir a
la tercera linea del fichero :3 y pulsas enter.

Eliminar contenido

También puedes eliminar palabras, lineas, caracteres o partes concretas del archivo. Los
comandos son los mismos que los de mover el cursor, pero anteponiendo d. Ejemplos:

# Recuerda que estos son comentarios, y su única finalidad es que tu los leas

dd # Eliminar la linea en la que está el cursor


d$ # Eliminar desde el cursor hasta el final de la linea
d0 # Eliminar desde el cursor hasta el inicio de la linea
dw # Eliminar desde el cursor hasta el final de la palabra
dgg # Eliminar desde el cursor hasta el inicio del archivo
dG # Eliminar desde el cursor hasta el final del archivo
d16 # Eliminar desde el cursor 16 lineas

Substituir texto

En VIM se pueden substituir todas las palabras de un texto de forma sencilla usando expresiones
regulares. Si quieres substituir todas las palabras que digan "hola" por "adios", utilizas el
comando

:%s/hola/adios/g # substituye todos los hola por adios


:%s/hola/adios/gi # substituye todos los hola por adios aunque tengan mayúsculas

Cuando la palabra/texto tenga caracteres especiales, debes escaparlos usando la barra de


escape \.

A veces nos equivocamos y queremos deshacer las últimas acciones, para ello puedes usar u.
También puedes rehacer los cambios que hayas eliminado con u utilizando CTRL r. Si cierras
VIM, se perderá el historial y no podrás deshacer ni rehacer.

Modo Visual

A parte del modo comando que estamos usando y del modo inserción, también hay un modo
visual al que podemos acceder desde el modo comando pulsando v.

Una vez estás en el modo visual, podras mover el cursor con las teclas para remarcar un texto.
Una vez tienes el texto marcado puedes realizar múltiples acciones sobre él.

y # Copia el texto seleccionado


p # Pega el texto
x # Corta el texto seleccionado
> # Añade identación a las lineas (espacios)
< # Quita identación a las lineas (espacios)
u # Convierte a minúsculas
U # Convierte a mayúsculas

También puedes substituir palabras del texto seleccionado usando expresiones regulares

Manejo de ventanas y pestañas

En VIM también puedes abrir múltiples ventanas con la combinación CTRL w v. Cada vez que
pulses esta combinación, abrirás una ventana nueva. Si prefieres que la ventana se abra debajo
de la actual en lugar de al lado, utiliza CTRL w s. Puedes combinarlas y tener ambos tipos de
ventanas abiertas a la vez.
Puedes modificar el ancho de la ventana usando CTRL w > para aumentar su ancho o CTRL w <
para reducirlo.

Puedes modificar la altura de la ventana usando CTRL w + para aumentarla o CTRL w - para
reducirla.

Si vas a cerrar el archivo actual, para abrir otro distinto, en su lugar puedes hacer directamente
:open nombreDelArchivo.txt, sirve tanto para nuevos archivos, como para archivos que ya
existen.

Otra opción para abrir un nuevo archivo, esta vez, sin cerrar el actual es :e nombreDelArchivo.txt.
Puedes cambiar entre archivos utilizando :bn y :bN

La opción :tabnew ejemplo.txt sirve para abrir el archivo indicado en una nueva pestaña. Puedes
moverte entre las pestañas abiertas utilizando :b#

Realizar búsquedas

Puedes buscar palabras si pones una /. Ejemplo:

/hola

Una vez tengas tu palabra resaltada, puedes fijarla usando enter. Al estar la búsqueda fija, podras
moverte a la siguiente palabra que cumpla tu búsqueda utilizando el caracter n o a la anterior
utilizando N

Tabla de Contenidos

Capitulo 7: Configuración de Bash

Bash tiene múltiples opciones de configuración y hay varias formas de configurarlo dependiendo
del sistema. En Termux lo configuraremos utilizando el archivo .bashrc.

Este archivo debemos crearlo en la carpeta Home. Usaremos vim para ello.

vim ~/.bashrc

Todos los comandos que escribamos en este archivo se ejecutarán cada vez que iniciemos
Termux, o cuando iniciemos una nueva pestaña de Termux.

Al final del capítulo veremos como activar todo lo que tengamos en el archivo sin necesidad de
abrir una nueva terminal, para poder visualizar los cambios directamente en la terminal actual.

Lo primero será añadir el siguiente texto en el archivo:

# Si Bash no es interactivo, detiene la lectura de este archivo


case $- in
*i*)
;;

*)
return
;;
esac

Este pequeño script/código sirve para que no se configuren las terminales de Bash que no sean
interactivas. Esto sirve para evitar que se configure Bash cuando lo utilizemos para correr un
comando. Por ejemplo bash miArchivo.sh. En el capítulo 9: Creando comandos lo entenderás
mejor.

EDITOR
La variable "$EDITOR" sirve para configurar un editor de texto como editor por defecto de Bash.

export EDITOR='vim'

Al exportar la variable "$EDITOR" indicando que se use vim, podremos editar los comandos que
estamos escribiendo en la terminal usando la combinación de teclas CTRL X CTRL E.

histappend

El argumento histappend sirve para que el historial se comparta entre pestañas, ventanas y
sesiones. Nos servirá para asegurarnos que si abrimos una nueva terminal, tengamos accesible
el historial, permitiéndonos reutilizar los comandos sin tener que escribirlos de 0. Si lo quieres
activar añádelo a una nueva linea:

shopt -s histappend

checkwinsize

El argumento checkwinsize hará comprobaciones automáticas tras dar o quitar zoom en Termux
para ajustar las filas y columnas de las tablas que tengamos impresas en pantalla.

shopt -s checkwinsize

autocd

El argumento autocd nos permite omitir cd para entrar en carpetas. Es útil para todas aquellas
carpetas que no compartan nombre con comandos instalados.

shopt -s autocd

Con este opción, si tienes una carpeta que se llama fotos, en lugar de escribir cd fotos para
entrar en ella, podrás escribir directamente fotos. Si por ejemplo nombrases a tu carpeta ls,
entonces no funcionaría porque estarías corriendo el comando ls en lugar de ingresar a la
carpeta ls.

cdable_vars

El argumento cdable_vars te permitirá utilizar cd con variables si el nombre de la variable no


coincide con el de una carpeta a la que puedes hacer cd.

shopt -s cdable_vars

Cuando activemos el archivo .bashrc, podremos hacer lo siguiente para ir a la carpeta ejemplo (si
esta existe en HOME) desde cualquier lugar.

EJEMPLO=/data/data/com.termux/files/home/ejemplo
cd EJEMPLO

Si existiese una carpeta llamada EJEMPLO, cd entraría dentro de esta, si no existe es entonces
cuando se comprobaría si $EJEMPLO existe y se haría cd a la ruta que tenga esta variable.

cdspell

El argumento cdspell te permitirá utiliza cd sobre archivos cuando cometas pequeños errores
ortograficos. Si tienes una carpeta que se llama ejemplo y escribes por error cd ejemplos Bash te
corregirá el error automáticamente.

shopt -s cdspell
globstar

El argumento globstar te permitirá utilizar ** para referenciar todos los archivos en el directorio y
subdirectorios referenciados

shopt -s globstar

Con un ejemplo se entiende mejor. Digamos que tenemos la siguiente estructura de archivos:

test/
├── adios.txt
├── carpeta
│ └── numeros.txt
└── hola.txt

Si utilizamos el comando cat test/** sin tener globstar activado, se imprimirá:

adios
cat: test/carpeta: Is a directory
hola

Si hemos activado globstar, el resultado será:

cat: test/: Is a directory


adios
cat: test/carpeta: Is a directory
1
2
3
hola

addPath

La función addPath nos será útil en el capìtulo 9, añádela también a este archivo. Sirve para
indicarle a Bash en que carpetas tenemos comandos.

addPath() {
if [ -d "$1" ] && [[ ":$PATH:" != *":$1:"* ]]; then
PATH="${PATH:+"$PATH:"}$1";
fi
}

extract

La función extract comprueba la extensión de un archivo comprimido y lo descomprime como


corresponda según la extensión detectada

extract() {
for archive in $*; do
if [ -f $archive ]; then
case $archive in
*.tar.bz2)
tar xvjf $archive
;;

*.tar.gz)
tar xvzf $archive
;;

*.bz2)
bunzip2 $archive
;;

*.rar)
rar x $archive
;;

*.gz)
gunzip $archive
;;

*.tar)
tar xvf $archive
;;

*.tbz2)
tar xvjf $archive
;;

*.tgz)
tar xvzf $archive
;;

*.zip)
unzip $archive
;;

*.Z)
uncompress $archive
;;

*.7z)
b7z x $archive
;;

*)
echo "don't know how to extract $archive..."
;;
esac
else
echo "$archive is not a valid file!"
fi
done
}

alias

En este archivo también podrás crear alias, que sirven para poder llamar a otros comando o
carpetas utilizando nombres personalizados. Aquí un ejemplo con alias que sirven para añadir
colores a algunos comandos.

alias ls='ls --color=auto'


alias dir='dir --color=auto'
alias vdir='vdir --color=auto'
alias grep='grep --color=auto'
alias fgrep='fgrep --color=auto'
alias egrep='egrep --color=auto'

Ahora cuando escribas el comando ls, Bash le añadirá el argumento --color=auto de forma
transparente.

Mas alias útiles que suelo utilizar:

alias l='ls' # Utiliza l en lugar de ls


alias la='ls -a' # Utiliza la para listar ficheros ocultos
alias v='vim' # Utiliza v en lugar de vim
alias c='clear' # Utiliza c en lugar de clear
alias cl='clear && ls' # Utiliza cl para limpisr la pantalla y listar
alias ..='cd ..' # Muevete a la carpeta 1 nivel superior
alias ...='cd ../..' # Muevete a la carpeta 2 niveles superior
alias ....='cd ../../..' # Muevete a la carpeta 3 niveles superior
alias .....='cd ../../../..' # Muevete a la carpeta 4 niveles superiores
alias pserv='python -m http.server' # Sirve la carpeta actual
alias gitc='"'"'git clone'"'"' # Clona un repositorio
alias 775='"'"'chmod +775'"'"' # Da permisos de ejecución
alias folder='du -h --max-depth=1' # Muestra el tamaño de ficheros
alias h='history' # Muestra el historial
alias myip='curl http://ifconfig.me/ip' # Muestra tu ip pública
alias quit='exit' # Cierra la terminal
alias q='exit' # Cierra la terminal
alias sb='source ~/.bashrc' # Actualiza los cambios en el archivo de Bash

colores

Exportar variables que guarden colores nos será muy útil. Por ejemplo para usarlos con echo u
otros comandos.

export red=$'\e[1;31m' # rojo


export green=$'\e[1;32m' # verde
export yellow=$'\e[1;33m' # amarillo
export blue=$'\e[1;34m' # azul
export cyan=$'\e[1;35m' # cian
export white=$'\e[1;37m' # blanco
export endc=$'\e[0m' # finaliza el color (color normal)
export lightgray=$'\e[0;37m' # gris claro
export black=$'\e[0;30m' # negro
export darkgray=$'\e[1;30m' # gris oscuro
export darkred=$'\e[0;31m' # rojo oscuro
export darkgreen=$'\e[0;32m' # verde oscuro
export darkyellow=$'\e[0;33m' # amarillo oscuro
export darkblue=$'\e[0;34m' # azul oscuro
export magenta=$'\e[0;35m' # magenta
export darkcyan=$'\e[0;36m' # cian oscuro
export underlinedarkgray=$'\e[0;30m' # subrayado gris oscuro

Ahora podemos usar los colores, por ejemplo para resaltar palabras de los manuales:

export LESS_TERMCAP_mb=${green};
export LESS_TERMCAP_md=${green};

Estos colores se aplicarán a las páginas mostradas por el comando man

prompts

La prompt de la terminal en Termux solo muestra un dolar. Podemos usar distintos comandos
para configurarla. Ya sea por utilidad o por estética. Aquí tienes el código de mi prompt:

PS1='\n\n${underlinedarkgray}${darkgray}(${blue}$(date +%H${darkgray}:${blue}%M${darkgray}:${blue}%S${darkgray}:${blu
PS2='${blue}.${endc} '

Como ves, esta prompt pinta la fecha, la hora, minutos, segundos... y el directorio actual de
trabajo. Así sabes siempre en que carpeta te encuentras sin necesidad de recurrir al comando
pwd directamente.

Para que se apliquen inmediatamente todos los cambios usaremos el comando source

source ~/.bashrc
Tabla de Contenidos

Capítulo 8: Sistema de Ficheros

En Termux así como en GNU/Linux, disponemos de un sistema base que incluye múltiples
archivos y carpetas. Vamos a conocer mejor la estuctura del sistema de ficheros de Termux.
(Puede variar un poco entre versiones)

com.termux/

Carpeta privada de la app Termux

com.termux/files/

Archivos de la aplicación

com.termux/files/home/

Carpeta principal del usuario

com.termux/files/home/.termux/

Archivos de configuración de la app como atajos de teclado de Termux

com.termux/files/home/.termux/termux.properties

Archivo con la configuración de la app de Termux. Atajos y ajustes de teclado, modo pantalla
completa, etc. Corre el comando termux-reload-settings para aplicar los cambios sin necesidad
de reiniciar la app.

com.termux/files/home/storage/

Se activa con el comando termux-setup-storage y te permite acceder a los archivos internos del
dispositivo.

com.termux/files/home/storage/dcim/

La usa la cámara para guardas las fotografías de la cámara

com.termux/files/home/storage/downloads/

Carpeta por defecto de Android para descargas

com.termux/files/home/storage/movies/

Carpeta para almacenar los videos del dispositivo

com.termux/files/home/storage/music/

La música se puede almacenar aquì

com.termux/files/home/storage/pictures/

Las imágenes del dispositivo se pueden guardar aquí

com.termux/files/home/storage/shared/

Carpeta compartida de propósito general para todas las apps

com.termux/files/usr/

Imita la carpeta / de GNU/Linux

com.termux/files/usr/bin/

Carpeta principal para ejecutables/comandos de Termux


com.termux/files/usr/etc/

Archivos de configuración diversos relacionados con el sistema o programas

com.termux/files/usr/etc/alternatives

Selecciona los ejecutables por defecto para trabajar con ciertos tipos de archivos. Por ejemplo el
enlace directo al editor de texto de Termux por defecto.

com.termux/files/usr/etc/apt/

Archivos del gestor de paquetes APT

com.termux/files/usr/etc/apt/apt.conf.d

Archivos de configuración de APT

com.termux/files/usr/etc/apt/preferences.d

Archivos para configurar las preferencias de APT, por ejemplo si quieres priorizar que se
descarge la versión mas reciente de los paquetes por defecto, priorizar que se descargen los
paquetes estables, ....

com.termux/files/usr/etc/apt/sources.list

Este es un archivo de configuración de APT (el sistema de gestión de paquetes de Debian) que
indica a APT dónde buscar paquetes para instalar. En este caso, se refiere a los repositorios que
se pueden usar en Termux.

com.termux/files/usr/etc/apt/trusted.gpg

Archivo de claves públicas utilizados por APT para verificar la autenticidad de los paquetes
descargados de los repositorios. trusted.gpg contiene las claves de confianza que se aplican a
todos los repositorios.

com.termux/files/usr/etc/apt/trusted.gpg.d

Trusted.gpg.d es un directorio que contiene archivos adicionales de claves de confianza para


repositorios específicos.

com.termux/files/usr/etc/bash.bashrc

Este es un archivo de configuración de shell de Bash, que se ejecuta cada vez que se inicia una
sesión de Bash en Termux. Aquí se pueden agregar alias, variables de entorno y otras
configuraciones personalizadas para Bash.

com.termux/files/usr/etc/bindresvport.blacklist

Se utiliza para especificar los puertos que deben evitarse al enlazar un socket en el sistema. Los
puertos incluidos en este archivo son los que están reservados por el sistema operativo y no
deben ser utilizados por aplicaciones normales, ya que pueden causar conflictos con otros
servicios del sistema. El archivo puede ser editado para agregar o quitar puertos de la lista negra
según sea necesario.

com.termux/files/usr/etc/inputrc

Este es un archivo de configuración de readline, que controla el comportamiento de la entrada de


texto en la línea de comandos. Aquí se pueden configurar atajos de teclado y otras opciones
relacionadas con la entrada de texto.

com.termux/files/usr/etc/motd

Archivo de mensaje de bienvenida que se muestra al iniciar sesión en la terminal.

com.termux/files/usr/etc/motd-playstore

Archivo de mensaje de bienvenida que se muestra solo cuando se instala Termux desde Google
Play Store.
com.termux/files/usr/etc/nanorc

Archivo de configuración utilizado por el editor de texto "Nano" que contiene configuraciones
para personalizar la interfaz de usuario y las funciones del editor de texto Nano, como el color del
texto, los atajos de teclado, el número de espacios por tabulación y mucho más.

com.termux/files/usr/etc/netconfig

Este archivo es utilizado por los programas que necesitan acceder a la red, como los
navegadores web o los clientes de correo electrónico, para determinar cómo conectarse a
Internet y cómo acceder a los servicios de red. El archivo netconfig también puede contener
información sobre la configuración de proxy y otras opciones de red.

com.termux/files/usr/etc/profile

Archivo de configuración de shell que se ejecuta cada vez que se inicia una sesión de shell en
Termux. profile es el archivo de configuración principal.

com.termux/files/usr/etc/profile.d

Directorio que contiene archivos de configuración adicionales que se ejecutan después de


profile.

com.termux/files/usr/etc/profile.d/gawk.csh

Este archivo es parte del paquete "gawk" y contiene configuraciones de variables de entorno
específicas de la aplicación gawk. Es ejecutado automáticamente cuando se inicia el shell de
Termux y se carga la aplicación gawk. La función de este archivo es establecer variables de
entorno para la aplicación, lo que permite que el software funcione correctamente.

com.termux/files/usr/etc/profile.d/gawk.sh

Este archivo agrega algunas configuraciones específicas para el programa gawk en la variable de
entorno PATH, que es la ruta de búsqueda para los ejecutables. En concreto, agrega el directorio
/data/data/com.termux/files/usr/bin al principio de la ruta de búsqueda y luego exporta la
variable AWK para que apunte al programa gawk. Esto permite que gawk se ejecute directamente
desde la línea de comandos sin tener que proporcionar la ruta completa al ejecutable.

com.termux/files/usr/etc/profile.d/init-termux-properties.sh

Script de shell que se ejecuta automáticamente cada vez que se inicia una sesión de terminal en
Termux. Este script se utiliza para establecer algunas propiedades de Termux, como el color de
la terminal, el comportamiento del teclado, el directorio de trabajo predeterminado, etc.

com.termux/files/usr/etc/termux-login.sh

Script de inicio de sesión que se ejecuta al iniciar sesión en la aplicación Termux en un


dispositivo Android. Este archivo permite personalizar el inicio de sesión de Termux y configurar
variables de entorno adicionales, aliases y otras opciones personalizadas. Por ejemplo, se puede
agregar un mensaje personalizado o mostrar información sobre la versión de Termux instalada
en el dispositivo.

com.termux/files/usr/etc/tls

Este es un directorio que contiene archivos de configuración relacionados con TLS (Transport
Layer Security), que se utiliza para cifrar las comunicaciones de red.

com.termux/files/usr/etc/tls/cert.pem

Archivo de certificado de seguridad que se utiliza para autenticar la identidad de otros sistemas
en la red.

com.termux/files/usr/etc/tls/openssl.cnf

Archivo de configuración para OpenSSL, que es una biblioteca de cifrado utilizada por muchos
programas de línea de comandos.
com.termux/files/usr/etc/unbound

Directorio que contiene archivos de configuración para el servidor DNS Unbound, que se utiliza
para resolver nombres de dominio en direcciones IP.

com.termux/files/usr/etc/unbound/unbound.conf

Archivo de configuración principal de Unbound.

com.termux/files/usr/include

Generalmente contiene los archivos de cabecera (header files) de bibliotecas C que se utilizan
para compilar aplicaciones en Termux. Estos archivos proporcionan las declaraciones de
funciones y estructuras necesarias para que las aplicaciones se comuniquen con las bibliotecas.
Las bibliotecas C son componentes esenciales del sistema operativo y proporcionan una
variedad de funcionalidades, desde la gestión de archivos hasta el procesamiento de imágenes.

com.termux/files/usr/lib

Carpeta donde se almacenan las bibliotecas compartidas de programas instalados en Termux.


Las bibliotecas compartidas son fragmentos de código que pueden ser utilizados por diferentes
programas, en lugar de tener que escribir el mismo código repetidamente en cada programa.

com.termux/files/usr/libexec

Contiene archivos ejecutables que son utilizados por otros programas del sistema. En general,
los archivos que se encuentran en esta carpeta no son ejecutables de forma independiente, sino
que son llamados por otros programas cuando se necesitan realizar ciertas tareas específicas.

com.termux/files/usr/opt

Directorio de instalación opcional para aplicaciones adicionales que no son necesarias para el
funcionamiento básico de Termux. Esta carpeta se usa para instalar paquetes y software
adicionales que no se encuentran en los repositorios predeterminados de Termux. Los
programas instalados en esta carpeta a menudo necesitan configuración adicional para
funcionar correctamente en Termux.

com.termux/files/usr/share

Contiene una variedad de recursos compartidos que pueden ser utilizados por diferentes
programas en el sistema.

com.termux/files/usr/tmp

Directorio donde se almacenan archivos temporales creados por diferentes programas y


procesos en ejecución en el sistema.

com.termux/files/usr/var

Puede contener registros de actividades del sistema, archivos temporales, archivos de caché,
bases de datos de aplicaciones, entre otros.

Tabla de Contenidos

Capítulo 9: Creando comandos

Los comandos de Bash pueden ser alias y funciones como ya vimos en el capitulo 7:
Configuración de Bash. La forma mas común de crear comandos es creando un archivo con
código Bash y añadir en la primera linea un shebang. Vamos a crear un archivo que solo diga
"Hola". Ponle de nombre saludar con el comando vim saludar.

#!/usr/bin/env bash

echo "Hola"
Para poder ejecutar el archivo debes darle permisos:

chmod 775 saludar

Si corres el comando ls, verás que saludar sale de color verde. Esto significa que tiene permisos
de ejecución. Para correr ejecutables usaremos el comando ./saludar

Para poder utilizar el comando desde cualquier lugar del sistema debes mover el fichero s alguna
de las carpetas listadas en la variable "$PATH". Puedes imprimirla para ver el listado de carpetas.
En este ejemplo, movemos el archivo a /bin, en Termux puedes correr el siguiente comando:

mv saludar ~/../usr/bin

Ahora puedes ejecutar el comando saludar desde cualquier lugar y omitiendo el ./

saludar

La gran mayoría de veces que creemos comandos, querremos aceptar argumentos. Vamos a
añadir funcionalidad a nuestro comando saludar. Puedes remplazar el contenido de saludar con
el comando vim ~/../usr/bin/saludar, por el siguiente:

#!/usr/bin/env bash

argumentos="help,name:"
argumentosSimples="hn:"

procesados=$(getopt --options=$argumentosSimples --longoptions=$argumentos --name "$0" -- "$@")

ayuda() {
echo -e "This commands says hi in spanish\nExample: saludar --name Manolo\n";
exit
}

while true; do
case "$1" in
-h | --help)
ayuda;
shift
;;

-n | --name)
name="$2"
shift 2
;;

--)
shift
break
;;

*)
echo "Error"
exit 3
;;
esac
done

if [ -n "$name" ]; then
echo "Hola $name"
else
echo "Hola"
fi
Esta sería la forma mas completa para poder procesar argumentos en Bash. Si corres el
comando saludar, verás que te dice Hola. Ahora también acepta varios argumentos. Por ejemplo
el argumento name (nombre en español). saludar --name Manolo y también el argumento --help.
Ambos argumentos admiten su versión cortas -n, -h respectivamente.

Explicación del código:

#!/usr/bin/env bash

El shebang sirve para indicar a la consola que tipo de programa es. En este caso un binario de
Bash. Si utilizases código Python o cualquier otro lenguaje, podrías remplazar bash por python o
el ejecutable que correspondiese. En este caso usamos lenguaje Bash, asique indicamos bash
en el shebang.

argumentos="help,name:"

En la variable $argumentos almacenamos una lista de argumentos léxicos separados por


comas. Si quieres que uno de los argumentos acepte texto del usuario debes añadirle :. Por
ejemplo argumentos="nombre:,edad:,ayuda,domicilio: acepta texto para los argumentos nombre,
edad y domicilio.

argumentosSimples="hn:"

En la variable $argumentosSimples almacenamos una lista (sin comas) de argumentos simples.


Por ejemplo n:e:ad: serían los argumentos cortos para nombre, edad, ayuda y domicilio.

procesados=$(getopt --options=$argumentosSimples --longoptions=$argumentos --name "$0" -- "$@")

En la variable procesados almacenamos el resultado de ejecutar el comando getopt. Este


comando sirve para procesar argumentos en Bash.
A getopt le pasamos los argumentos que hemos guardado previamente para que los procese.

El argumento --name de getopt sirve para indicarle a getopt el nombre de nuestro comando. En
este caso utilizamos la variable "$0".

La variable $0 almacena el primer argumento de la terminal (separado por espacios). Si por


ejemplo corremos el comando saludar --nombre manolo tendríamos "saludar" en $0, --nombre en
$1 y manolo en $2. En los comandos/scripts/archivos de Bash, asi como en funciones, también
disponemos de la variable $# que contiene el número de argumentos del comando.

En el caso de saludar --nombre manolo la variable "$#" imprime 2. (El nombre del comando no se
cuenta, ya que $# solo imprime el número de argumentos. Si usases el comando bash ./saludar -
-nombre manolo también se omitiría el comando bash.

La variable "$@" contiene todos los argumentos. Al igual que en $# se omite el nombre del
comando.

Dentro del switch case verás 3 comandos nuevos. shift, break y exit:

shift

El comando shift permite "avanzar" el nùmero indicado de argumentos. Si por ejemplo tenemos
el comando saludar hola que tal estas, detectamos el argumento hola en un case y ejecutamos
shift, se avanza hacia el argumento que. Si ponemos shift 2, avanzamos hasta el argumento tal, y
asì sucesivamente. Esto nos permite ignorar elementos en un bucle.

break

El comando break nos permite finalizar un bucle sin dejarlo terminar de ejecutarse como haría
normalmente, asì podremos avanzar en el programa cancelando el resto de iteraciones del bucle.
exit

El comando exit utilizando dentro de un script, nos permite indicar que queremos que se finalice
el programa inmediatamente y el comando enviará una señal de cierre a Bash.

El resto del código que queda por analizar ya lo vimos en ejemplos similares en el capítulo 5:
Introducción a Bash.

Bash es un lenguaje pontente y no existe una única forma de hacer las cosas. Puedes parsear los
argumentos perfectamente usando un bucle for y recorriendo los argumentos

#!/usr/bin/bash

for (( i=1; i <= "$#"; i++ )) do # bucle for clásico


next=$((i+1)) # Guarda el siguiente argumento en la variable next
if [[ ${!i} == "-h" || ${!i} == "--help" ]]; then # Si el argumento es -h o --help
echo "Este es el mansaje de ayuda"
exit
elif [[ ${!i} == "-n" || ${!i} == "--name" ]]; then
echo "Hola ${!next}"
exit
fi
done

Esta forma de hacer el mismo comando saludar tiene la deventaja de que no puede procesar
múltiples argumentos como saludar -hn Manolo, pero tiene la ventaja de que el código es mas
corto.

Tabla de Contenidos

Capítulo 10: Comandos Intermedios

Los sistemas GNU/Linux tiene una inmensidad de comandos distintos. Muchos de ellos vienen
instalados por defecto y otros podremos descargarlos. En este capítulo prestaremos atención a
los mas populares.

7z

Comprime archivos en múltiples formatos con muy buena compresión.

apt

Descarga paquetes de Gnu/Linux

apt-get

Descarga paquetes de Gnu/Linux

awk

Lenguaje de programación orientado al manejo de texto

base64

Codifica o decodifica base64

cal

Calendario

clang

Compilador de C/C++/Objective C
curl

Cliente de múltiples protolos. Principalmente utilizado por su capacidad como cliente HTTP

dialog

Utiliza diálogos en la terminal

dig

Consulta los registro DNS de un dominio

dpkg

Gestor de paquetes de Debian

espeak

Comando text-to-speach que reproduce el texto en el altavoz o crea un archivo reproducible

figlet

Crea textos grandes a base de caracteres.

find

Busca archivos en sistema de ficheros

file

Mueatra meta información a cerca de ub fichero.

gcc

Compila un programa escrito en C

g++

Compila un programa escrito en C++

gdb

Debuger para encontrar erroes en programas

gh

Utiliza github en la terminal

git

Maneja repositorios

grep

Encuentra palabras y patrones en un texto

go

Compila un programa escrito en Go

gotty

Comparte tu terminal para que otras personas puede ver lo mismo que tú
gzip

Comprime y descomprime archivos con extensión .z

head

Muestra solo el número indicado de caracteres

htop

Muestra información sobre procesos

httping

Mide la latencia de un servidor web/http

hugo

Generador de sitios estáticos

iverilog

Lenguaje de programación para modelado de circuitos electrónicos

jq

Comando para parsear JSON

less

Abre archivos muy grandes rápidamente cargándolo en bloques

lighttpd

Servidor web rápido, pequeño y flexible

lua

Ejecuta código lua

luarocks

Instala módulos de lua

logcat

Accede al registro de mensajes de Android para debuggear aplicaciones

lynx

Navegador Web de terminal

make

Compila proyectos

md5sum

Obten un hash (utilizando el algoritmo md5) de un archivo/texto

more

Muestra texto en pantalla, facilita la navegación


mongodb

Base de datos NoSQL

mono

Compila C# en GNU/Linux

mpg123

Reproductor de música

nc

Herramienta con múltiples utiidades de red integradas

netlify

Maneja la creación de sitios web en netlify

nmap

Escaner de puertos de red

ncat

Versión mejorada de nc, se instala conjuntamente a nmap

nginx

Servidor Web y proxy web muy completo.

ngrok

Comparte tus servicios sin abrir puertos

nodejs

Ejecuta código javascript y crea aplicaciones de todo tipo.

npm

Instala paquetes de node

openssl

Suit de algorimtos criptográficos

openvpn

Establece un tunel VPN

perl

Intérprete del lenguaje de programación Perl

php

Intérprete del lenguaje de programación PHP

postgresql

Base de datos SQL


pkill

Mata un proceso

proot

Emula un entorno root

proxychains-ng

Utiliza cadenas de proxies

python

Intérprete del lenguaje python2

python3

Intérprete del lenguaje python3

qemu

Emula procesadores y sistemas operativos

quickjs

Pequeño motor y librería de javascript

radare2

Desensamblador, debugger y editor hexadecimal para trabajar con binarios

ruby

Intérprete para el lenguaje de programación Ruby

rust

Compilador código Rust

scp

Copia y sube archivos utilizando un tunel SSH

sed

Filtra y remplaza texto

shasum

Obten un hash de un archivo/text utilizando sha

ssh

Ingresa a máquinas remotas m

steghide

Esconde texto en imágenes y audios

strings

Imprime todo lo que pueda ser interpretado como texto de un archivo de bytes/caracteres
sqlite

Pequeña y potente base de datos SQL

tail

Muestra el final de un fichero o texto

tar

Comprime y descomprime archivos en múltiples formatos

top

Muestra un resumen de los procesos del sistema

tor

Establece un circuito virtual en la red Tor.

torsocks

Utiliza un comando con Tor.

tsc

Compilador del lenguaje Typescript

unrar

Comprime y descomprime archivos .rar

unzip

Comprime y descomprime archivos .zip

which

Muestra la ruta de instalación de un archivo.

whois

Cliente que nuestra información sobre direcciones

xxd

Muestra un fichero como hexadecimal

yes

Confirma automáticamente las opciones interactivas de un comando

Tabla de Contenidos

Capítulo 11: Proot-Distro

Proot distro es una versión custom del comando proot que ha sido diseñada para Termux. Con
proot-distro podremos instalar distribuciones populares de GNU/Linux en Termux. Esto nos va a
permitir instalar programas de esas distribuciones y disponer del sistema de ficheros común de
GNU/Linux.

Lista las distribuciones disponibles


proot-distro list

Mustra las distribuciones de GNU/Linux disponibles, su nombre, su alias y su estado de


instalación

Instala una distribución

proot-distro install alpine

Para instalar una distribución, debes utilizar el alias correspondiente a la distribución que deseas
instalar.

Arranca una distribución

proot-distro login alpine

Haz copia de seguridad de una distribución

proot-distro backup alpine

Elimina una distribución

proot-distro remove alpine

Elimina y reinstala una distribución

proot-distro reset alpine

Recupera un sistema mediante copia de seguridad

proot-distro restore alpine

Arranca una distribución aislada de Termux

proot-distro login alpine --isolated

Ejecuta un comando desde una distribución

proot-distro login alpine --isolated -- pwd

Tabla de Contenidos

Capitulo 12: Introducción a Sistemas Linux

Linux es un sistema operativo libre y gratuito que ha ganado una gran popularidad debido a su
estabilidad, seguridad y flexibilidad. Aunque Linux es conocido por ser utilizado en servidores,
también es posible utilizarlo en dispositivos móviles como smartphones y tablets.

¿Qué es Linux?
Linux es un sistema operativo similar a Windows o macOS, pero con una diferencia importante:
es de código abierto. Esto significa que cualquiera puede descargar el código fuente de Linux y
modificarlo para adaptarlo a sus necesidades. Además, Linux está disponible de forma gratuita
para cualquier persona que quiera utilizarlo.

¿Qué es una distribución de Linux?

Aunque Linux es un sistema operativo por sí solo, existen muchas distribuciones de Linux
disponibles, cada una con sus propias características y enfoques. Una distribución de Linux es
una versión de Linux que incluye un conjunto de programas y aplicaciones preinstalados y una
interfaz de usuario específica. Algunas distribuciones de Linux están diseñadas para usuarios
principiantes, mientras que otras están diseñadas para usuarios avanzados.

Distribuciones Linux

Ubuntu
Es una de las distribuciones de Linux más populares y se utiliza ampliamente en todo el mundo.
Es conocida por su facilidad de uso y su gran cantidad de aplicaciones disponibles. También
tiene una gran comunidad de usuarios que puede proporcionar ayuda y soporte.

Debian
Es una distribución de Linux estable y confiable. Está diseñada para ser utilizada en servidores,
pero también es adecuada para usuarios de escritorio. Debian se enfoca en la estabilidad y la
seguridad, por lo que sus actualizaciones son más lentas que en otras distribuciones.

Fedora
Es una distribución de Linux que está diseñada para usuarios avanzados. Incluye herramientas
de desarrollo y es conocida por ser una plataforma para nuevas tecnologías. Fedora es la
distribución de prueba para Red Hat Enterprise Linux, que es utilizado en empresas.

Arch Linux
Es una distribución de Linux que se enfoca en la simplicidad y el minimalismo. Está diseñada
para usuarios avanzados que desean un control completo sobre su sistema. Arch Linux es una
distribución rolling release, lo que significa que las actualizaciones se liberan continuamente.

Kali Linux
Es una distribución de Linux especializada en seguridad informática. Incluye una gran cantidad
de herramientas de hacking ético y pruebas de penetración.

Alpine
Está diseñada para ser liviana y segura. Es popular en entornos de contenedores y en
dispositivos de IoT.

Al igual que Termux, Linux se basa en la línea de comandos para realizar tareas, aunque también
se puede instalar una interfaz gráfica. Linux también tiene una gran cantidad de herramientas y
paquetes disponibles que se pueden instalar y personalizar para adaptarse a tus necesidades.

Tabla de Contenidos

Capitulo 13: Uso básico de Debian

Instalación de paquetes en Debian

apt

apt es el gestor de paquetes de Debian. Permite instalar, actualizar y desinstalar paquetes en el


sistema. Aquí tienes algunos comandos útiles:

apt update : actualiza la lista de paquetes disponibles en los repositorios.

apt upgrade : actualiza todos los paquetes instalados en el sistema.

apt install <nombre_del_paquete> : instala un paquete en el sistema.

apt remove <nombre_del_paquete> : desinstala un paquete del sistema.


apt search <nombre_del_paquete> : busca un paquete en los repositorios disponibles.

apt show <nombre_del_paquete> : muestra información detallada sobre un paquete.

Es importante tener en cuenta que necesitas ejecutar apt update para actualizar la lista de
paquetes disponibles antes de instalar cualquier paquete.

dpkg

dpkg es la herramienta de bajo nivel para gestionar paquetes de Debian. Permite instalar,
desinstalar, configurar y verificar paquetes en el sistema. Aquí tienes algunos comandos útiles:

dpkg -i <nombre_del_paquete.deb> : instala un paquete .deb en el sistema.

dpkg -r <nombre_del_paquete> : desinstala un paquete del sistema.

dpkg -L <nombre_del_paquete> : muestra una lista de archivos que pertenecen a un paquete.

dpkg -S <nombre_del_archivo> : muestra el paquete que contiene un archivo en particular.

dpkg-reconfigure <nombre_del_paquete> : reconfigura un paquete ya instalado.

Ten en cuenta que dpkg no resuelve automáticamente las dependencias, por lo que es posible
que necesites instalar manualmente las dependencias de un paquete antes de instalar el
paquete en sí.

Tabla de Contenidos

Capítulo 14: Uso básico de Ubuntu

Instalación de paquetes en Ubuntu

apt

apt es el gestor de paquetes de Ubuntu. Permite instalar, actualizar y desinstalar paquetes en el


sistema. Aquí tienes algunos comandos útiles:

sudo apt update : actualiza la lista de paquetes disponibles en los repositorios.

sudo apt upgrade : actualiza todos los paquetes instalados en el sistema.

sudo apt install <nombre_del_paquete> : instala un paquete en el sistema.

sudo apt remove <nombre_del_paquete> : desinstala un paquete del sistema.

sudo apt search <nombre_del_paquete> : busca un paquete en los repositorios disponibles.

sudo apt show <nombre_del_paquete> : muestra información detallada sobre un paquete.

Es importante tener en cuenta que necesitas ejecutar sudo apt update para actualizar la lista
de paquetes disponibles antes de instalar cualquier paquete.

dpkg

dpkg es la herramienta de bajo nivel para gestionar paquetes en Ubuntu. Permite instalar,
desinstalar, configurar y verificar paquetes en el sistema. Aquí tienes algunos comandos útiles:

sudo dpkg -i <nombre_del_paquete.deb> : instala un paquete .deb en el sistema.

sudo dpkg -r <nombre_del_paquete> : desinstala un paquete del sistema.

sudo dpkg -L <nombre_del_paquete> : muestra una lista de archivos que pertenecen a un


paquete.
sudo dpkg -S <nombre_del_archivo> : muestra el paquete que contiene un archivo en
particular.
sudo dpkg-reconfigure <nombre_del_paquete> : reconfigura un paquete ya instalado.

Ten en cuenta que dpkg no resuelve automáticamente las dependencias, por lo que es posible
que necesites instalar manualmente las dependencias de un paquete antes de instalar el
paquete en sí.

Tabla de Contenidos
Capítulo 15: Uso básico de Alpine

Instalación de paquetes en Alpine

apk

apk es el gestor de paquetes de Alpine Linux. Permite instalar, actualizar y desinstalar paquetes
en el sistema. Aquí tienes algunos comandos útiles:

apk update : actualiza la lista de paquetes disponibles en los repositorios.

apk upgrade : actualiza todos los paquetes instalados en el sistema.

apk add <nombre_del_paquete> : instala un paquete en el sistema.

apk del <nombre_del_paquete> : desinstala un paquete del sistema.

apk search <nombre_del_paquete> : busca un paquete en los repositorios disponibles.

apk info <nombre_del_paquete> : muestra información detallada sobre un paquete.

Es importante tener en cuenta que necesitas ejecutar apk update para actualizar la lista de
paquetes disponibles antes de instalar cualquier paquete.

Otros comandos útiles

apk add --no-cache <nombre_del_paquete> : instala un paquete sin caché. Esto reduce la
cantidad de espacio utilizado por el paquete.
apk add --virtual <nombre_del_paquete> : instala un paquete como una dependencia virtual.
Esto es útil si necesitas instalar un paquete que no existe en los repositorios, pero que es
necesario para que otro paquete funcione correctamente.
apk cache clean : limpia la caché de paquetes para liberar espacio en disco.

Ten en cuenta que apk también puede ser utilizado para instalar paquetes desde fuentes
externas, como archivos APK o repositorios de terceros. Sin embargo, debes tener cuidado al
hacer esto, ya que los paquetes pueden no ser seguros o compatibles con tu sistema.

Tabla de Contenidos

Capítulo 16: Uso básico de Fedora

Instalación de paquetes en Fedora

dnf

dnf es el gestor de paquetes por defecto en Fedora. Permite instalar, actualizar y desinstalar
paquetes en el sistema. Aquí tienes algunos comandos útiles:

dnf update : actualiza todos los paquetes instalados en el sistema.

dnf upgrade : actualiza todos los paquetes instalados en el sistema, incluyendo los que
requieren cambios en la configuración.
dnf install <nombre_del_paquete> : instala un paquete en el sistema.

dnf remove <nombre_del_paquete> : desinstala un paquete del sistema.

dnf search <nombre_del_paquete> : busca un paquete en los repositorios disponibles.

dnf info <nombre_del_paquete> : muestra información detallada sobre un paquete.

Es importante tener en cuenta que necesitas ejecutar dnf update para actualizar todos los
paquetes instalados en el sistema.

Otros comandos útiles

dnf history : muestra un registro detallado de todas las operaciones realizadas por dnf ,
incluyendo las actualizaciones e instalaciones de paquetes.
dnf repoquery <nombre_del_paquete> : busca un paquete en los repositorios disponibles sin
instalarlo.
dnf list installed : muestra una lista de todos los paquetes instalados en el sistema.

dnf clean all : limpia la caché de paquetes y metadatos para liberar espacio en disco.

Ten en cuenta que dnf también puede ser utilizado para instalar paquetes desde fuentes
externas, como archivos RPM o repositorios de terceros. Sin embargo, debes tener cuidado al
hacer esto, ya que los paquetes pueden no ser seguros o compatibles con tu sistema.

Tabla de Contenidos

Capítulo 17: Introducción a Servicios

Los servicios son programas que se ejecutan en segundo plano, es decir, que están funcionando
en la computadora sin que el usuario tenga que interactuar directamente con ellos.

Estos programas pueden ser muy variados y realizar diferentes funciones. Por ejemplo, un
servicio puede ser el que controla el acceso a una red, otro puede ser el que permite imprimir
documentos, otro puede ser el que guarda archivos en un servidor, etc.

Cada servicio se comunica con otros programas o dispositivos a través de puertos específicos,
que funcionan como una especie de "ventana" por donde los datos entran y salen.

Cuando utilizas una aplicación o accedes a un sitio web, estás interactuando con uno o varios
servicios que están funcionando en segundo plano. Por ejemplo, si estás utilizando un
navegador para acceder a un sitio web, el navegador está utilizando el servicio de red para
conectarse a Internet y el servicio de DNS para buscar la dirección IP del sitio web.

En resumen, los servicios son programas que realizan funciones específicas en segundo plano, y
se comunican con otros programas y dispositivos a través de puertos específicos.

Tabla de Contenidos

Capítulo 18: Creando un Servidor

Hay muchos tipo de servidores y muchos programas que te permiten crearlos.

Creando un servidor Web con Python3

1. Instalar Python 3:

Para instalar Python 3 en Termux, sigue estos pasos:

1. Abre la aplicación Termux en tu dispositivo Android.


2. Ejecuta el siguiente comando para actualizar los paquetes existentes:

pkg update && pkg upgrade

3. Ahora, ejecuta el siguiente comando para instalar Python 3:

pkg install python3

4. Una vez que se complete la instalación, verifica que Python 3 esté instalado correctamente
ejecutando el siguiente comando:

python3 --version

Debería mostrar la versión de Python instalada en tu sistema.


2. Crear una carpeta para el servidor web:

Ahora, vamos a crear una carpeta para nuestro servidor web. Para ello, ejecuta el siguiente
comando:

mkdir mywebsite

Este comando creará una carpeta llamada "mywebsite" en el directorio actual.

3. Crear un archivo HTML:

Ahora, vamos a crear un archivo HTML muy simple para nuestra página web. Para ello, ejecuta
los siguientes comandos:

cd mywebsite
echo "<html><body><h1>Mi sitio web</h1></body></html>" > index.html

El primer comando nos lleva al directorio "mywebsite". El segundo comando crea un archivo
llamado "index.html" en el directorio actual y agrega el código HTML necesario para mostrar un
encabezado "Mi sitio web" en nuestra página.

4. Agregar un archivo de texto de ejemplo:

Para agregar un archivo de texto de ejemplo, ejecuta los siguientes comandos:

echo "Este es un archivo de texto de ejemplo." > example.txt

Este comando crea un archivo de texto llamado "example.txt" en el directorio actual y agrega el
texto "Este es un archivo de texto de ejemplo." en el archivo.

5. Iniciar el servidor web:

Ahora que hemos creado nuestra carpeta y nuestros archivos, podemos iniciar el servidor web
utilizando el comando python3 -m http.server . Para ello, ejecuta los siguientes comandos:

python3 -m http.server 8000

El comando inicia el servidor web en el puerto 8000 (puedes elegir cualquier otro puerto si lo
deseas).

6. Acceder a la página web:

Para acceder a la página web, abre un navegador en tu dispositivo Android y escribe la siguiente
dirección URL:

http://localhost:8000/

Deberías ver la página web con el encabezado "Mi sitio web".

7. Acceder al archivo de texto:

Para acceder al archivo de texto, abre un navegador en tu dispositivo Android y escribe la


siguiente dirección URL:

http://localhost:8000/example.txt

Deberías ver el contenido del archivo de texto "example.txt".

¡Listo! Ahora tienes un servidor web en ejecución en tu dispositivo Android, creado con Python 3
en Termux. Puedes personalizar la página web agregando más contenido y archivos a la carpeta
"mywebsite".
En el final del Capítulo 25: Protocolo HTTP también tienes un servidor web mínino usando Bash y
ncat.

Tabla de Contenidos

Capítulo 19: Ngrok y Exponer Servicios

Qué es Ngrok?

Ngrok es una herramienta que permite crear un túnel seguro hacia un servidor local, lo que
permite exponer aplicaciones o servicios que se ejecutan en un equipo local a Internet.
Básicamente, permite que una aplicación web que se ejecuta en un equipo local sea accesible a
través de una URL pública. Esto es muy útil para desarrolladores que necesitan probar sus
aplicaciones web en diferentes dispositivos o compartir sus aplicaciones con otros.

Ngrok crea una conexión segura entre su equipo local y la nube, lo que le permite acceder a su
servidor local desde cualquier lugar del mundo. También proporciona un panel de control web
para administrar su conexión y configurar diferentes opciones, como la autenticación y el registro
de solicitudes.

Ngrok es fácil de usar y se puede instalar en diferentes sistemas operativos. Además, tiene una
versión gratuita y varias opciones de pago con características adicionales, como el uso de
subdominios personalizados y la asignación de puertos dedicados.

Qué es un servicio local y cómo se expone?

Un servicio local es un servicio o aplicación que se ejecuta en un equipo local, como una
aplicación web, una API o un servidor de base de datos. Estos servicios suelen estar disponibles
solo en el equipo donde están instalados y no son accesibles desde otros equipos en la red o
desde Internet.

Los usuarios pueden utilizar Ngrok para exponer estos servicios locales y hacerlos accesibles
desde cualquier lugar del mundo a través de una URL pública. Esto es útil para desarrolladores
que necesitan probar sus aplicaciones en diferentes dispositivos o compartir sus aplicaciones
con otros, ya que les permite acceder a sus servicios locales sin tener que exponerlos a Internet
directamente. Además, Ngrok facilita la configuración de conexiones seguras y elimina la
necesidad de abrir puertos en el router, lo que lo hace una solución fácil y segura para exponer
servicios locales.

Por que utilizar una versión opensource en lugar de la oficial

La seguridad es un factor importante cuando se trata de exponer servicios a través de Internet.


Mientras que Ngrok es una herramienta popular y útil para crear túneles seguros y exponer
servicios locales, algunos usuarios pueden tener preocupaciones sobre la seguridad de su
código cerrado y la privacidad de sus datos.

Una de las ventajas de utilizar una versión de Ngrok de código abierto (open source) es que
cualquier persona puede revisar y auditar el código para detectar posibles vulnerabilidades y
problemas de seguridad. Esto significa que hay una mayor transparencia y confianza en el
software, ya que los usuarios pueden ver exactamente lo que está sucediendo en el código
subyacente.

Además, los desarrolladores de la versión open source de Ngrok pueden responder a las
preocupaciones de seguridad de la comunidad y proporcionar soluciones rápidas en caso de que
se descubran vulnerabilidades. También hay una comunidad de usuarios activa que puede
proporcionar soporte y asistencia en caso de que surjan problemas.

Por otro lado, al ser una versión cerrada de código (closed source), los usuarios no pueden
revisar el código y tienen que confiar en que la empresa detrás de Ngrok está tomando las
medidas de seguridad necesarias para proteger sus datos y privacidad.
En conclusión, utilizar una versión open source de Ngrok proporciona una mayor transparencia y
seguridad, ya que los usuarios pueden revisar el código y confiar en la comunidad de usuarios
para solucionar posibles vulnerabilidades y problemas de seguridad.

cómo instalar un cliente de ngrok opensource

1. Abre la aplicación Termux en tu dispositivo Android.

2. Instala las dependencias necesarias ejecutando el siguiente comando:

pkg install openssh tmux

3. Descarga el cliente de ngrok opensource en tu dispositivo Android ingresando el siguiente


comando:

git clone https://github.com/stringmanolo/ngrok.git

4. Navega hasta el directorio donde se encuentra el cliente de ngrok ingresando el siguiente


comando:

cd ngrok

5. Configura el cliente de ngrok utilizando el asistente ingresando el siguiente comando:

chmod 775 ngrokWizard.sh


./ngrokWizard.sh

Sigue las instrucciones que se muestran en pantalla para configurar el cliente de ngrok. Esto
incluirá generar una clave pública ECDSA, pegar la clave en la página de configuración de ngrok y
establecer el puerto de tu servidor.

6. Una vez que hayas configurado el cliente de ngrok utilizando el asistente, puedes iniciar y detener
el cliente utilizando los siguientes comandos:

./ngrokStart.sh

./ngrokStop.sh

El primer comando iniciará el cliente de ngrok y establecerá una conexión inversa SSH con el
servidor, lo que permitirá que el tráfico se reenvíe a través de ngrok. El segundo comando
detendrá la conexión SSH y cerrará el cliente de ngrok.

Asegúrate de establecer el puerto correcto cada vez que ejecutes el comando ngrokStart.sh .

Ahora puedes usar el cliente de ngrok opensource para exponer tu servidor web a través de ngrok
en tu dispositivo Android usando Termux. Recuerda que la URL pública que te proporciona ngrok
cambiará cada vez que ejecutes el comando ngrokStart.sh , por lo que es posible que debas
actualizar la URL que compartes con otros usuarios cada vez que la uses.

Tabla de Contenidos

Capítulo 20: Tor, Configuración y Uso

Qué es Tor?
Tor (The Onion Router) es una red de comunicaciones en línea diseñada para proporcionar
anonimato y privacidad a los usuarios de Internet. Fue desarrollado originalmente por la Marina
de los Estados Unidos para proteger las comunicaciones gubernamentales, pero posteriormente
se convirtió en un proyecto de código abierto para permitir que cualquier persona pueda
utilizarlo.

Tor funciona enrutando las conexiones de Internet a través de una serie de nodos (también
llamados "nodos de cebolla" o "onion routers") distribuidos por todo el mundo. Cada nodo en la
red solo conoce la dirección IP del nodo anterior y el siguiente nodo en la cadena, lo que hace
que sea difícil (aunque no imposible) rastrear las comunicaciones de un usuario de Internet.

Además, Tor también utiliza técnicas de cifrado para proteger las comunicaciones y garantizar
que solo el usuario final pueda leer el contenido de los mensajes. Esto hace que Tor sea una
herramienta valiosa para aquellos que desean proteger su privacidad y anonimato en línea, ya
sea por razones políticas, de seguridad o simplemente por preferencia personal.

Instalación, configuración y uso

1 Abre Termux y asegúrate de que estás en la última versión actualizada. Para actualizar, escribe en la
terminal:

apt update && apt upgrade

2 A continuación, es necesario instalar el paquete de Tor y torify. Para hacerlo, escribe en la terminal:

pkg install tor torsocks

3 Añade las siguientes líneas al archivo de configuración de Tor, usando el comando echo :

echo 'ControlPort 9051' >> $PREFIX/etc/tor/torrc && echo 'CookieAuthentication 1' >> $PREFIX/etc/tor/torrc

4 Inicia el servicio de Tor en background usando el ampersand:

tor &

Nota: El ampersand al final del comando permite que el proceso se ejecute en segundo plano, lo
que significa que puedes seguir utilizando la terminal mientras Tor está activo.

5 Para asegurarte de que Tor está funcionando, ejecuta:

torify curl -s https://check.torproject.org/ | grep -q "Congratulations"

Este comando debería mostrar un mensaje de felicitación si estás usando Tor. Si no ves el
mensaje, es posible que algo esté mal configurado o que Tor no esté funcionando
correctamente.

6 Ahora puedes usar Tor con cualquier aplicación que soporte proxies SOCKS5, incluyendo curl .
Simplemente precede cualquier comando que quieras ejecutar con torsocks . Por ejemplo:

torsocks curl https://example.com

7 Cuando hayas terminado de usar Tor, detén el servicio ejecutando el siguiente comando:

killall tor

¡Listo! Ahora sabes cómo instalar, configurar y usar Tor en Termux. Recuerda que el uso de Tor es
importante para proteger tu privacidad y anonimato en línea.

Tabla de Contenidos
Capítulo 21: Servicios Ocultos

Qué es?

Un Hidden Service (también conocido como Servicio Oculto) es un sitio web alojado en la red Tor
(conocida también como Dark Web o internet profunda) que se encuentra en una ubicación
desconocida para los usuarios normales de la web y que solo puede ser accedido a través de la
red Tor. En lugar de tener una dirección IP pública y estar alojado en un servidor web estándar, un
Hidden Service se aloja en una red anónima y utiliza una dirección web única que termina en
".onion".

Cuando un usuario intenta acceder a un sitio web alojado en un Hidden Service, su conexión se
enruta a través de una serie de nodos de la red Tor, lo que proporciona un alto nivel de
anonimato.

Los Hidden Services se pueden utilizar para una amplia variedad de propósitos, desde sitios web
de periodismo y activismo político hasta mercados en línea y comunidades en línea privadas.
Algunos usuarios también utilizan Hidden Services para alojar sus propios sitios web personales
sin revelar su ubicación física o dirección IP pública.

En resumen, los Hidden Services ofrecen una forma segura y anónima de alojar y acceder a
contenido en línea, lo que los hace útiles para una variedad de aplicaciones en línea que
requieren privacidad y anonimato.

Crear un servicio oculto

1 Crea una carpeta para el sitio web y otra para el hidden service utilizando los siguientes comandos:

mkdir -p $PREFIX/var/lib/tor/hidden_service/mywebsite;
mkdir -p $PREFIX/etc/tor/hidden_service;

2 Cambia los permisos de la carpeta:

chmod 700 $PREFIX/var/lib/tor/hidden_service/mywebsite

3 Agrega las líneas de configuración de Tor al archivo torrc utilizando el siguiente comando:

echo -e "HiddenServiceDir $PREFIX/var/lib/tor/hidden_service/mywebsite\nHiddenServicePort 80 127.0.0.1:8000" >> $PREF

4 Reinicia el servicio Tor ejecutando el siguiente comando:

killall tor;
tor &

5 Crea un archivo index.html para el sitio web utilizando el siguiente comando:

echo "Hello, world!" > $PREFIX/var/lib/tor/hidden_service/mywebsite/index.html;

6 Inicia un servidor web local en la carpeta mywebsite usando el siguiente comando:

cd $PREFIX/var/lib/tor/hidden_service/mywebsite;
python3 -m http.server 8000 &

7 Obten la dirección de tu servicio:

cat $PREFIX/var/lib/tor/hidden_service/mywebsite/hostname
8 Accede al sitio web a través del Hidden Service ejecutando el siguiente comando en la terminal:

torify curl http://<hidden-service-address>.onion/;

Reemplaza <hidden-service-address> con la dirección del Hidden Service que obtuviste en el


paso 7.

Otra forma de comprobar si funciona es utilizando el servicio tor2web. Te vas a este enlace en
cualquier navegador e introduces la dirección de tu servicio. Si funciona verás tu página web con
el mensaje "Hello World". Esta web sirve para poder visualizar páginas web alojadas en la red tor
en tu navegador sin necesidad de instalar el navegador de tor.

9 Para detener el servicio Tor y el servidor web de Python, ejecuta los siguientes comandos en la terminal:

killall tor;
killall python3;

Con estos pasos, se creará una carpeta para el sitio web y otra para el hidden service, se
configurará el archivo de Tor para exponer el servidor web local en el Hidden Service, se creará un
archivo index.html para el sitio web y se iniciará un servidor web local. Cualquier persona con
conexión a tor podrá acceder a tu servicio utilizando el dominio .onion.

Tabla de Contenidos

Capítulo 22: SSH, SCP y SSHD

SSH

SSH (Secure Shell) es un protocolo de red que permite a los usuarios acceder y controlar de
forma remota otros dispositivos a través de una conexión segura. En Termux, también es posible
utilizar SSH para establecer una conexión remota con otros sistemas y ejecutar comandos en
ellos. A continuación, te mostraré cómo puedes utilizar SSH en Termux.

Instalación de OpenSSH

Para utilizar SSH en Termux, primero debes instalar el paquete OpenSSH. Puedes hacerlo
ejecutando el siguiente comando en la terminal de Termux:

pkg install openssh

Generación de claves SSH

Antes de utilizar SSH, es recomendable generar un par de claves SSH para autenticarte de forma
segura en los sistemas remotos. Puedes generar un par de claves SSH ejecutando el siguiente
comando:

ssh-keygen -t rsa

Este comando generará una clave privada y una clave pública en tu directorio de inicio. Puedes
dejar los valores predeterminados presionando "Enter" en cada pregunta.

Conexión SSH

Una vez que hayas generado las claves SSH, estás listo para establecer una conexión SSH con
un sistema remoto. Utiliza el siguiente comando para conectarte a un sistema remoto

ssh usuario@dirección_ip
Reemplaza "usuario" con tu nombre de usuario en el sistema remoto y "dirección_ip" con la
dirección IP del sistema remoto al que deseas conectarte, también puedes usar un dominio en
lugar de una IP al igual que con las páginas web.

Si es la primera vez que te conectas a ese sistema, se te pedirá que confirmes la autenticidad de
la clave del host. Verifica que la clave mostrada coincida con la clave del sistema remoto y
responde "yes" para agregarla a la lista de conocidos.

A continuación, se te solicitará la contraseña del usuario remoto. Ingrésala y presiona "Enter"


para establecer la conexión

Normalmente ssh se utiliza para obtener acceso a servidores privados pero también hay alguno
público. En el siguiente ejemplo veremos como utilizar openssh para conectarnos a un servidor
remoto:

ssh bandit0@bandit.labs.overthewire.org -p 2220

Cuando te conectas por SSH por primera vez a un servidor es normal que se te muestre un
mensaje indicando la huella digital del servidor, por ejemplo:

The authenticity of host '[bandit.labs.overthewire.org]:2220 ([16.16.8.216]:2220)' can't be established.


ED25519 key fingerprint is SHA256:C2ihUBV7ihnV1wUXRb4RrEcLfXC5CXlhmAAM/urerLY.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])?

Escribiremos yes para continuar la conexión.

Lo que estamos haciendo es conectarnos al ordenador con dirección IP 16.16.8.216 usando el


protocolo SSH con el usuario bandit0. Nos pedirá una contraseña que también es bandit0. Y con
esto ya nos hemos conectado a un ordenador remoto a través de SSH.

Si tienes multiples dispositivos, smartphones, computadores, hostings, vpns, ... SSH es una
forma segura y simple de obtener una terminal remota. En esta parte se explica solo el cliente
(como conectarse a), a continuación se explica como configurar el servicio ssh para que una
maquina sea accesible a través de SSH.

SSHD

SSHD es el Daemon de SSH que se ejecuta en segundo plano permaneciendo a la escucha de


conexiones entrantes (por defecto en el puerto 8022 en Termux). Este servicio nos sirve para
permitir que la máquina sea controlada desde el exterior a través del protocolo SSH.

Instalar Alpine en proot-distro

En lugar de correr directamente el servidor SSH sobre Termux, vamos a hacerlo sobre proot-
distro con el argumento --isolated para tener una pequeña capa extra de seguridad. Ya vimos
como utilizar la herramienta proot-distro en el capítulo 11:

proot-distro install alpine

Iniciar sesión interactiva aislada de Alpine

A continuación, utilizaremos proot-distro para iniciar sesión en la distribución Alpine Linux de


forma aislada. Ejecutamos el siguiente comando:

proot-distro login alpine --isolated

Instalar openssh en Alpine

Una vez que hemos iniciado sesión en la distribución Alpine Linux, podemos instalar el paquete
de OpenSSH, que nos permitirá configurar el servidor SSHD. Ejecutamos el siguiente comando:
apk add openssh

Generación de claves SSH

Antes de configurar el servidor SSHD, necesitamos generar las claves SSH necesarias.
Ejecutamos el siguiente comando:

ssh-keygen -A

Creae archivo de configuración de SSHD

Este comando sobrescribe el contenido del archivo /etc/ssh/sshd_config con la configuración


especificada. Aquí estamos permitiendo el inicio de sesión como usuario root, configurando el
puerto de escucha en el puerto 8022, habilitando la autenticación por contraseña y desactivando
algunas opciones de reenvío y redireccionamiento.

echo 'Include /etc/ssh/sshd_config.d/*.conf


Port 8022
PermitRootLogin yes
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication yes
AllowTcpForwarding no
GatewayPorts no
X11Forwarding no
Subsystem sftp internal-sftp' > /etc/ssh/sshd_config

Generación de una contraseña para el usuario root

Para habilitar el inicio de sesión como usuario root, necesitamos establecer una contraseña.
Ejecutamos el siguiente comando:

tr -dc '[:alnum:][:punct:]' < /dev/urandom | head -c 16

Este comando genera una contraseña aleatoria de 16 caracteres para el usuario root. Puedes
utilizar cualquier contraaeña que tu quieras, pero debes tener en cuenta que hay miles de
scanneres y herramientas de fuerza bruta scanneando servicios SSH. Si pones una contraseña
frágil, te van a hackear y podrán ejecutar comandos en tu dispositivo.

Establecimiento de la contraseña del usuario root

Ahora, estableceremos la contraseña generada para el usuario root. Ejecutamos el siguiente


comando:

passwd root

Este comando solicitará que ingresemos la nueva contraseña para el usuario root.

Inicio del servidor SSHD

Finalmente, iniciamos el servidor SSHD ejecutando el siguiente comando:

/usr/sbin/sshd

Conexión al servidor SSHD

Ahora que hemos configurado y activado el servidor SSHD, podemos conectarnos a él desde
otras máquinas (pcs, smartphones, etc) y/o otras terminales. Utilizamos el comando ssh para
establecer una conexión SSH.

Para conexión desde otra pestaña de Termux u otro software en el mismo equipo:
ssh root@127.0.0.1 -p 8022

Para conexión desde otra maquina que se encuentre en la misma red local (mismo wi-fi)

ssh root@192.168.1.40 -p 8022

Remplaza la IP 192.168.1.40 por la IP privada que el router te asignó (IP local de tu


Smartphone)

Para conexión desde fuera de nuestra red (cualquier máquina en cualquier parte, con router en casa)

ssh root@93.184.216.34 -p 8022

Remplaza la IP 93.184.216.34 por la IP pública de tu router y configura en el router la


apertura/redirección de puertos de la IP pública hacia la IP local de tu Smartphone

Para conexión desde fuera de nuestra red (cualquier máquina en cualquier parte, datos móviles o no)

Si utilzas datos móviles normalmente los proveedores de internet no te dan una IP pública única
ni tampoco un router o una forma de abrir puertos, si no que te meten en una red compartida
llamada CGNAT. Cuando estás en CGNAT no puedes exponer ningún tipo de servicio a internet.
Para exponer nuestro servidor SSH lo que haremos será utilizar un servidor intermedio que
encapsule el trafico mediante técnicas de tunelación. Esta técnica funciona también aunque no
uses datos móviles, asique si simplemente quierer ahorrarte abrir puertos, o tienes cualquier
otro motivo también te sirve

En el Capítulo 19: Ngrok y Exponer Servicios tienes mas información.

Instalar git

Instalamos git para poder clonar el repositorio de un cliente código abierto de Ngrok

apk add git

Instalar tmux

Instalamos también tmux ya que es una dependencia del cliente codigo abierto de ngrok

apk add tmux

Instalar ngrok opensource

git clone https://github.com/StringManolo/ngrok;


cd ngrok;
chmod 775 ngrokWizard.sh;
chmod 775 ngrokStart.sh;
chmod 775 ngrokStop.sh;
./ngrokWizard.sh;

Lee y sigue las indicaciones que se muestran en consola para configurar y ejecutar ngrok.

Una vez completado el proceso, en la salida de consola te saldrá un url con protocolo tcp
acompañado de un puerto, por ejemplo: tcp://8.tcp.ngrok.io:16459

Podremos conectarnos a nuestra máquina al igual que hicimos en local pero ahora desde
cualquier lugar/dispositivo;

ssh root@8.tcp.ngrok.io -p 16459

Puedes cerrar todo simplemente corriendo el comando exit


Para volver a activar el SSH ngrok y demás no necesitarás repetir todo el proceso, simplemente
ingresas al Alpine linux, ejecutas el ssh y el ./ngrokStart.sh, pones el puerto 8022 y listo:

proot-distro login alpine --isolated

/usr/sbin/sshd;
/root/ngrok/ngrokStart.sh;

SCP

SCP (Secure Copy) es un protocolo basado en SSH que permite la transferencia segura de
archivos entre sistemas remotos. Con SCP, puedes copiar archivos y directorios de forma segura
de un sistema a otro.

Copiar archivos desde el sistema local al sistema remoto

Para copiar archivos desde el sistema local al sistema remoto utilizando SCP, utiliza el siguiente
comando:

scp miArchivo.txt root@127.0.0.1:/home/archivos -p 8022

El comando te pedirá la contraseña del usuario remoto. Ingrésala y presiona "Enter" para iniciar la
transferencia del archivo.

Copiar archivos desde el sistema remoto al sistema local

Para copiar archivos desde el sistema remoto al sistema local utilizando SCP, utiliza el siguiente
comando:

scp root@127.0.0.1:/home/archivos/logServidor.txt ~/logs/ -p 8022

Copiar directorios recursivamente

Para copiar un directorio completo de forma recursiva desde el sistema local al sistema remoto
o viceversa, utiliza el siguiente comando:

scp -r fotos root@127.0.0.1:/home/imagenes

Tabla de Contenidos

Capítulo 23: Bots de Telegram

Telegram es una app de mensajería que puede resultar de gran utilidad para desarrolladores y
hackers, en parte gracias a los bots.

Los bots son programas normales pero con la capacidad añadida de que pueden usar telegram.
Esto te permite enviar texto desde telegram a tu dispositivo y viceversa, esto nos da infinitas
posibilidades.

Listado de bots útiles:

Conversor De Archivos
Le pasas un archivo y te lo convierte a otro formato. Soporta 874 formatos.
Email Temporal DropMail
Te da emails temporales que duran 10 minutos.
Email Temporal TempMail
Otro bot de email temporales.
Email Mailable
Este bot the permite crear tu dirección de correo, mandar y recibir correos desde Telegram
GMAIL
Bot oficial de gmail. Te llevan los emails a telegram y puedes contestarles, enviar correos, etc.
Subir Archivos AnonFile
Te permite subir archivos a anonfiles.com desde telegram y te da el enlace de descarga
Traductor De Idiomas
Traduce conversaciones entre distintos idiomas.
Imagenes de mapas y satellites
Le introduces una dirección y te da una imagen de la zona.
Convierte audios a texto
Le mandas un audio y te da en texto lo que dice la persona.
Obten el texto de imágenes
Le mandas una imagen y te da el texto que salga en ella.
Convierte texto a voz
Le mandas un texto y te devuelve un audio leyendo el texto.
Convierte Web a imagen/es o pdf Le pones la url y te permite obtener una (o varias) imagen o pdf
de la web.
Antivirus VirusTotal
Le mandas un archivo y comprueba si tiene virus.
Antivirus DrWeb
Le mandas un archivo y comprueba si tiene virus.
BD de Smartphones
Introduces la marca/modelo y te sale todo el listado de modelos y todas sus especificaciones.
Ejecuta código javascript
Ejecuta el código javascript que le envies y te devuelve el resultado.
Ejecuta código en múltiples lenguajes
Ejecuta código en muchos lenguajes distintos y te da el resultado.
Descarga Youtube/Tiktok
Descarga videos como video o audio.
Crea códigos QR Introduce un texto o url y te genera la imagen QR.

Estos bots están todos operativos y son accesibles gratuitamente en el momento en el que se ha
escrito este artículo. Esto puede cambiar si lo lees mucho tiempo después de que se escribiese

Tabla de Contenidos

Capítulo 24: Telegram RAT

Qué es un RAT?

RAT puede hacer referencia a 2 acrónimos en inglés:

1. Remote Access Tool


2. Remote Acesss Trojan

Una Remote Access Tool (Herramienta de Acceso Remoto) es un programa informático que
permite a un usuario acceder/controlar un dispositivo remoto. Son herramientas creadas para
permitir administrar o dar soporte a sistemas sin tener accesso físico a ellos.

Un Remote Access Trojan (Troyano de Acceso Remoto) es un tipo de software malicioso que se
oculta en un programa aparentemente legítimo y permite a un atacante acceder y controlar un
dispositivo remoto de manera no autorizada. Estos troyanos son utilizados con fines maliciosos,
permitiendo a los ciberdelincuentes acceder y controlar dispositivos a distancia sin el
conocimiento del usuario. Es decir es una herramienta de acceso remoto a la que se le han
incluido funcionalidades que permitan su uso malicioso, como pueden ser la elevación de
privilegios, polymorfismo, exfiltración de datos, invisibilidad, persistencia, etc.
Si te suena el término botnet, normalmente las botnets son un montón de sistemas infectados
por un RAT que pueden ser controlados simultaneamente.

Requisitos

Cuenta de Telegram
Bash
jq
curl

Creando el RAT

En el Capítulo 5: Introducción a Bash aprendimos un poco sobre el lenguaje Bash, asique será el
que vamos a utilizar para crear el bot.

Antes de programar algo, sobre todo si somos inexpertos, es importante definir la lógica y las
funcionalidades que queremos que tenga nuestro programa. Para hacer esto podemos usar
pseudocódigo o bien el propio idioma español. Esto nos permitirá definir una idea clara de como
y que será el programa.

Podemos primero hacer un listado de las funcionalidades:

Leer los mensajes de una cuenta Bot de Telegram


Borrar los mensajes de la cuenta Bot de Telegram
Enviar mensajes a la cuenta de Telegram
Sistema de login
Usuarios logeados pueden correr comandos en el sistema
Usuarios no logeados pueden correr comandos como /help o /login

Una vez tenemos la lista de lo que queremos que haga el programa, podemos escribir como
sería el código en español en un lenguaje inventado:

-comentario- VariablesGlobales:
crear lista usuariosLogeados

-comentario- Funciones:
funcion LeerMensajes
mensajes = solicitarMensajes a telegram
retornar mensajes

funcion BorrarMensajes
solicitarBorradoDeMensajes a telegram

funcion EnviarMensaje mensaje_del_bot usuario_x


enviarMensaje mensaje_del_bot al usuario_x de telegram

funcion Login usuario_x contrasena_x


si usuario_x está en la lista
retornar VERDADERO

funcion CorrerComandosEnSistema usuario_x comando_a_correr


si (ComprobarSiUsuarioEnLista usuario_x) igual a VERDADERO
respuestaDelComando = ejecutar comando_a_correr
retornar respuestaDelComando

-comentario- Código principal:


bucleInfinito:
mensaje = LeerMensajes

si mensaje tiene /login


si login usuario_x contrasena_x igual a VERDADERO
Añadir usuario_x a la lista de usuariosLogeados

si mensaje tiene hola


EnviarMensaje "Hola soy el RAT" usuario_x
si mensaje tiene /ejecutar_comando
si (ComprobarSiUsuarioEnLista usuario_x) igual a VERDADERO
respuestaDelComando = ejecutar comando_a_correr
EnviarMensaje respuestaDelComando usuario_x

BorrarMensajes
Esperar 5 segundos

Como puedes observar el código es bastante sencillo. Esto es lo que sería la lógica principal del
programa. Obviamente se omiten pequeños detalles como manejo de errores, obtener el nombre
del usuario de los mensajes, etc. Ya que el objetivo de hacer este pseudocódigo es definir la
lógica principal/estructura que queremos que tenga nuestro programa.

El siguiente paso es escribir este mismo código pero en un lenguaje real. En nuestro caso Bash,
pero se puede utilizar cualquier otro.

Creando el bot de Telegram

Para poder interactuar con Telegram, lo primero será crear un bot de telegram que guardará los
mensajes que le mandemos, y así nosotros podremos acceder a ellos desde el RAT. Como ya
vimos en los requisitos necesitamos tener una cuenta de Telegram para poder crear bots. Una
vez tienes una cuenta puedes crear un bot en la siguiente url: https://t.me/BotFather, si estás en
Android con hacer click ya te abre el chat con BotFather para poder crear tu bot.

Una vez dentro del chat de tg con BotFather le escribirás el comando /newbot para iniciar la
creación de un nuevo bot. Te pedirá que escribas el nombre del bot. Puedes ponerle por ejemplo:
RAT_De_TuNombre

Tras enviarle el nombre de tu bot, te dirá que necesita un nombre de usuario para la cuenta del
bot. Es decir, te está pidiendo el @ del bot. Una de las condiciones de las cuentas de bots es que
su nombre de cuenta debe terminar por la palabra bot. Asique puedes llamarlo
RAT_De_TuNombre_Bot que en mi caso sería RAT_De_Manolo_Bot

Si el nombre es válido, verás un mensaje como:

Done! Congratulations on your new bot. You will find it at t.me/RAT_De_Manolo_Bot.


You can now add a description, about section and profile picture for your bot, see
/help for a list of commands. By the way, when you've finished creating your cool
bot, ping our Bot Support if you want a better username for it. Just make sure the
bot is fully operational before you do this.

Use this token to access the HTTP API:


5863933391:HBGUBfzdfpp0QtZVSvGaWUMbWvJi7dWLJK9
Keep your token secure and store it safely, it can be used by anyone to control your
bot.

For a description of the Bot API, see this page: https://core.telegram.org/bots/api

En este mensaje se incluye una url para poder hablar con el bot y un token que debes poner en
las peticiones que hagas al bot, por ejemplo para obtener los mensajes que le enviaron al bot.

IMPORTANTE: Este token no debes compartirlo con nadie, ya que se puede utilizar para controlar el
bot y por tanto si lo tienes funcionando en tu sistema o en otro, un desconocido que tenga tu token
del bot podría también controlar el sistema sin que tu lo sepas.

Podemos probar que todo funciona correctamente con un comando de curl. Abre un chat con el
bot usando el enlace que te dio BotFather y envíale el mensaje Hola!

Utiliza el siguiente comando para solicitar los mensajes del bot con curl:

curl 'https://api.telegram.org/botYOUR_BOT_TOKEN/getUpdates'

Obviamente remplaza YOUR_BOT_TOKEN por el token de tu bot. En mi caso sería:


curl 'https://api.telegram.org/bot5863933391:HBGUBfzdfpp0QtZVSvGaWUMbWvJi7dWLJK9/getUpdates'

NOTA: /getUpdates así como otros endpoints de la API de Telegram Bot están publicadas en la web
de telegram. Bot API. Si bajas por la web verás el getUpdates que estoy utilizando, asi como otros
que están disposibles

Si todo está correcto, verás una respuesta similar a:

{"ok":true,"result":[{"update_id":241851273,
"message":{"message_id":1,"from":{"id":827150271,"is_bot":false,"first_name":"StringManolo","username":"StringManolo"

Este formato se conoce como JSON y es bastante utilizado por muchos servicios. Con el
comando jq podremos extraer exactamente lo que necesitemos de la respuesta del bot. Por
ejemplo si queremos obtener solo el mensaje:

curl -s curl 'https://api.telegram.org/bot5863933391:HBGUBfzdfpp0QtZVSvGaWUMbWvJi7dWLJK9/getUpdates' | jq .result[0].

Veremos como resultado el mensaje 'Hola' que le escribimos al bot en el chat. La sintaxis de jq
es sencilla de entender, los puntos son para acceder a propiedades (es decir los nombres), y los
corchetes son para acceder al mensaje en concreto. Por ejemplo con [0] accedemos al primer
mensaje, con [1] accedemos al segundo, con [9] accedemos al décimo, etc. En este caso solo
tenemos el de Hola, pero si le envias mas cosas al chat del bot, tendrás mas.

Si espaciamos el JSON podemos ver mejor su estructura visualmente:

{
"ok": true,
"result": [
{
"update_id": 241851273,
"message": {
"message_id": 1,
"from": {
"id": 827150271,
"is_bot": false,
"first_name": "StringManolo",
"username": "StringManolo",
"language_code": "es"
},
"chat": {
"id": 167170617,
"first_name": "StringManolo",
"username": "StringManolo",
"type": "private"
},
"date": 1662723616,
"text": "Hola"
}
},

{
"update_id": 241851274,
"message": {
"message_id": 2,
"from": {
"id": 827150271,
"is_bot": false,
"first_name": "StringManolo",
"username": "StringManolo",
"language_code": "es"
},
"chat": {
"id": 167170617,
"first_name": "StringManolo",
"username": "StringManolo",
"type": "private"
},
"date": 1662723640,
"text": "Otro Mensaje"
}
}
]
}

Le añadí otro mensaje para que veas como queda.

Pues ahora que ya vemos mas o menos como funciona, lo que haremos es usar Bash para
obtener estos mensajes programáticamente, analizarlos y tomar decisiones en base al texto que
recibamos, por ejemplo si recibimos el mensaje /saluda podremos obtener el nombre del usuario
que nos envió ese mensaje, el id del chat y enviarle un mensaje tal que 'Hola Manolo' al mismo
chat que nos envió el mensaje /saluda. Con esta sencilla técnica si detectamos el mensaje '/run
ls' podremos ejecutar el comando ls usando Bash y enviarle al chat del usuario la respuesta del
comando ls. Así de esta forma es como tener una terminal remota, ya que todos los comandos
que le ponemos en el chat de telegram nuestro programa en bash los ejecutará y nos enviará la
respuesta.

Pues procedamos a implementar en bash nuestra primera función LeerMensajes que hicimos en
pseudocódugo en español. Para programar usaré VIM como editor de texto. Si no lo manejas
puedes revisar el Capítulo 6: Uso de VI y de VIM o puedes utilizar cualquier otro editor de texto.

Crearé el archivo llamado rat.sh con el siguiente comando:

vim rat.sh

Y dentro del archivo haremos la función LeerMensajes:

TOKEN='5863933391:HBGUBfzdfpp0QtZVSvGaWUMbWvJi7dWLJK9';

LeerMensajes() {
local -n referenciaMensajes=$2;
local comando='curl '"'"'https://api.telegram.org/bot';
comando+=$1; # $TOKEN
comando+='/getUpdates'"'"' --silent';
referenciaMensajes=$(eval $comando);
}

LeerMensajes $TOKEN mensajes;


echo $mensajes

Explicación del código:

Utilizo una variable para almacenar el token, ya que si lo metes directamente en el url y en el
futuro utilizas otro bot, o cambias el token de tu bot tendrías que cambiarlo de todas las urls. En
cambio usando la variable TOKEN tan solo hay que cambiarle el token ahí.

Obtengo una referencia local a la segunda variable que se pase en la llamada a la función (es una
técnica para poder rellenar la variable mensajes con lo que queramos)

Creo un texto tal que curl 'https://.....' después le añado el TOKEN, después el resto de la url.

Evalúo el texto para ejecutarlo como comando.

Le asigno a mensajes la respuesta del comando (el JSON).

Añadí también un código de ejemplo de como se utiliza la función para guardar el JSON en una
variable y lo imprimo en consola.

Si sales del editor y ejecutas el código con el comando:

bash rat.sh
Verás la misma salida que obteníamos al correr el comando curl en consola solicitando los
mensajes. Es decir, la función lo único que hace es guardar en una variable $mensajes la
respuesta del comando curl.

Para la función BorrarMensajes haremos lo mismo:

ultimoId=0;

BorrarMensajes() {
local -n referenciaMensajes=$2;
local comando='curl '"'"'https://api.telegram.org/bot';
comando+=$1; # $TOKEN
comando+='/getUpdates?offset=';
comando+=$(($ultimoId));
comando+=''"'"' --silent';
referenciaMensajes=$(eval $comando);
}

Explicación del código:

El código es prácticamente igual que la función LeerMensajes


Cambiamos el método del endpoint a /getUpdates?offset=$ultimoId
Por el resto es lo mismo. Esto lo explican en la documentación de Telegram Bot API. Al pasarle el
id de update del JSON se borran automáticamente los mensajes anteriores. El id de update lo
verás en el json, en este caso la variable ultimoId es una variable global como TOKEN que
modificaremos mas adelante.

La siguiente función es la de EnviarMensaje:

# Codifica comillas, guiones, barra invertida y otros caracteres especiales


CodificarMensaje() {
local cadena="${1}";
local tamanhoCadena=${#cadena};
local codificado="";
local pos c o;

for (( pos=0 ; pos<tamanhoCadena ; pos++ )); do


c=${cadena:$pos:1}
case "$c" in
[-_.~a-zA-Z0-9] ) o="${c}" ;;
* )
printf -v o '%%%02x' "'$c"
esac
codificado+="${o}";
done
globalCodificado=$(echo "${codificado}");
}

EnviarMensaje() {
local -n referenciaResultado=$3;
local respuesta=$1;
local idChat=$2;
# Si la respuesta es mas grande que la permitida por telegram, se envia en trozos de 4000 caracteres
if [[ ${#respuesta} -gt 4000 ]]; then
local comando='curl '"'"'https://api.telegram.org/bot';
comando+=$TOKEN;
comando+='/sendMessage?chat_id=';
comando+=$chatId;
comando+='&text=';
comando+='Respuesta En Trozos:';
comando+=''"'"' --silent';

# Envía el mensaje "Respuesta En Trozos:" indicando que la respiesta se enviará en múltiples mensajes
referenciaResultado=$(eval $comando);
# Envía los mensajes en trozos de 4.000 caracteres
for ((i=0; i<${#respuesta}; i+=4000)) do
local comando2='curl '"'"'https://api.telegram.org/bot';
comando2+=$TOKEN;
comando2+='/sendMessage?chat_id=';
comando2+=$idChat;
comando2+='&text=';
globalCodificado="";
CodificarMensaje "${respuesta:$i:4000}";
comando2+="$globalCodificado";
comando2+=''"'"' --silent';
referenciaResultado=$(eval $comando2);
done
else
local comando='curl '"'"'https://api.telegram.org/bot';
comando+=$TOKEN;
comando+='/sendMessage?chat_id=';
comando+=$idChat;
comando+='&text=';
globalCodificado="";
CodificarMensaje "$respuesta";
comando+="$globalCodificado";
comando+=''"'"' --silent';
referenciaResultado=$(eval $comando);
fi
}

Explicación del código:

Esta función es prácticamente igual a las otras 2 pero es un poco más larga porque contiene una
solución para casos en los que el mensaje de consola es demasiado largo como para enviarlo
directamente en un solo mensaje de Telegram (Ya que el tamaño máximo de un mensaje de
telegram es unos 4.000 caracteres).
También al enviar el mensaje con curl y utilizando una url es necesario escapar ciertos
caracteres, y por eso se incluye la función CodificarMensaje.

Ahora la función de Login:

usuariosLogeados=();

# Comprueba si el @usuario se ha logeado (Usando el comando /login contrasenha)


Login() {
local -n referenciaResultado=$2;
local usuario=$1;
for ((i=0; i < ${#usuariosLogeados}; i++)) do
if [[ $usuario = ${usuariosLogeados[$i]} ]]; then
referenciaResultado="true";
return;
fi
done
referenciaResultado="false";
}

Explicación del código:

En esta función recorremos la lista de usuariosLogeados para comprobar si el @usuario se


encuentra en ella. De momento la lista está vacia, la llenaremos mas adelante cuando el usuario
mande el mensaje '/login contraseña' siendo contraseña una variable global que contenga una
contraseña que tu quieras usar para el login.

La función para correr comandos podría quedar tal que:

CONTRASENHA='123456';

# Esta función comprueba si se ha detectado algún comando y define que hacer cuando se detecta el comando
CorrerComando() {
local -n referenciaResultado=$4;
local texto=$1;
local usuario=$2;
local idChat=$3;

printf '%s me envió %s usando el chat n°%s\n' "$usuario" "$texto" "$idChat";


# Haz loggin del usuario
local aux='/login ';
aux+="$CONTRASENHA";

# Comprueba si el mensaje del usario es igual a /login $CONTRASENHA


if [[ "$texto" = "\"$aux\"" ]]; then
usuariosLogeados+=($usuario);
local aux2="$usuario";
aux2+=' ha ingresado';
EnviarMensaje "$aux2" "$idChat" dummy;
fi

# Los comandos /start y hola están aquí como ejemplo de como se crean comandos
if [[ ${texto:1:4} = 'hola' || ${texto:1:6} = '/start' ]]; then
echo "/start o hola encontrados!";
local aux3='Hola ';
aux3+=$usuario;
aux3+=', como estas?';

EnviarMensaje "$aux3" "$idChat" dummy


fi

local haIngreaado;
Login "$usuario" haIngreaado;
if [[ $haIngreaado = 'true' ]]; then
if [[ ${texto:1:4} = '/run' ]]; then
tamanhoComando=${#texto};
tamanhoComando=$(($tamanhoComando - 7));
salida="$(eval ${texto:6:$tamanhoComando})";
if [[ -z $salida ]]; then
EnviarMensaje 'El comando no genero ningun texto en la terminal' "$idChat" dummy
else
EnviarMensaje "$salida" "$idChat" dummy
fi
fi
fi
}

Explicación del código:

Aquí creamos una global CONTRASEÑA para compararla con la que ponga el usuario tras el
comando /login. Si coinciden lo añadimos a la lista de usuarios logeados.

Definimos un comando /start y un texto hola a los que el bot siempre responderá. Aquí podrías
añadir los comandos típicos como puedan ser /help o /ayuda para que el bot indique a cualquier
usuario como se utiliza, etc.

Definimos el comando /login para que los usuarios puedan obtener privilegios.

Definimos el comando /run que solo lo podrán usar usuarios logeados y que nos sirve para
ejecutar comandos en la máquina que está corriendo el código. Creando así una terminal
remota. Hacer esta comprobación nos posibilita el hacer login en el bot desde un chat privado,
meter el bot en un chat público y correr comandos sobre él sin que los demás usuarios del chat
público puedan hacerlo (al no saber ellos la contraseña de login).

Ahora solo nos falta la lógica principal:

# Logica del Bot (bucle principal)


while [ true ]; do
LeerMensajes $TOKEN nuevosMensajes;
if [[ -z $nuevosMensajes ]]; then
echo 'No ha sido posible obtener los mensajes de Telegram';
exit;
fi

if [[ ! $(echo $nuevosMensajes | jq .ok) = true ]]; then


echo 'La API de Telegram ha fallado';
exit;
fi
mensajes=$(echo $nuevosMensajes | jq .result);
if [[ -z $mensajes ]]; then
echo 'No hay mensajes con los que trabajar';
exit;
fi

numeroDeMensajes=$(echo $mensajes | jq '. | length');


for ((m=1; m<$numeroDeMensajes; m++)) do
texto='NULL'
texto=$(echo $mensajes | jq .[$m].message.text);
usuario='NULL';
usuario=$(echo $mensajes | jq .[$m].message.from.username);
idChat=0;
idChat=$(echo $mensajes | jq .[$m].message.chat.id);
ultimoId=$(echo $mensajes | jq .[$m].update_id);
if [[ $texto != 'NULL' && $usuario != 'NULL' && $idChat -ne 0 ]]; then
CorrerComando "$texto" "$usuario" "$idChat" dummy;
fi
done

BorrarMensajes "$TOKEN" dummy;


sleep 5s;
done

Explicación de código:

Hacemos un bucle infinito para que el bot esté todo el rato comprobando si le llegan mensajes
nuevos y ejecutándolos cuando corresponda.
Hacemos algunas comprobaciones para detectar errores.
Extraemos la información necesaria, como el nombre del usuario, a que chat le responderemos y
los mensajes que nos manda.
Le ponemos el id de actualización a la variable ultimoId para que se borren los mensajes tras
procesarlos.
Recorremos todos los mensajes y ejecutamos la función CorrerComando para ejecutar los
comandos que le llegan en cada uno de los mensajes.
Por último borramos los mensajes y esperamos 5 segundos antes de volver a revisar si hay
mensajes nuevos y repetir todo el ciclo.

El código al completo de rat.sh queda tal que:

TOKEN='5863933391:HBGUBfzdfpp0QtZVSvGaWUMbWvJi7dWLJK9';
ultimoId=0;
globalCodificado="";
usuariosLogeados=();
CONTRASENHA='123456';

LeerMensajes() {
local -n referenciaMensajes=$2;
local comando='curl '"'"'https://api.telegram.org/bot';
comando+=$1; # $TOKEN
comando+='/getUpdates'"'"' --silent';
referenciaMensajes=$(eval $comando);
}

BorrarMensajes() {
local -n referenciaMensajes=$2;
local comando='curl '"'"'https://api.telegram.org/bot';
comando+=$1; # $TOKEN
comando+='/getUpdates?offset=';
comando+=$(($ultimoId));
comando+=''"'"' --silent';
referenciaMensajes=$(eval $comando);
}

# Codifica comillas, guiones, barra invertida y otros caracteres especiales


CodificarMensaje() {
local cadena="${1}";
local tamanhoCadena=${#cadena};
local codificado="";
local pos c o;

for (( pos=0 ; pos<tamanhoCadena ; pos++ )); do


c=${cadena:$pos:1}
case "$c" in
[-_.~a-zA-Z0-9] ) o="${c}" ;;
* )
printf -v o '%%%02x' "'$c"
esac
codificado+="${o}";
done
globalCodificado=$(echo "${codificado}");
}

EnviarMensaje() {
local -n referenciaResultado=$3;
local respuesta=$1;
local idChat=$2;
# Si la respuesta es mas grande que la permitida por telegram, se envia en trozos de 4000 caracteres
if [[ ${#respuesta} -gt 4000 ]]; then
local comando='curl '"'"'https://api.telegram.org/bot';
comando+=$TOKEN;
comando+='/sendMessage?chat_id=';
comando+=$chatId;
comando+='&text=';
comando+='Respuesta En Trozos:';
comando+=''"'"' --silent';

# Envía el mensaje "Respuesta En Trozos:" indicando que la respiesta se enviará en múltiples mensajes
referenciaResultado=$(eval $comando);
# Envía los mensajes en trozos de 4.000 caracteres
for ((i=0; i<${#respuesta}; i+=4000)) do
local comando2='curl '"'"'https://api.telegram.org/bot';
comando2+=$TOKEN;
comando2+='/sendMessage?chat_id=';
comando2+=$idChat;
comando2+='&text=';
globalCodificado="";
CodificarMensaje "${respuesta:$i:4000}";
comando2+="$globalCodificado";
comando2+=''"'"' --silent';
referenciaResultado=$(eval $comando2);
done
else
local comando='curl '"'"'https://api.telegram.org/bot';
comando+=$TOKEN;
comando+='/sendMessage?chat_id=';
comando+=$idChat;
comando+='&text=';
globalCodificado="";
CodificarMensaje "$respuesta";
comando+="$globalCodificado";
comando+=''"'"' --silent';
referenciaResultado=$(eval $comando);
fi
}

# Comprueba si el @usuario se ha logeado (Usando el comando /login contrasenha)


Login() {
local -n referenciaResultado=$2;
local usuario=$1;
for ((i=0; i < ${#usuariosLogeados}; i++)) do
if [[ $usuario = ${usuariosLogeados[$i]} ]]; then
referenciaResultado="true";
return;
fi
done
referenciaResultado="false";
}

# Esta función comprueba si se ha detectado algún comando y define que hacer cuando se detecta el comando
CorrerComando() {
local -n referenciaResultado=$4;
local texto=$1;
local usuario=$2;
local idChat=$3;

printf '%s me envió %s usando el chat n°%s\n' "$usuario" "$texto" "$idChat";

# Haz loggin del usuario


local aux='/login ';
aux+="$CONTRASENHA";

# Comprueba si el mensaje del usario es igual a /login $CONTRASENHA


if [[ "$texto" = "\"$aux\"" ]]; then
usuariosLogeados+=($usuario);
local aux2="$usuario";
aux2+=' ha ingresado';
EnviarMensaje "$aux2" "$idChat" dummy;
fi

# Los comandos /start y hola están aquí como ejemplo de como se crean comandos
if [[ ${texto:1:4} = 'hola' || ${texto:1:6} = '/start' ]]; then
echo "/start o hola encontrados!";
local aux3='Hola ';
aux3+=$usuario;
aux3+=', como estas?';

EnviarMensaje "$aux3" "$idChat" dummy


fi

local haIngreaado;
Login "$usuario" haIngreaado;
if [[ $haIngreaado = 'true' ]]; then
if [[ ${texto:1:4} = '/run' ]]; then
tamanhoComando=${#texto};
tamanhoComando=$(($tamanhoComando - 7));
salida="$(eval ${texto:6:$tamanhoComando})";
if [[ -z $salida ]]; then
EnviarMensaje 'El comando no genero ningun texto en la terminal' "$idChat" dummy
else
EnviarMensaje "$salida" "$idChat" dummy
fi
fi
fi
}

# Logica del Bot (bucle principal)


while [ true ]; do
LeerMensajes $TOKEN nuevosMensajes;
if [[ -z $nuevosMensajes ]]; then
echo 'No ha sido posible obtener los mensajes de Telegram';
exit;
fi

if [[ ! $(echo $nuevosMensajes | jq .ok) = true ]]; then


echo 'La API de Telegram ha fallado';
exit;
fi

mensajes=$(echo $nuevosMensajes | jq .result);


if [[ -z $mensajes ]]; then
echo 'No hay mensajes con los que trabajar';
exit;
fi

numeroDeMensajes=$(echo $mensajes | jq '. | length');


for ((m=1; m<$numeroDeMensajes; m++)) do
texto='NULL'
texto=$(echo $mensajes | jq .[$m].message.text);
usuario='NULL';
usuario=$(echo $mensajes | jq .[$m].message.from.username);
idChat=0;
idChat=$(echo $mensajes | jq .[$m].message.chat.id);
ultimoId=$(echo $mensajes | jq .[$m].update_id);
if [[ $texto != 'NULL' && $usuario != 'NULL' && $idChat -ne 0 ]]; then
CorrerComando "$texto" "$usuario" "$idChat" dummy;
fi
done

BorrarMensajes "$TOKEN" dummy;


sleep 5s;
done

RECUERDA: Para ejecutarlo necesitas poner el token de tu bot de Telegram, poner una contraseña,
tener una cuenta de usuario con el @nombre (para que el bot te meta a la lista de usuarios
logeados). También necesitas instalar bash, curl y jq en el sistema que va a correr el bot

Para ejecutarlo simplemente usa el comando:

bash rat.sh

NOTA: La versión en inglés, que es una versión mas completa y actualizada de este programa se
encuentra en https://github.com/stringmanolo/tgbot.sh, esa versión carga el token y la contraseña
de archivos llamados token.txt y password.txt que se encuentren en la misma carpeta que el
programa. En el repositorio se encuentran las instrucciones, que son prácticamente idénticas que
estas.
Aquí tienes un video de la versión en inglés del bot en funcionamiento:
Tabla de Contenidos

Capítulo 25: Protocolo HTTP

HyperText Transfer Protocol (HTTP) en español Protocolo de transferencia de hipertexto es un


protocolo de transferencia de datos que permite la comunicación entre un servidor y un cliente.
Un protocolo es un conjunto de reglas que definen la forma de interacción entre el cliente y el
servidor.

Es el idioma fundamental de la web. Cuando introduces una url en el navegador este establece
un tunel con el servidor web y le envia la petición HTTP. Esta petición incluye información sobre
el recurso que se quiere solicitar, por ejemplo el index.html, que es el contenido que se quiere
mostrar en el navegador.

Petición HTTP

GET / HTTP/1.1
Host: example.com

Vamos a explicar que es cada apartado:

El primer apartado es el método, en este caso GET que en español significa OBTÉN. Los métodos
le dicen al servidor que tipo de operación queremos realizar, en este caso con GET le decimos
que queremos obtener un recurso. Si usásemos por ejemplo el método POST le indicaríamos que
queremos enviarle información al servidor.
El segundo apartado es la path o ruta que le indica cual es el recurso/la ubicación del recurso
que queremos obtener.
Cuando utilizamos / (un directorio/carpeta) el servidor busca automáticamente si existe un
index.html en dicha carpeta. Si usásemos /imagenes/foto.jpg buscaría foto.jpg dentro de la
carpeta imagenes.
El tercer apartado es la versión del protocolo
Hay distinas versiones del protocolo http, cada una con sus normas específicas, pero por lo
general son todas casi idénticas.

Estos tres apartados siempre deben aparecer en la primera linea de la petición seguidos de un
salto de linea. Esta linea se conoce como Request Line (linea de solicitud).

Tras la linea de solicitud van las cabeceras de la petición, cada cabecera se compone por el
nombre del encabezado dos puntos (:) y el valor del encabezado.

En este caso el nombre del encabezado es Host y el valor es example.com. Esta cabecera sirve
para indicarle al servidor web el nombre del dominio al que estamos realizando la petición. Es
importante porque un mismo servidor puede tener alojadas cientos de páginas webs distintas de
dominios distintos, lo que usualmente se conoce como hosting/hosting compartido. Si no le
ponemos la cabecera host el servidor web no tiene forma de saber que página de las que tiene
alojadas es la que estamos solicitando. Tras el primer encabezado puedes añadir todas las
cabeceras que quieras.

Una vez incluiste todos los encabezados debes añadir 2 saltos de linea al final de la petición para
indicar el final de la misma.

Esta petición es enviada al servidor mediante un tunel de red que se ha establecido utilizando la
IP y una vez llega al servidor, este la lee y responde en consecuencia en base a lo que tu le
indicaste en dicha petición. Si por ejemplo le pediste una imagen, la buscará en la carpeta
imagenes, la leera y te enviará una respuesta HTTP en la que al final de la misma viene la
imagen. Antes de ver como son las respuestas http, veremos cuales son los métodos y
cabeceras mas comunes.

Métodos HTTP
Los métodos mas comunes son:

GET: Solicita datos de un recurso específico en el servidor. Se utiliza para recuperar información
y no debe tener efectos secundarios en el servidor.

POST: Envía datos al servidor para ser procesados. Se utiliza para enviar información que el
servidor debe manejar, como enviar datos de un formulario.

PUT: Actualiza un recurso existente en el servidor. Se utiliza para modificar o reemplazar


completamente un recurso en el servidor.

DELETE: Elimina un recurso en el servidor. Se utiliza para solicitar la eliminación de un recurso


específico.

PATCH: Aplica modificaciones parciales a un recurso existente en el servidor. Permite actualizar


solo partes específicas de un recurso.

HEAD: Similar a GET, pero solicita solo los encabezados del recurso sin el cuerpo de la respuesta.
Se utiliza para obtener información sobre el recurso sin descargar su contenido completo.

OPTIONS: Solicita información sobre las capacidades de comunicación del servidor. Permite al
cliente averiguar qué métodos o encabezados son admitidos por el servidor.

CONNECT: Se utiliza para establecer una conexión en red con el recurso identificado por la URI. A
menudo se utiliza para establecer una conexión segura a través de un proxy.

TRACE: Realiza una solicitud de bucle de retorno al servidor. Se utiliza para probar y depurar la
ruta de la solicitud a través de varios servidores.

Otros métodos mas o menos establecidos con los que te puedes encontrar pero que son menos
comunes son: COPY, MOVE, LINK, UNLINK, LOCK, UNLOCK, PURGE, REBIND y SEARCH. Su uso es
tan infrecuente que no merece la pena comentar para que sirven, solo con que tengas
conocimiento de la existencia de otros métodos es suficiente.

Cabeceras HTTP

Las cabeceras http mas comunes son:

Host: Indica el nombre de dominio del servidor al que se está haciendo la solicitud.

User-Agent: Identifica el software y la versión utilizados por el cliente.

Accept: Especifica los tipos de contenido que el cliente está dispuesto a aceptar.

Content-Type: Indica el tipo de contenido en el cuerpo de la petición o respuesta.

Authorization: Proporciona credenciales de autenticación para acceder a recursos protegidos.

Cookie: Envia información de cookies almacenada previamente por el servidor.

Cache-Control: Controla el almacenamiento en caché de la respuesta en el cliente o el servidor.

Content-Length: Indica la longitud del cuerpo de la solicitud o respuesta en bytes.

Origin: Indica la URL de origen de una solicitud de recursos cruzados (CORS).

Referer (Referer): Indica la URL de la página desde la cual se originó la solicitud.

User-Agent: Identifica el software del cliente, como un navegador o una aplicación.

If-None-Match: Permite la validación de la caché condicional utilizando una entidad de etag.

If-Modified-Since: Permite la validación de la caché condicional utilizando una fecha.

Accept-Language: Indica las preferencias de idioma del cliente para la respuesta.

Accept-Encoding: Indica las codificaciones de contenido que el cliente acepta.

Connection: Controla si la conexión al servidor debe mantenerse abierta o cerrarse.


Al contrario que con los métodos que solo unos pocos son comunes, con las cabeceras hay
decenas de ellas que se usan frecuentemente, aquí solo se comentan las más típicas, pero hay
muchas más y si te las encuentras tendrás que buscar que hace cada una.

Handcrafting (construcción manual)

Un término común en hacking es el handcrafting de peticiones. Se refiere al hecho de nosotros


escribir a mano las cabeceras http en lugar de usar una heramienta como pueda ser un
navegador para que lo haga todo automático. Esto nos permite controlar con detalle
exactamente lo que queremos enviar, por ejemplo si queremos mandar caracteres raros para
probar si el servidor funciona correctamente o si por el contrario crashea (peta, detiene la
ejecución).

Hay múltiples herramientas que nos permiten enviar peticiones HTTP desde la terminal. Una
similar a un navegador es curl. Instálala con el comando:

pkg install curl

Curl nos permite enviar y construir las peticiones HTTP de forma automática pero nos da la
opción de modificar sus campos. Esto está bien si queremos interactuar con el servidor de forma
correcta. Por ejemplo si quieres solicitar la web de example.com usas el comando:

curl 'http://example.com'

Curl lo que hace es crear automáticamente la petición y enviarla al servidor. Con el comando
anterior curl enviará la siguiente petición:

GET / HTTP/1.1
Host: example.com
User-Agent: curl/7.82.0
Accept: */*

Si quieres editar las cabeceras puedes usar el argumento -H.

curl 'http://example.com' -H 'User-Agent: Mozilla/5.0'

Curl creará la siguiente petición:

GET / HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0
Accept: */*

Si quieres cambiar el método puedes usar el argumento -X:

curl 'http://example.com' -X 'PUT'

Curl creará la siguiente petición:

PUT / HTTP/1.1
Host: example.com
User-Agent: curl/7.82.0
Accept: */*
Curl tiene muchísimas opciones. Es muy buena herramienta para un uso normal. En cambio si
queremos tener total control de lo enviado podemos usar otras herramientas. Mi favorita es ncat.
Ncat te permite enviar lo que tu escribas. Viene con el paquete de nmap asique para instalar ncat
usaremos el comando:

pkg install nmap

Para enviar una petición HTTP con ncat podemos escribirla primero en un archivo con un editor
de texto y hacer cat del archivo y pasárselo a ncat o directamente con el comando echo de bash:

echo 'GET / HTTP/1.1


Host: example.com

' | ncat example.com 80

ncat nos permitirá poner cualquier cosa, lo cual puede ser muy útil para testear la seguridad de
un servidor web. Por ejemplo podríamos enviar la siguiente petición:

echo '/ GET HTTP/1.1


Host: example.com

' | ncat example.com 80

El servidor nos responderá con una respuesta código de error 501 (Not Implemented) que indica
que el método / no lo ha implementado el servidor, es decir que el servidor no reconoce ese
método, ya que solo reconoce GET, HEAD, ... pero no /

De esto podríamos inferir que lo que está haciendo es tomar lo primero que le mandamos antes
de un espacio y entiende que eso es el método de la petición, lo que nos puede llevar a la
pregunta de, y si en lugar de GET o / que pasaría si le ponemos un espacio?

echo ' / HTTP/1.1


Host: example.com

' | ncat example.com 80

Y efectivamente, si no encuentra GET u otro método valido nos seguirá respondiendo que el que
le pasamos no está implementado.

Hay programas que hacen esto automáticamente, se les conoce como fuzzers y son muy útiles
para encontrar fallos de seguridad.

IMPORTANTE: Estas pruebas se realizan únicamente con fines educativos, el uso de estas
técnicas de testing sin que te de permiso el dueño del servidor, es ilegal, ya que imagínate que
enviándole una petición malformada el servidor no sabe como responder y se congela su
proceso. El dueño del servidor podría denunciarte porque le has dejado el servidor fuera de
servicio y el resto de visitantes no han podido acceder. A demás de ser un delito informático
también puede ocasionarle costes a la empresa del servidor, por ejemplo podrían dejar de ganar
dinero con anuncios ya que la web no está disponible y tener que invertir el tiempo de sus
empleados en revisar la petición, corregir el fallo y volver a poner el servidor online. Estarían en
su derecho de demandarte y solicitarte como compensación que abones dichos costes. En
resumen, cárcel y multa. Asique para este tipo de pruebas utiliza tus propias webs y servidores
en local, así podrás testear en ellas todo lo que quieras sin perjudicar a nadie. En el Capítulo 18:
Creando un Servidor ya se explicó como crear un servidor web en local con python3. En los
siguientes apartados de este capítulo también veremos como hacerlo con ncat.

Parámetros HTTP
Los parámetros http sirven para enviar información adicional, por ejemplo podrías indicarle al
servidor el idioma en que quieres que te devuelva cierto recurso. O para hacer login en la página
web podrías enviarle tu usuario y contraseña.

Hay 2 formas de enviar los parámetros y podemos clasificarlos según que parte de la petición
utilicemos para enviarlos. Parámetros de consulta o parámetros en el cuerpo de la petición.

Parámetros de consulta
Si alguna vez te fijaste en la url/enlace de Google tras buscar algo verías que entre otros
parámetros contiene uno llamado q. Por ejemplo https://www.google.com/search?q=termux
q viene de la palabra query en español consulta. Para indicar que vamos a pasar parámetros a un
recurso se utiliza el símbolo de cierre de interrogación. Después indicamos el nombre del
parámetro, (en este caso google usa q) seguido de un = y del valor de dicho parámetro que en
este caso es lo que queremos buscar en google. Si lo pones en el navegador verás que te lleva a
la búsqueda de la palabra termux en Google. Si quieres pasar mas de un parámetro tienes que
usar & como separador para que el servidor sepa donde acaba un parámetro y donde empieza el
siguiente. Por ejemplo si quieres que solo te responda páginas en inglés google utiliza el
parámetro lr (language response en español idioma de respuesta) y como valor utiliza lang_país
por ejemplo para inglés la url sería: https://www.google.com/search?q=termux&lr=lang_en para
español sería https://www.google.com/search?q=termux&lr=lang_es para frances lang_fr, para
portugués lang_pt, etc.

No hay una estandarización de que parámetros utilizar o que nombres deben tener, es decir, que
cada web utiliza lo que le da la gana. Por ejemplo Google usa ese formato de lr=lang_es para los
idiomas mientras que otra página puede usar lang=spanish, otra idioma=francés, otra l=1, etc.

Como puedes deducir para enviar estos parámetros en una petición HTTP usamos el apartado
de la ruta:

echo 'GET /search?q=termux&lr_lang_es HTTP/1.1


Host: www.google.com
User-Agent: Mozilla/5.0
Accept: */*

' | ncat google.com 80

Parámetros en el cuerpo de la petición

Los parámetros en el cuerpo de la petición se suelen utilizar con el método POST y normalmente
son parámetros que no queremos que se vean en la url. Por ejemplo si estamos en un lugar
público no nos gustaría que nuestra contraseña saliese en la url del navegador como pasaba con
la búsqueda en Google. Entonces lo que hacemos es enviarlos después de las cabeceras. Este
espacio después de las cabceras es lo que se conoce como cuerpo de la petición. La petición
anterior se vería de la siguiente forma si usamos el cuerpo de la petición en lugar de la ruta:

echo 'GET /search HTTP/1.1


Host: www.google.com

q=Termux&lr=lang_es

' | ncat google.com 80

Si haces esta petición veras que Google te responde con el Error 400 Bad Request (mala
petición) y es que muchos servidores no admiten que envies el cuerpo de la petición con el
método GET.

El equivalente usando POST sería:

echo 'POST /search HTTP/1.1


Host: www.google.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 19

q=Termux&lr=lang_es

' | ncat google.com 80

Si vemos la respuesta de google nos dice 405 Method Not Allowed (metodo no permitido), es
decir, google.com/search en este caso no acepta que le hagamos las consultas por POST. Eso ya
es decisión de cada web. Otros buscadores como duckduckgo si que permiten tanto la búsqueda
por parámetros en GET como por POST
Aquí el ejemplo de muestra de como duckduckgo si que acepta que le enviemos el parámetro en
el cuerpo de la petición:

echo 'POST / HTTP/1.1


Host: duckduckgo.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 8

q=Termux

' | ncat duckduckgo.com 80

Como ya comentamos anteriormente para realizar este tipo de peticiones "correctas" puedes
utilizar curl, ya que es mas sencillo:

curl -v 'https://duckduckgo.com/?q=termux'

Cuando necesites mas control es cuando debes usar el crafting manual de las peticiones con
ncat.

Respuesta HTTP

Cuando realizamos una petición HTTP el servidor también nos responde utilizando el protocolo
HTTP. Por ejemplo si hacemos la petición:

echo 'GET / HTTP/1.1


Host: example.com

' | ncat example.com 80

El servidor web ubicado en example.com puerto 80 nos responderá lo siguiente:

HTTP/1.1 200 OK
Age: 425281
Cache-Control: max-age=604800
Content-Type: text/html; charset=UTF-8
Date: Wed, 09 Aug 2023 15:31:53 GMT
Etag: "3147526947+ident"
Expires: Wed, 16 Aug 2023 15:31:53 GMT
Last-Modified: Thu, 17 Oct 2019 07:18:26 GMT
Server: ECS (dcb/7FA5)
Vary: Accept-Encoding
X-Cache: HIT
Content-Length: 1256

<!doctype html>
<html>
<head>
<title>Example Domain</title>
<meta charset="utf-8" />
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<style type="text/css">
body {
background-color: #f0f0f2;
margin: 0;
padding: 0;
font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", "Open Sans", "Helvetica Neue", Helveti

}
div {
width: 600px;
margin: 5em auto;
padding: 2em;
background-color: #fdfdff;
border-radius: 0.5em;
box-shadow: 2px 3px 7px 2px rgba(0,0,0,0.02);
}
a:link, a:visited {
color: #38488f;
text-decoration: none;
}
@media (max-width: 700px) {
div {
margin: 0 auto;
width: auto;
}
}
</style>
</head>

<body>
<div>
<h1>Example Domain</h1>
<p>This domain is for use in illustrative examples in documents. You may use this
domain in literature without prior coordination or asking for permission.</p>
<p><a href="https://www.iana.org/domains/example">More information...</a></p>
</div>
</body>
</html>

Como puedes observar la primera linea nos indica la versión del protocolo con la que nos
responde, un número que se conoce como código de estado y una descripción corta en texto con
lo que significa ese código frase de estado. Por ejemplo 200 nos dice que todo está OK, que en
respuesta a GET suele significar que encontró el rescurso que le pedimos (el /index.html). Otro
código de respuesta muy conocido es el 404 Not Found (no encontrado que nos suele aparecer
cuando solicitamos un recurso que no existe en el servidor.

A partir de ahí también nos responde con cabeceras. Vamos a ver que significa cada una de las
cabeceras que nos envió:

Age: Indica cuánto tiempo ha pasado desde que la respuesta fue generada por el servidor (en
segundos).
Cache-Control: Especifica las directivas de control de caché que deben aplicarse tanto a la
solicitud como a la respuesta. En este caso, max-age=604800 indica que el contenido se puede
almacenar en caché durante 604800 segundos (7 días).
Content-Type: Indica el tipo de contenido del cuerpo de la respuesta. En este caso, text/html;
charset=UTF-8 indica que el contenido es HTML con codificación UTF-8.

Date: Muestra la fecha y hora en que se generó la respuesta.


Etag: Proporciona una etiqueta que identifica única e individualmente la versión actual del
recurso. Se utiliza para la validación de la caché condicional.
Expires: Indica la fecha y hora en que expira el contenido almacenado en caché.
Last-Modified: Muestra la fecha y hora en que se modificó por última vez el recurso en el servidor.
Server: Indica el software del servidor que respondió a la solicitud.
Vary: Indica qué encabezados de solicitud se utilizaron para determinar la respuesta almacenada
en caché. En este caso, Accept-Encoding indica que la respuesta puede variar según la
codificación de contenido aceptada.
X-Cache: Proporciona información sobre el estado de la caché en el servidor. HIT indica que la
respuesta se sirvió desde la caché.
Content-Length: Indica la longitud del cuerpo de la respuesta en bytes. Mas o menos equivale al
número de caracteres que tiene el archivo que le solicitamos.

Tras las cabeceras de respuesta se incluye el contenido del archivo solicitado, en este caso es el
index.html de la página example.com. Si lo guardas y lo abres en un navegador verás la web de
example.com

HTTPS

Ya sabes que es HTTP, pero entonces que es HTTPS, otro protocolo? En verdad no, cuando nos
referimos a HTTPS nos estamos refieriendo a HTTP pero enviado en un tunel seguro. Si
conectamos directamente a un servidor por ejemplo con el comando ncat example.com 80
estamos estableciendo un tunel TCP/IP con el servidor de example.com por el cual mandaremos
el mensaje siguiendo el protocolo HTTP. El puerto 80 es el puerto por defecto para el protocolo
HTTP sin cifrar, si queremos establecer un canal cifrado usaremos el puerto 443. Por ejemplo:

echo 'GET / HTTP/1.1


Host: example.com

' | t l 443

Releases

No releases published

Sponsor this project

StringManolo StringManolo

Sponsor

Learn more about GitHub Sponsors

Packages

No packages published

Languages

HTML 100.0%

También podría gustarte