Ollama – Chatbot IA Local en 5 Minutos

¿cuándo usar tgpt y cuándo usar Ollama?

En el ecosistema actual de IA aplicada a terminal y ciberseguridad aparecen dos enfoques muy distintos:

  • tgpt → un cliente que conecta con modelos en la nube
  • Ollama → un motor local que ejecuta modelos en tu propio sistema

Ambos usan IA. Pero resuelven problemas distintos.


1. Qué es tgpt (en una frase honesta)

tgpt es un puente entre tu terminal y modelos en la nube.

  • No ejecuta IA local
  • Envía tus prompts a un servicio externo
  • Devuelve la respuesta en texto, integrada en la terminal

Mentalmente:

“Un ChatGPT sin navegador, pegado a la shell.”


2. Qué es Ollama (en una frase honesta)

Ollama es una plataforma para ejecutar modelos de IA localmente.

  • Los modelos están en tu disco
  • El razonamiento ocurre en tu máquina
  • No depende de Internet
  • Tú controlas datos, logs y flujos

Mentalmente:

“Un motor de IA como si fuera un servicio más del sistema.”


3. Comparativa

AspectotgptOllama
TipoClienteMotor local
Dónde se ejecuta la IANubeTu servidor
Requiere InternetNo
PrivacidadBaja–mediaAlta
Consumo de recursos localesMuy bajoMedio–alto
Facilidad de usoMuy altaMedia
Control del sistemaNuloTotal
Ideal paraConsultas rápidasIntegración técnica
Uso en producciónNo
Valor educativo en ciberConceptualArquitectónico

4. Cuándo es mejor usar tgpt

Usa tgpt cuando:

  • Quieres rapidez
  • Estás aprendiendo conceptos
  • Necesitas ayuda puntual con:
    • comandos
    • sintaxis
    • explicaciones
  • No te importa que el contenido viaje a la nube
  • Estás en un equipo con pocos recursos

Ejemplos reales:

  • “Explícame este error de Bash”
  • “¿Qué hace este comando?”
  • “Dame una idea rápida”

tgpt es ideal como calculadora mental avanzada.


5. Cuándo es mejor usar Ollama

Usa Ollama cuando:

  • Trabajas con:
    • logs reales
    • datos sensibles
    • salidas de herramientas de ciber
  • Quieres offline
  • Necesitas:
    • automatización
    • integración con scripts
    • auditoría y control
  • Estás enseñando arquitectura y seguridad
  • No quieres depender de terceros

Ejemplos reales:

  • Analizar auth.log
  • Resumir resultados de nmap
  • Asistir en scripting
  • Crear un copiloto de terminal seguro
  • Laboratorios en red aislada

Requisitos mínimos Ollama (realistas)

Antes de tocar nada, conviene saber qué espera Ollama del hierro:

  • Ubuntu Server 24.04 LTS (OK)
  • Arquitectura x86_64
  • CPU decente (funciona sin GPU, pero paciencia)
  • RAM recomendada:
    • 8 GB → modelos pequeños (phi, tinyllama)
    • 16 GB o más → llama3, mistral, etc.
  • Acceso a internet

Comprueba lo básico:

lsb_release -a
uname -m
free -h



Instalación

Ollama se instala con un único script oficial. No snaps, no flatpaks, no dramas.





curl -fsSL https://ollama.com/install.sh | sh

Qué hace este script (para tu tranquilidad mental):

  • Descarga el binario de Ollama
  • Lo instala en /usr/bin/ollama
  • Crea un servicio systemd
  • Arranca Ollama automáticamente

Comprobar que el servicio está vivo

En un server, systemd manda:





systemctl status ollama

Deberías ver algo como:

  • Active: active (running)
  • Escuchando en 127.0.0.1:11434

Si no está activo:





sudo systemctl enable --now ollama

Probar Ollama desde terminal

Aquí viene la parte bonita: usar IA sin navegador.

Prueba con un modelo ligero primero:





ollama run phi

O uno más conocido:





ollama run llama3

La primera vez:

  • Descarga el modelo
  • Puede tardar (no está roto, está pensando)

Cuando veas un prompt tipo:





>>> 

Ya tienes un LLM local funcionando. Sin nube. Sin vender tu alma.


Ver modelos instalados





ollama list

Descargar modelos sin ejecutarlos:





ollama pull mistral
ollama pull llama3:8b

Uso como servicio (API local)

Ollama levanta una API REST en local:

  • URL: http://localhost:11434

Prueba rápida:





curl http://localhost:11434/api/tags

Esto es oro puro para:

  • Scripts Python
  • Herramientas OSINT
  • Automatización en ciber
  • Integrarlo con apps web internas

Permitir acceso desde otra máquina (opcional)

⚠️ Ojo sysadmin: por defecto SOLO escucha en localhost.

Si quieres que otros equipos accedan (por ejemplo, alumnos o un frontend):

Edita el servicio:





sudo systemctl edit ollama

Añade:





[Service]
Environment="OLLAMA_HOST=0.0.0.0:11434"

Luego:





sudo systemctl daemon-reload
sudo systemctl restart ollama

Y abre firewall si procede:





sudo ufw allow 11434/tcp

Dónde guarda Ollama los modelos

Importante para servidores con discos separados:

  • Por defecto:
    /usr/share/ollama/.ollama

Puedes moverlo usando:





export OLLAMA_MODELS=/ruta/grande/ollama-models

En server con /data o /mnt, esto es muy recomendable.


Desinstalar

sudo systemctl stop ollama
sudo rm /usr/bin/ollama
sudo rm /etc/systemd/system/ollama.service
sudo rm -rf /usr/share/ollama

Modelos Ollama – Tamaño en disco y recursos

ModeloParámetros (B)RAM recomendadaTamaño en disco aprox.VelocidadUso típico
tinyllama1.1B2–4 GB~0.7 GBMuy altaPruebas rápidas
qwen2.5:0.5b0.5B2–3 GB~0.4 GBMuy altaComandos simples
phi2.7B4–6 GB~1.6 GBMuy altaTerminal, docencia
orca-mini3B6–8 GB~2.0 GBAltaExplicaciones
mistral7B8 GB~4.1 GBAltaUso técnico
qwen2.5:7b7B8 GB~4.0 GBAltaCódigo
llama3:8b8B8–10 GB~4.7 GBAltaCiber, logs
codellama7B8–10 GB~3.8–4.2 GBMediaProgramación
deepseek-coder6–7B8–12 GB~3.5–4.0 GBMediaCódigo
nous-hermes7–13B8–16 GB~4.5–8.0 GBMediaRazonamiento
mixtral:8x7bMoE16–32 GB~26–28 GBMediaAnálisis complejo
llama3:70b70B64+ GB~40–45 GBBajaServidores grandes
gemma:7b7B8 GB~4.0 GBAltaLenguaje
yi:6b6B8 GB~3.5 GBMediaMultilenguaje
yi:34b34B32+ GB~20–22 GBBajaAnálisis profundo

Comprobar que Ollama está instalado y activo

En tu Ubuntu Server 24:





ollama --version
systemctl status ollama

Si ves versión y estado active (running), seguimos.


Instalar (descargar) el modelo codellama

Instalar un modelo en Ollama es simplemente hacer un pull:





ollama pull codellama

Qué ocurre aquí:

  • Se descarga el modelo
  • Se guarda en disco
  • No se ejecuta todavía
  • Puede tardar (son ~4 GB)

Paciencia de sysadmin.


Verificar que el modelo está instalado





ollama list

Deberías ver algo así:





NAME           ID            SIZE     MODIFIED
codellama      xxxx          ~4.0 GB  …

Usar el modelo

Modo interactivo





ollama run codellama

Te aparecerá:





>>>

Ejemplo:





>>> escribe un script bash que liste usuarios conectados

Responderá orientado a código, no a charla.


Uso directo (una sola petición)





ollama run codellama "escribe un script en bash para hacer backup de /etc"

Perfecto para redirecciones:





ollama run codellama "crea un script de backup de /etc" > backup.sh
chmod +x backup.sh

Elegir tamaño de codellama (muy importante)

codellama tiene variantes. Puedes pedir una concreta:

VarianteRAM recomendadaDisco aprox.
codellama:7b8–10 GB~3.8 GB
codellama:13b14–18 GB~7–8 GB
codellama:34b32+ GB~20 GB

Ejemplo explícito:





ollama pull codellama:7b

Si no indicas nada, Ollama suele traer la variante por defecto (normalmente 7B).

Uso de Ollama en ejecución del sistema

Ollama puede:

  • Generar comandos
  • Generar scripts
  • Generar código
  • Analizar salidas de comandos
  • Decidir qué comando habría que ejecutar

Pero alguien tiene que ejecutarlos. Ese alguien eres tú… o un wrapper.

El esquema mental sano es este:





[ Usuario ] → [ Ollama (razona) ] → [ Script intermedio ] → [ Sistema ]

Nunca:





IA → root → caos

Ollama puede generar contenido:









ollama run llama3 "Escribe un README.md sobre este proyecto" > README.md

Aquí sí crea archivos, pero porque la shell redirige la salida.
Ollama sigue sin tocar el sistema.


El peligro real

El riesgo no es Ollama.
El riesgo es esto:

#Peligro
eval "$(ollama run llama3 'dame un comando para limpiar el sistema')"

Ejecutar comandos con control (wrapper en Bash)

#!/bin/bash
if [ $# -gt 0 ]; then
  pregunta$1
else
    read -p "Pregunta a la IA: " pregunta
fi



respuesta=$(ollama run phi "$pregunta. Devuelve SOLO un comando seguro.")

echo "La IA propone ejecutar:"
echo "$respuesta"

read -p "¿Ejecutar? (s/n): " ok
if [[ "$ok" == "s" ]]; then
    eval "$respuesta"
fi

Qué ocurre aquí:

  • Ollama propone
  • El humano autoriza
  • El sistema ejecuta

En Linux, un comando es solo:

  • un archivo ejecutable
  • ubicado en un directorio que esté en $PATH

Si eso se cumple → se ejecuta desde cualquier sitio.

Compruébalo:





echo $PATH

Verás cosas como:

  • /usr/bin
  • /usr/local/bin
  • /bin

Ahí es donde viven los comandos “del sistema”.


Opción recomendada: /usr/local/bin (limpio y correcto)

Supongamos que tu script se llama ollama-shell.sh.

Mover el script





sudo mv ollama-shell.sh /usr/local/bin/ollama-shell

Nota:

  • Quitamos .sh → parece un comando real
  • Linux no necesita extensión

Dar permisos de ejecución





sudo chmod +x /usr/local/bin/ollama-shell

Probar desde cualquier sitio





cd /tmp
ollama-shell

Script Wraper avanzado

Aquí tienes un script con muchas mas opciones:

#!/usr/bin/env bash
set -euo pipefail

# -----------------------------
# Ollama Shell Assistant (Seguro)
# - Pregunta a un modelo Ollama local
# - Fuerza español usando modelo "llama3-es"
# - Devuelve un único comando
# - Valida contra lista blanca
# - Pide confirmación antes de ejecutar
# - Registra todo en /var/log/ollama-shell.log
# -----------------------------

MODEL="${MODEL:-llama3-es}"
LOG_FILE="${LOG_FILE:-/var/log/ollama-shell.log}"

MODE="${MODE:-ask}"  # ask | exec
TIMEOUT_SECS="${TIMEOUT_SECS:-120}"

# Lista blanca básica de comandos permitidos (ajústala a tu contexto)
ALLOW_CMDS=(
  "ls" "ll" "pwd" "cd"
  "cat" "less" "head" "tail"
  "grep" "egrep" "fgrep" "awk" "sed" "cut" "sort" "uniq" "wc"
  "find" "locate" "which" "whereis"
  "ip" "ss" "netstat" "ping" "traceroute" "dig" "nslookup" "curl" "wget"
  "ps" "top" "htop" "free" "df" "du" "uptime" "uname" "lsblk"
  "systemctl" "journalctl"
  "who" "w" "id" "groups" "last" "lastb"
  "tar" "gzip" "gunzip" "zip" "unzip"
  "apt" "apt-get" "dpkg" "snap"
  "nmap"
)

print_help() {
  cat <<'EOF'
Uso:
  ollama-shell [-e] [-m MODELO] "pregunta..."
  ollama-shell --suggest "pregunta..."
  ollama-shell --exec "pregunta..."
  ollama-shell --help

Opciones:
  -m, --model     Modelo Ollama a usar (por defecto: llama3-es)
  -e, --exec      Permite ejecutar (con confirmación humana)
  --suggest       Solo sugiere (no ejecuta)
  --log FILE      Archivo de log (por defecto: /var/log/ollama-shell.log)

Variables:
  MODEL=llama3-es
  MODE=ask|exec
  LOG_FILE=/var/log/ollama-shell.log
  TIMEOUT_SECS=120

Notas:
- El modelo debe devolver SOLO UN comando.
- Se valida el comando contra una lista blanca básica.
EOF
}

die() {
  echo "ERROR: $*" >&2
  exit 1
}

ensure_ollama() {
  command -v ollama >/dev/null 2>&1 || die "No encuentro 'ollama' en PATH. ¿Está instalado?"
  systemctl is-active --quiet ollama 2>/dev/null || true
}

ensure_log_writable() {
  # Intentar escribir en LOG_FILE; si no se puede, degradar a ~/.ollama-shell.log
  if ! (touch "$LOG_FILE" 2>/dev/null); then
    LOG_FILE="$HOME/.ollama-shell.log"
    touch "$LOG_FILE" || die "No puedo escribir logs ni en /var/log ni en HOME."
  fi
}

log_line() {
  local msg="$1"
  printf '%s | user=%s | cwd=%s | %s\n' "$(date '+%F %T')" "${USER:-unknown}" "$(pwd)" "$msg" >> "$LOG_FILE"
}

trim() {
  sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//'
}

first_token() {
  # Devuelve el primer token (comando base), ignorando sudo si aparece
  local s="$1"
  s="$(echo "$s" | trim)"
  if [[ "$s" == sudo\ * ]]; then
    echo "$s" | awk '{print $2}'
  else
    echo "$s" | awk '{print $1}'
  fi
}

is_allowed_cmd() {
  local cmd="$1"
  for a in "${ALLOW_CMDS[@]}"; do
    [[ "$cmd" == "$a" ]] && return 0
  done
  return 1
}

looks_dangerous() {
  # Filtros anti-destrucción básicos (no exhaustivos)
  local s="$1"
  s="$(echo "$s" | trim)"
  [[ -z "$s" ]] && return 0

  # Cosas típicas peligrosas
  if echo "$s" | grep -Eqi 'rm\s+-rf\s+/' ; then return 0; fi
  if echo "$s" | grep -Eqi 'mkfs|dd\s+if=|:\(\)\s*\{\s*:\|\s*:\s*;\s*\}\s*;|shutdown|reboot|poweroff' ; then return 0; fi
  if echo "$s" | grep -Eqi '>\s*/etc/|>\s*/bin/|>\s*/usr/bin/|chown\s+root|chmod\s+4[0-7]{3}|chmod\s+u\+s' ; then return 0; fi

  # Inyección obvia
  if echo "$s" | grep -Eqi '\$\(|`' ; then return 0; fi

  return 1
}

ask_ollama_for_command() {
  local question="$1"

  local prompt
  prompt=$(
    cat <<EOF
Eres un asistente técnico experto en Linux y ciberseguridad.
Respondes SIEMPRE en español.
Tu tarea: proponer EXACTAMENTE UN comando de terminal (una sola línea) para ayudar con la petición del usuario.
REGLAS:
- Devuelve SOLO el comando. Sin explicaciones. Sin comillas. Sin markdown.
- El comando debe ser lo más seguro posible (preferir lectura/consulta a escritura).
- Evita acciones destructivas. No uses rm, mkfs, dd, ni cambios de permisos peligrosos.
Petición del usuario:
$question
EOF
  )

  # Timeout para evitar bloqueos largos
  # Nota: 'timeout' suele estar en coreutils
  if command -v timeout >/dev/null 2>&1; then
    timeout "$TIMEOUT_SECS" ollama run "$MODEL" "$prompt" 2>/dev/null | head -n 1 | trim
  else
    ollama run "$MODEL" "$prompt" 2>/dev/null | head -n 1 | trim
  fi
}

confirm() {
  local msg="$1"
  read -r -p "$msg (s/n): " ans
  [[ "${ans,,}" == "s" ]]
}

main() {
  local question=""
  local explicit_mode=""
  local explicit_model=""
  local explicit_log=""

  while [[ $# -gt 0 ]]; do
    case "$1" in
      -m|--model) explicit_model="$2"; shift 2 ;;
      -e|--exec) explicit_mode="exec"; shift ;;
      --suggest) explicit_mode="ask"; shift ;;
      --log) explicit_log="$2"; shift 2 ;;
      -h|--help) print_help; exit 0 ;;
      *)
        # Resto como pregunta (permitimos comillas)
        question="$*"
        break
        ;;
    esac
  done

  [[ -n "$explicit_model" ]] && MODEL="$explicit_model"
  [[ -n "$explicit_mode" ]] && MODE="$explicit_mode"
  [[ -n "$explicit_log" ]] && LOG_FILE="$explicit_log"

  [[ -z "$question" ]] && die "Falta la pregunta. Usa --help para ver ejemplos."

  ensure_ollama
  ensure_log_writable

  log_line "question=$(printf '%q' "$question") model=$MODEL mode=$MODE"

  local cmd
  cmd="$(ask_ollama_for_command "$question")"

  log_line "raw_cmd=$(printf '%q' "$cmd")"

  [[ -z "$cmd" ]] && die "El modelo no devolvió un comando."

  # Validaciones básicas
  if looks_dangerous "$cmd"; then
    log_line "blocked_reason=dangerous_pattern"
    die "Comando bloqueado por patrón peligroso: $cmd"
  fi

  local base
  base="$(first_token "$cmd")"
  if ! is_allowed_cmd "$base"; then
    log_line "blocked_reason=not_in_allowlist base=$base"
    die "Comando bloqueado (no está en la lista blanca): $base"
  fi

  echo "$cmd"

  if [[ "$MODE" == "exec" ]]; then
    if confirm "¿Ejecutar el comando anterior?"; then
      log_line "exec=YES cmd=$(printf '%q' "$cmd")"
      # Ejecuta tal cual (sin eval). Bash interpretará la línea como comando.
      bash -lc "$cmd"
    else
      log_line "exec=NO"
      echo "Cancelado."
    fi
  else
    echo "Modo sugerencia (no ejecuto nada). Usa --exec para permitir ejecución con confirmación."
  fi
}

main "$@"

Instalación global (para todo el sistema)

  1. Mueve el script a /usr/local/bin y dale permisos:




sudo mv ollama-shell /usr/local/bin/ollama-shell
sudo chmod +x /usr/local/bin/ollama-shell
  1. Prueba:




ollama-shell "muestra los puertos en escucha"
  1. Para permitir ejecución (con confirmación):




ollama-shell --exec "muestra los últimos intentos de login fallidos"

Forma más simple: usar el modelo por defecto

En el script que te pasé, al principio tienes:





MODEL="${MODEL:-llama3-es}"

Eso significa:

  • Si no indicas nada, usa llama3-es
  • Es el comportamiento por defecto

Ejemplo:





ollama-shell "lista los usuarios conectados"

Usa automáticamente llama3-es.


Indicar el modelo en la llamada (recomendado)

El script soporta el parámetro -m o --model.

Ejemplo:





ollama-shell -m codellama-es "crea un script bash para hacer backup de /etc"

Aquí:

  • No tocas el script
  • Cambias el modelo solo para esa ejecución
  • Ideal para comparar modelos en clase

Forzar el modelo con variable de entorno

Esto es muy Unix y muy elegante.

Para una sola ejecución





MODEL=codellama-es ollama-shell "analiza este script"

Para toda la sesión





export MODEL=codellama-es
ollama-shell "genera un Makefile sencillo"

Hasta que cierres la terminal, siempre usará ese modelo.


Cambiar el modelo por defecto en el script

Si quieres que siempre use codellama-es, edita el script:





nano /usr/local/bin/ollama-shell

Busca:





MODEL="${MODEL:-llama3-es}"

Y cambia a:





MODEL="${MODEL:-codellama-es}"

A partir de ahí, ese será el modelo base.


Ver qué modelo se está usando (opcional pero didáctico)

Si quieres que el script lo muestre, añade justo antes de llamar a Ollama:





echo "Modelo en uso: $MODEL"

O loguéalo:





log_line "model_in_use=$MODEL"

Esto es muy bueno para auditoría


Ejemplos

ComandoQué ocurre
ollama-shell "ver procesos"Usa modelo por defecto
ollama-shell -m phi "ver procesos"Usa phi
MODEL=codellama-es ollama-shell "crear script"Usa codellama-es
ollama-shell --exec -m llama3-es "ver puertos"Ejecuta con llama3-es

Comandos básicos que conviene conocer





ollama run llama3:8b # Ejecutar modelo
ollama list # Modelos instalados 
ollama pull mistral # Descargar modelo 
ollama rm mistral # Borrar modelo 
ollama ps # Modelos en uso 
ollama stop llama3:8b # Detener modelo

Instalación en Mac-os

1️⃣ Descarga

https://ollama.com/download/mac

Pulsa Download for macOS


2️⃣ Instala

  • Abre el .dmg
  • Arrastra Ollama a Applications
  • Ábrelo (la primera vez macOS pedirá permiso)

📌Ollama se queda ejecutándose en segundo plano (daemon).


3️⃣ Verifica desde Terminal

Abre Terminal y ejecuta:





ollama --version

Si ves algo como:





ollama version x.x.x

✔️ Instalación correcta


Primer uso: ejecutar un modelo

Descargar y ejecutar LLaMA 3 (8B)





ollama run llama3:8b

La primera vez:

  • Descarga el modelo (varios GB)
  • Luego entras directamente en modo conversación