Acesso SSH via proxy
Como um agente LLM executa comandos em máquinas remotas com segurança por meio de uma API de proxy SSH em vez de chaves SSH cruas.
Acesso SSH via proxy
Agentes precisam executar comandos em máquinas remotas — deployar um contêiner, ler um log, corrigir uma config. Entregar chaves privadas SSH cruas a um LLM é uma má ideia: as chaves acabam em janelas de contexto, logs e transcrições. Um proxy SSH resolve isso: ele detém as credenciais, o agente só fala HTTP.
O modelo
LLM ──HTTPS──► Proxy SSH ──SSH──► máquinas alvo
(detém as chaves,
log de auditoria,
limites de taxa)O proxy expõe sessões persistentes com uma superfície REST simples:
| Endpoint | Propósito |
|---|---|
POST /connect?target=vps1 |
abrir uma sessão → session_id |
POST /<sid>/exec {command, timeout} |
executar um comando (async) → exec_id |
GET /<sid>/exec/<exec_id> |
consultar a saída |
| Endpoints SFTP | upload/download de arquivos, ls, mkdir, rm |
A autenticação é um token Bearer — o mesmo padrão de todas as outras APIs que você usa.
O padrão de execução
# 1. conecte uma vez, reutilize a sessão para toda a task
SID=$(curl -s -H "Authorization: Bearer $KEY" \
"https://ssh-proxy.example/connect?target=vps1" | jq -r .session_id)
# 2. execute um 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. consulte o resultado
curl -s -H "Authorization: Bearer $KEY" "https://ssh-proxy.example/$SID/exec/$EID"Regras de engajamento
- Reutilize sessões. Conectar por comando desperdiça recursos e dispara limites de taxa. Guarde o
session_id(ex./tmp/vps1_sid) e faça heartbeat antes de reutilizar. - Nomeie os targets, não os descubra. Targets são pré-registrados (
vps1,pi, …). O proxy é a fonte única de verdade — nunca hardcode endereços IP no código do agente. - Prefira SFTP a cat/heredoc de shell para arquivos. Escapar dados binários via
execcorrompe payloads. Use os endpoints dedicados de upload/download. - Quote seus comandos. O corpo JSON é parseado duas vezes (HTTP + shell). Envolva comandos remotos em aspas simples e mantenha-os em uma linha.
- Assuma a auditoria. Cada exec vai para o log de auditoria do proxy — aja como se o humano lesse tudo (ele pode).
Quando NÃO usar exec
- Ler estado estruturado que tem uma API (Docker, bancos de dados, a Mind API da Synapse) — sempre prefira a API ao parsing de saída de CLI.
- Processos interativos de longa duração.
execé fire-and-forget com timeout; usenohup+ um arquivo de status no alvo. - Qualquer coisa destrutiva sem instrução explícita. O proxy lhe dá o poder — o humano lhe dá a permissão.
Recuperação de erros
| Sintoma | Solução |
|---|---|
| 401 ao conectar | token expirado — releia-o de memory/settings, nunca de uma transcrição |
| sessão 404 | sessão expirada (limite 24h) — reconecte |
| timeout de exec | aumente timeout ou divida o comando; verifique a carga do alvo |
| conteúdo de arquivo corrompido | você usou exec em vez de SFTP — mude para os endpoints SFTP |