Acceso SSH vía proxy
Cómo ejecuta comandos un agente LLM en máquinas remotas de forma segura mediante una API de proxy SSH en lugar de claves SSH crudas.
Acceso SSH vía proxy
Los agentes necesitan ejecutar comandos en máquinas remotas — desplegar un contenedor, leer un log, arreglar una configuración. Entregar claves privadas SSH crudas a un LLM es una mala idea: las claves acaban en ventanas de contexto, logs y transcripciones. Un proxy SSH lo resuelve: él posee las credenciales, el agente solo habla HTTP.
El modelo
LLM ──HTTPS──► Proxy SSH ──SSH──► máquinas objetivo
(posee las claves,
log de auditoría,
límites de tasa)El proxy expone sesiones persistentes con una superficie REST sencilla:
| Endpoint | Propósito |
|---|---|
POST /connect?target=vps1 |
abrir una sesión → session_id |
POST /<sid>/exec {command, timeout} |
ejecutar un comando (async) → exec_id |
GET /<sid>/exec/<exec_id> |
consultar la salida |
| Endpoints SFTP | subida/descarga de archivos, ls, mkdir, rm |
La autenticación es un token Bearer — el mismo patrón que todas las demás APIs que usas.
El patrón de ejecución
# 1. conecta una vez, reutiliza la sesión para toda la tarea
SID=$(curl -s -H "Authorization: Bearer $KEY" \
"https://ssh-proxy.example/connect?target=vps1" | jq -r .session_id)
# 2. ejecuta un comando
EID=$(curl -s -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \
-X POST "https://ssh-proxy.example/$SID/exec" \
-d '{"command": "docker ps --format \"{{.Names}}\"", "timeout": 120}' | jq -r .exec_id)
# 3. consulta el resultado
curl -s -H "Authorization: Bearer $KEY" "https://ssh-proxy.example/$SID/exec/$EID"Reglas de uso
- Reutiliza sesiones. Conectar por comando desperdicia recursos y dispara límites de tasa. Guarda el
session_id(p. ej./tmp/vps1_sid) y hazle heartbeat antes de reutilizarlo. - Nombra los targets, no los descubras. Los targets están pre-registrados (
vps1,pi, …). El proxy es la única fuente de verdad — nunca hardcodees IPs en código de agente. - Prefiere SFTP a cat/heredoc de shell para archivos. Escapar datos binarios a través de
execcorrompe los payloads. Usa los endpoints dedicados de subida/descarga. - Cita tus comandos. El cuerpo JSON se parsea dos veces (HTTP + shell). Envuelve los comandos remotos en comillas simples y mantenlos en una sola línea.
- Asume auditoría. Cada exec queda en el log de auditoría del proxy — compórtate como si el humano leyera todo (puede hacerlo).
Cuándo NO usar exec
- Leer estado estructurado que tiene una API (Docker, bases de datos, la Mind API de Synapse) — siempre prefiere la API a parsear salida de CLI.
- Procesos interactivos de larga duración.
execes fire-and-forget con timeout; usanohup+ un archivo de estado en el objetivo. - Cualquier cosa destructiva sin instrucción explícita. El proxy te da el poder — el humano te da el permiso.
Recuperación de errores
| Síntoma | Solución |
|---|---|
| 401 al conectar | token expirado — relee de memoria/settings, nunca de una transcripción |
| sesión 404 | sesión expirada (tope 24h) — reconecta |
| timeout de exec | sube timeout o divide el comando; revisa la carga del objetivo |
| contenido de archivo corrupto | usaste exec en vez de SFTP — cambia a los endpoints SFTP |