Disponible en: English · Deutsch · Español
Shell Sentinel es un administrador de sistemas asistido por IA en terminal que mantiene una sesión SSH/SFTP persistente contra un servidor remoto y traduce instrucciones en lenguaje natural en acciones seguras y auditables.
Repositorio público: https://github.com/ibitato/ShellSentinel
Sitio oficial: https://www.shellsentinel.net.
- Python 3.10 o superior
- Entorno virtual local (recomendado
.venv)
- Crear el entorno virtual:
python3 -m venv .venv source .venv/bin/activate - Instalar dependencias de desarrollo y de ejecución:
make install
- Ejecutar las comprobaciones básicas:
make format make lint
- Lanza la interfaz TUI con:
make run- La consola se divide en dos zonas principales: historial de salida (superior) y área de entrada (inferior), rematada con un footer que muestra en todo momento el estado de la conexión SSH y el proveedor/modelo LLM activo.
- Envía las instrucciones usando el atajo configurado (por defecto
Ctrl+S). - Comandos disponibles (puedes usar los alias en inglés, español o alemán):
/connect <host> <user> <password|key_path> [puerto](/conectar,/verbinden) abre una sesión SSH y SFTP persistente (el puerto es opcional, por defecto 22)./disconnect(/desconectar,/trennen) cierra la conexión activa si existe./help(/ayuda,/hilfe) muestra un resumen en Markdown de los comandos disponibles./status(/estado) muestra el estado actual del agente y la conexión./exit(/salir,/beenden,/quit) abre un diálogo de confirmación para cerrar la aplicación.
- El sistema mostrará las respuestas en formato Markdown y en un esquema de color retro naranja/verde.
- Se recomienda un terminal
xtermoxterm-256colorpara aprovechar la paleta.
- Todos los parámetros visuales y de interacción (colores, atajos, mensajes, límites de historial) se gestionan desde
conf/app_config.json. - Puedes sobreescribir la ruta mediante las variables de entorno
SMART_AI_SYS_ADMIN_CONFIG_FILE(ruta directa al fichero) oSMART_AI_SYS_ADMIN_CONFIG_DIR(directorio que contieneapp_config.json). - Evita modificar valores en código fuente; ajusta el fichero de configuración y reinicia la app para aplicar los cambios.
- Nuevos parámetros destacados en
conf/app_config.json:ui.connection_panel: estilos del panel inferior que muestra el estado de la conexión y el resumen del proveedor.
logging: nivel (por defectoDEBUG), directorio (logs/), nombre de fichero y política de rotación (3 días) del sistema de logging basado enTimedRotatingFileHandler.- Los loggers de dependencias verbosas (
markdown_it,botocore.parsers,paramiko.transport, etc.) se reducen automáticamente aINFOcuando se usaDEBUGpara evitar ruido excesivo.log_to_console: cuando estrue, duplica los registros en stdout (por defectofalsepara no interferir con la TUI).
- Los loggers de dependencias verbosas (
- La interfaz soporta inglés (por defecto), alemán y español. El idioma se detecta a partir de la variable
SMART_AI_SYS_ADMIN_LOCALEo, en su defecto, del locale del sistema. - Los textos traducibles viven en
conf/locales/<idioma>/strings.json. Para añadir un nuevo idioma, crea el directorio correspondiente, copia uno de los ficheros existentes como plantilla y traduce las claves respetando los marcadores{placeholder}. - Puedes forzar el idioma ejecutando, por ejemplo:
export SMART_AI_SYS_ADMIN_LOCALE=de make run - El fichero
conf/app_config.jsoncontiene referencias{{clave.de.traduccion}}que se resuelven en tiempo de carga usando el locale activo; no elimines las llaves dobles al personalizar valores.
- Documentación práctica paso a paso disponible en
docs/user_guide_es.md,docs/user_guide_en.mdydocs/user_guide_de.md. Mantén las tres versiones sincronizadas al introducir nuevas funcionalidades.
- Copia
conf/agent.conf.exampleaconf/agent.confy ajusta el bloqueproviderpara elegir entre Amazon Bedrock, OpenAI, LM Studio, Cerebras u Ollama/local. - Si optas por LM Studio, arranca el servidor local con
lms server starty revisaproviders.lmstudio(base_url,model_id,api_key_env/api_key,client_args) para que coincidan con tu instalación. - Para Cerebras, exporta
CEREBRAS_API_KEY(o defineapi_key_env) y personalizaproviders.cerebras(model_id,params,client_args.timeout, etc.); el proveedor usa el SDK oficial con streaming SSE. - Cada proveedor cuenta con su propio
system_prompt, ubicado ensystem_prompts/. Puedes personalizar esos ficheros o apuntar a otros paths. - Copia el fichero de ejemplo y ajusta las credenciales vía variables de entorno (por ejemplo
export OPENAI_API_KEY="..."). El archivo no almacena claves en texto plano. - Los modelos OpenAI y Bedrock admiten respuestas largas; por defecto
conf/agent.conf.examplefijamax_completion_tokens(OpenAI) en 32 768 ymax_tokens(Bedrock) en 8 192. Ajusta estos límites según las cuotas de tu cuenta. - Las credenciales se obtienen de tu entorno (
AWS_*,OPENAI_API_KEY, etc.). También puedes redefinir la ubicación del fichero conSMART_AI_SYS_ADMIN_AGENT_CONFIG_FILEo reutilizarSMART_AI_SYS_ADMIN_CONFIG_DIR. - La sección
toolspermite habilitar herramientas Strands Agents Tools y la tool personalizadaremote_ssh_command, que reutiliza la sesión SSH abierta por la TUI (el parámetrotimeout_secondses opcional). remote_ssh_commandemplea por defecto un timeout de 900 segundos (15 minutos) definido enconf/agent.conf. Si el comando puede tardar más, indícalo en tu instrucción para que el agente añadatimeout_secondscon el valor deseado.- Para evitar respuestas inmanejables,
remote_command.max_output_charslimita el número de caracteres que se entregan al agente. Aumenta o reduce este valor según la política de tu entorno (por ejemplo, más alto para auditorías, más bajo para sesiones compartidas). - Si necesitas servidores externos Model Context Protocol (MCP), declara cada transporte (
stdio,sse,streamable_http) en la secciónmcp. El agente mantendrá las conexiones activas durante la sesión y añadirá sus herramientas automáticamente.- Ejemplo: el transporte
firecrawl-stdiolanzanpx -y firecrawl-mcp. Configuraenv_passthroughpara que el agente heredeFIRECRAWL_API_KEY(u otras variables sensibles) y, antes de iniciar la TUI, expórtalas en tu entorno (export FIRECRAWL_API_KEY="...").
- Ejemplo: el transporte
- Al iniciar la aplicación verás una pantalla de bienvenida retro en tonos naranja; se cierra sola tras 5 s o cuando presionas cualquier tecla.
- Las sesiones
/conectarmantienen vivo el canal SSH y SFTP en paralelo. El agente dispone deremote_sftp_transfer(action, local_path, remote_path, overwrite=False)para subir (upload/put) o descargar (download/get) archivos reutilizando esa conexión. Puedes renombrar la herramienta desdetools.sftp_transfer.namesi necesitas otro identificador. - Puedes administrar servidores GNU/Linux o Windows siempre que expongan SSH/SFTP. Ajusta los comandos remotos a la plataforma (por ejemplo, usa PowerShell/cmd para Windows) y valida rutas antes de transferir o modificar contenidos.
- Los plugins se cargan automáticamente desde el directorio
plugins/(puedes sobrescribirlo medianteSMART_AI_SYS_ADMIN_PLUGINS_DIR, que admite varios paths separados por:). Cada archivo.pydebe definir una funciónregister(registry). - Dentro de
register(...)utilizaPluginSlashCommandpara declarar comandos slash adicionales. Elhandlerrecibe los argumentos del usuario y debe devolver un texto (Markdown) que se mostrará en el chat. Cualquier logging que hagas desde el plugin se integra en el sistema habitual de la TUI. - Los plugins pueden aportar sus propias traducciones llamando a
registry.register_translations(locale, payload). Las clavesdescription,usageyhelpque referencies enPluginSlashCommanddeben existir en esas traducciones para respetar la localización. - Opcionalmente puedes aportar una función
suggestion(command, args)para personalizar el autocompletado del input. Si no la defines, se mostrará la cadena asociada ausage_key. - Los comandos registrados aparecen automáticamente en
/help, heredan el historial del input y comparten las mismas reglas de output que los comandos nativos (/connect,/disconnect, etc.).
# plugins/credenciales.py
from smart_ai_sys_admin.plugins import PluginRegistry, PluginSlashCommand
def _buscar_credenciales(args: list[str]) -> str:
if not args:
return "⚠️ Debes indicar el nombre del servidor."
servidor = args[0]
# Aquí podrías invocar a tu API corporativa
return f"Credenciales de `{servidor}`: usuario demo / password 1234"
def register(registry: PluginRegistry) -> None:
registry.register_translations(
"es",
{
"plugins": {
"credentials": {
"description": "Obtiene credenciales desde la API interna",
"usage": "Uso: `{command} <servidor>`",
"help": "`{command}` consulta la API corporativa y muestra las credenciales en el chat.",
}
}
},
)
registry.register_translations(
"en",
{
"plugins": {
"credentials": {
"description": "Fetch credentials from the internal API",
"usage": "Usage: `{command} <server>`",
"help": "`{command}` queries the corporate API and prints credentials in the chat.",
}
}
},
)
registry.register_command(
PluginSlashCommand(
name="/credentials",
aliases=("/credenciales",),
handler=_buscar_credenciales,
description_key="plugins.credentials.description",
usage_key="plugins.credentials.usage",
help_key="plugins.credentials.help",
)
)requirements.txt: dependencias de ejecución (Textual, Strands Agents y herramientas comunitarias).requirements-dev.txt: dependencias de desarrollo (-r requirements.txt, linting y tests).src/smart_ai_sys_admin/: código fuente principal de la aplicación (TUI y utilidades).tests/: espacio reservado para pruebas automatizadas.Makefile: tareas para automatizar instalación, formateo, lint y ejecución.AGENTS.md: guía para agentes IA colaborando en este repositorio.
- Shell Sentinel se distribuye como software de código disponible (source-available): el repositorio en GitHub permite auditar el código pero no autoriza la modificación ni la redistribución de versiones alteradas.
- Uso gratuito únicamente para fines personales, educativos o de evaluación interna sin ánimo de lucro. Cualquier uso comercial requiere una licencia negociada con el mantenedor.
- Queda prohibida la modificación, adaptación o creación de trabajos derivados del Software sin autorización previa y por escrito.
- Consulta el archivo
LICENSE(Shell Sentinel Source-Available License 1.0) para detalles completos, definiciones y limitaciones.
Para licencias comerciales, permisos especiales o soporte extendido, abre un issue en GitHub o contacta al mantenedor.
