Termux

Termux icon

Introducción

Termux es una poderosa herramienta de emulación de terminal que permite ejecutar un entorno Linux (casi completo) sin necesidad de rootear el dispositivo móvil Android. Es decir, sin necesidad de conseguir permisos/control de superusuario (root) del sistema operativo del móvil.

Nota

Rootear un Android es el equivalente a hacer jailbreaking en iPhones o iPads.

Los binary packages que necesitemos instalar en nuestra distro Linux del móvil los podemos manejar usando un package manager, típicamente el de FreeBSD, para tareas como actualizar, instalar y eliminar software. Desde mi experiencia, no hay problema instalando la mayoría de los paquetes normales, siempre que se encuentre un mirror practicable para descargarlos.

La mejor manera de instalar Termux es mediante F-Droid. Puedes obtener las builds de Termux desde F-Droid. No lo instales desde Google Play. Como apuntan en su wiki. Algo igual de vital que Termux son sus addons (e.g., API). Las opciones para instalar todo esto son: o bien desde F-Droid todo, o bien desde otros instaladores externos todo, o bien desde Google Play, que no te va a funcionar correctamente. Google lo “capa” y trata de controlar y restringir todo aquello externo que se usa dentro de sus herramientas, por supuesto.

Android vs Linux

Como curiosidad, el propio sistema operativo Android (creado por Google) está basado en el kernel de Linux, pero con una diferencia clave: Android es Linux sin GNU. Esto significa que, aunque comparte el núcleo con distribuciones tradicionales como Ubuntu o Debian, prescinde de las herramientas GNU y en su lugar utiliza componentes propios como la biblioteca Bionic y un entorno de ejecución basado en Java (Dalvik/ART). Esta modularidad permite que cualquier móvil, independientemente del fabricante, pueda ejecutar Android, aunque requiere drivers propietarios para cada componente hardware (cámaras, sensores, chips de radio, etc.), lo que limita la estandarización y la libertad de modificación.

Por el contrario, un sistema Linux tradicional (GNU/Linux) combina el kernel Linux con herramientas GNU, ofreciendo un ecosistema de software nativo (GTK/Qt, gestores de paquetes como APT o DNF) y mayor compatibilidad con hardware estándar (gracias a BIOS/UEFI y drivers más abiertos). Mientras Android está optimizado para móviles con interfaces táctiles y restricciones de fabricantes, las distros GNU/Linux priorizan la flexibilidad, el control del usuario y la interoperabilidad en PCs y servidores. En resumen: Android es Linux en su núcleo, pero con un enfoque radicalmente distinto en software, hardware y filosofía de uso.

Termux

Ahora bien, ¿para qué es útil esta herramienta? ¿Para qué quiero ni siquiera un Linux en Android? Pues aquí nos cuentan unas cuantas aplicaciones posibles.

Por ejemplo:

  1. Automatizar tareas (fotos, backups, alarmas…).
  2. Ejecutar scripts en Python, Bash, Node.js, etc.
  3. Servidores web, bases de datos, herramientas de hacking ético.
  4. Monitorear sensores del dispositivo (GPS, batería, acelerómetro).
  5. Entrar desde SSH al móvil, usar el modo gráfico, etc.

En este post, exploraremos varias herramientas muy interesantes, una a una, y las juntaremos en una sola gran automatización, incluyendo:

  1. Automatización con crontab de múltiples funcionalidades (tomar fotografías automáticamente, activar el modo silencioso, bajar el brillo a una hora determinada…).
  2. Seguridad y antirobo (envío de ubicación a Telegram por si se pierde el móvil o lo roban).

termuxHome

Sobre el almacenamiento compartido

En Termux, se puede acceder al almacenamiento del usuario (como /sdcard) si se da permiso con el comando termux-setup-storage. Pero no se pueden ver carpetas privadas de otras apps ni todo el sistema sin root. Con root, sí se puede, pero naturalmente tiene riesgos. Para compartir carpetas, se pueden copiar archivos entre Termux y las carpetas que sí son accesibles.

Nota

Sobre la opacidad de Android o Google

Parece que desde Android 11, Google aplica “Scoped Storage”, que bloquea el acceso libre al almacenamiento y oculta carpetas como /Android/data/, afectando a gestores de archivos y a apps avanzadas como Termux, que deben recurrir a métodos alternativos (FTP, SSH, document picker) para mover archivos; aunque se justifica como una mejora de seguridad, muchos lo ven como un cerrojazo que limita la libertad del usuario y refuerza el control de Google sobre el ecosistema Android.

Tarea de crontab para tomar una foto

Para hacer una foto, veremos que se puede ejecutar un comando como este:

termux-camera-photo -c 1 ~/storage/shared/Pictures/TermuxFotos/foto-$(date +%Y%m%d-%H%M).jpg

Tarea crontab lista para que tome una foto todos los días a las 18:09 con la cámara frontal (-c 1), y la guarde en ~/storage/shared/Pictures/TermuxFotos/.

En Termux, ejecutar:

crontab -e

Añade esta línea al final:

9 18 * * * mkdir -p ~/storage/shared/Pictures/TermuxFotos && termux-camera-photo -c 1 ~/storage/shared/Pictures/TermuxFotos/foto-$(date +\%Y\%m\%d-\%H\%M).jpg

Nota

Se usan \% en lugar de % para evitar errores en crontab, que interpreta % como un salto de línea.

La opción -c 1 indica usar la cámara frontal. Guardar en la carpeta TermuxFotos dentro de Pictures. Asegúrate de que crond esté funcionando. En Termux, ejecutar:

pkg install cronie -y
crond

Para que el servicio cron se inicie automáticamente cada vez que abras Termux, se puede añadir esto al ~/.bashrc o ~/.zshrc:

echo "crond" >> ~/.bashrc

Por último, verificar permisos de ejecución desde el Android base. Asegurarse de que Termux tiene permiso para cámara y almacenamiento en: Ajustes > Aplicaciones > Termux > Permisos

Salir de Termux, naturalmente, impide que crond siga funcionando aunque sea en segundo plano, en principio y a este nivel básico, pues todos los procesos en segundo plano se detienen, incluyendo crond. Una opción para impedir que esto pase, que las actividades en segundo plano sigan funcionando, sería (además de rootear el móvil) explorar herramientas como termux-wake.

Aplicaciones

A continuación, un grupo de experimentos curiosos con Termux, listados y con ejemplos de funcionamiento.

Antes de nada, cómo instalar paquetes, e.g., requests:

Para instalar el paquete requests en Termux, primero se necesita tener Python instalado. Guía aproximada:

  1. Instalar Python en Termux Abrir Termux y ejecutar:
    pkg update && pkg upgrade
    pkg install python
    
  2. Instalar pip (viene con Python normalmente) Verificar que pip esté instalado:
    pip --version
    

    Si no está, se puede intentar reinstalar Python:

    pkg install python
    
  3. Instalar el paquete requests Una vez se tenga pip, simplemente instalar requests con:
    pip install requests
    
  4. Probar la instalación Abrir Python en la terminal:
    python
    

    Y luego escribir:

    import requests
    print(requests.__version__)
    

Macro-automatización de tareas

Se puede manipular la batería y otras funciones del móvil con tareas, todas practicables y automatizables desde Termux:

🔋 1. Reducir brillo si la batería baja del 55%

[ "$(termux-battery-status | jq .percentage)" -lt 55 ] && termux-brightness 25

✅ Puedes ponerlo en un script y ejecutarlo con cron cada 10 minutos, por ejemplo.

🔌 2. Poner brillo al 80% si el cargador está conectado

[ "$(termux-battery-status | jq .status)" = "CHARGING" ] && termux-brightness 200

🔇 3. Silenciar el volumen por completo por la noche

termux-volume music 0
termux-volume ring 0
termux-notification --title "Silencio nocturno" --content "Volumen desactivado"

Se pueden poner en crontab a las 23:00, por ejemplo.

🔔 4. Alarma si batería baja de 20%

[ "$(termux-battery-status | jq .percentage)" -lt 20 ] && termux-toast "¡Batería baja!" && termux-vibrate

📸 5. Tomar una foto cada X horas y guardarla

Se podría tomar una cada 3 horas:

termux-camera-photo -c 0 ~/storage/shared/TermuxFotos/foto-$(date +%Y%m%d-%H%M).jpg

Esto es por mera diversión, la verdad, como la aplicación BeReal, solo que verdaderamente sin que te des cuenta.

foto_aleatoria

Macro-tarea con crontab

Podemos usar cron -e para programar una macro-tarea de scripts con Termux, del tipo:

/data/data/com.termux/files/usr/tmp/crontab.kdcFYy
# 🕗 1. Tomar 10 fotos al día (una cada hora de 8:00 a >
0 8 * * * ~/bin/foto_aleatoria.sh
0 9 * * * ~/bin/foto_aleatoria.sh
0 10 * * * ~/bin/foto_aleatoria.sh
0 11 * * * ~/bin/foto_aleatoria.sh
0 12 * * * ~/bin/foto_aleatoria.sh
0 13 * * * ~/bin/foto_aleatoria.sh
0 14 * * * ~/bin/foto_aleatoria.sh
0 15 * * * ~/bin/foto_aleatoria.sh
0 16 * * * ~/bin/foto_aleatoria.sh
0 17 * * * ~/bin/foto_aleatoria.sh

# 🔋 2. Cada 10 minutos: si la batería está por debajo >
*/10 * * * * [ "$(termux-battery-status | jq .percentag>

# 🔌 3. Cada 10 minutos: si está cargando, sube el bril>
*/10 * * * * [ "$(termux-battery-status | jq -r .status>

# 🔇 4. A las 23:00, silenciar todo el volumen
0 23 * * * termux-volume music 0 &…

cron

Todo esto también se puede programar con un termux-job-scheduler.

Alarma a Telegram de localización

Ahora haremos un script que mande geolocalización/ubicación a un canal de Telegram, por si lo roban y que funcione incluso estando el teléfono bloqueado. Usando Python y solicitudes a la API de un servicio de localización aproximada mediante IP, por ejemplo.

Para que la tarea funcione aunque esté bloqueado, sepamos que en Linux, se pueden programar scripts que se ejecuten en segundo plano con cron, incluso al inicio del sistema, mediante un simple símbolo &. (Algo que violaría políticas de seguridad de la plataforma en Android/iOS y además sería mucho más complicado sin acceso root/jailbreak o aplicaciones que automatizan tareas, incluso con widgets, como Tasker (ver aquí) o MacroDroid).

Para conseguir acceso a la geolocalización, como para acceder a GPS necesitamos permiso a dicha herramienta y no siempre es posible, o como alternativa, podemos obtener ubicación aproximada mediante redes WiFi cercanas o IP. Eso sí, si no hay acceso a Internet, si no hay red, no hay forma de enviar nada.

A continuación describimos cómo usamos requests a https://ip-api.com/ para obtener la ubicación y enviarla por Telegram.

Primero necesitamos crear un bot de Telegram. Esto se vuelve trivial hablando con @BotFather. Se escribe: /newbot y se sigue los pasos.

Guardar el token del bot (algo como 123456789:ABCdefGHIjkl...).

Luego, mandar cualquier mensaje al bot (e.g., “Hola”) y obtener el ID del grupo entrando en la URL tipo https://api.telegram.org/bot<tu_token>/getUpdates (reemplazando <tu_token> por el del bot que acabamos de crear)

Se verá el chat.id del grupo => a mi me salió 146XXXXXXX (tampoco lo voy a poner aquí)

El script Python que envía ubicación cada 3 segundos puede ser algo así:

import requests
import time

# Configuración del bot
BOT_TOKEN = 'TU_TOKEN_DEL_BOT'
CHAT_ID = '-146XXXXXXX'  # ID del grupo

def get_location():
    try:
        response = requests.get('http://ip-api.com/json/')
        data = response.json()
        location = f"🌍 {data['city']}, {data['regionName']}, {data['country']}\n" \
                   f"📍 Lat: {data['lat']} - Lon: {data['lon']}\n" \
                   f"💻 IP: {data['query']}"
        return location
    except:
        return "❌ No se pudo obtener la ubicación"

def send_telegram(message):
    url = f"https://api.telegram.org/bot{BOT_TOKEN}/sendMessage"
    payload = {
        'chat_id': CHAT_ID,
        'text': message
    }
    try:
        requests.post(url, data=payload)
    except Exception as e:
        print("Error enviando a Telegram:", e)

while True:
    loc = get_location()
    send_telegram(loc)
    time.sleep(3)

send_location

Operación: dejarlo ejecutando siempre

Una opción es iniciarlo junto con el sistema (Linux):

Crear un archivo .desktop en ~/.config/autostart/ para iniciar el script al prender el subsistema Termux (o el móvil).

O también se puede enviar una sola vez desde el script y en su lugar usar crontab -e con la opción & para que ejecute en segundo plano, i.e., que no se quede esperando en la terminal hasta el retorno del script:

@reboot /usr/bin/python3 /ruta/a/script.py &

Nota

Otras opciones serían usar tmux, nohup o systemd para asegurar que sigue corriendo sin cerrar el terminal.

Cabe decir que la geolocalización IP no es muy precisa (aprox. 5 km máximo de exactitud, con alta precisión, de promedio), pero para precisión GPS real se necesitaría acceso a hardware o apps móviles. Para la localización, también se podría usar termux-location.

Funcionamiento de Telegram

Referencias

TODO