Ir al contenido
GitHub

Acceso remoto y MCP

borg mcp permite que un agente de IA como Claude trabaje en el borg que tienes abierto, ya sea en tu propia máquina o en un servidor al que accedes por SSH. No necesitas instalar nada aparte de borg: el propio agente inicia borg mcp (a través de SSH en el caso de un servidor), y este se conecta a la sesión de borg que se está ejecutando allí. El servidor no necesita puertos abiertos ni acceso a internet.

Pulsa F1 y luego C (o elige F9 → Remoto → Compartir este Borg como host…). Borg muestra dos comandos para pegar en un terminal de tu computadora: uno inicia Claude Code ya conectado a este borg, y el otro añade la conexión a Claude Code para todas las sesiones. Tab elige uno, y Enter lo copia al portapapeles de tu computadora a través del terminal. Esto funciona por SSH en iTerm2, Ghostty, kitty, WezTerm y Alacritty (en tmux, añade set -g set-clipboard on). Donde el terminal no lo acepta, como en muchos terminales del navegador, F3 muestra el comando solo, como texto plano, para que puedas seleccionarlo con el ratón; cualquier tecla vuelve a borg.

Por SSH, borg rellena la dirección a la que te conectaste. Si tu computadora llega al servidor con otro nombre, como un alias de SSH o a través de un host de salto, escribe ese nombre. SSH debe iniciar sesión sin pedir contraseña, con una clave o un agente SSH. borg mcp setup prod muestra la misma configuración para Claude Code y Claude Desktop desde la línea de comandos.

Una vez conectado, el agente ve lo mismo que tú: la propia pantalla como texto, tanto si estás en los paneles como en la consola, ambos paneles, los archivos resaltados y marcados, dónde se ejecuta la línea de comandos y lo que hay escrito en ella. Se refiere a los sitios como ubicaciones: una ruta absoluta o ~/… en la máquina donde se ejecuta borg, docker://web/etc/nginx dentro de un contenedor, o una ruta relativa al panel activo. Sin preguntar, puede leer carpetas y archivos (por rango de líneas, o solo las líneas que contienen cierto texto), ver los procesos más activos y los contenedores, y mostrar un archivo o una carpeta en tu otro panel. También puede listar los puertos abiertos, las conexiones y las interfaces de red con su tráfico, medido durante un segundo y acotado con las mismas palabras que el filtro de la pantalla de red (consulta Filtrar). También puede listar los elementos de inicio, con el cambio más reciente primero, con sus programas y las reglas con las que coincidieron, acotados con las mismas palabras que el filtro de esa pantalla (consulta Elementos de inicio).

Todo lo que modifica la máquina espera tu respuesta en un diálogo que muestra el cambio completo: un comando y dónde se ejecutará, un archivo nuevo o una edición en forma de diff. Desplaza los largos con las flechas, PgUp y PgDn, o la rueda del ratón, y pulsa F3 para ver el diálogo a pantalla completa. La opción No sigue seleccionada hasta que eliges Sí, y el diálogo ignora Sí durante su primer medio segundo, así que una tecla o un clic pensados para otra cosa no pueden aprobarlo. Una edición se rechaza si el archivo cambió mientras decidías. También se rechaza un comando con tabulaciones, secuencias de escape u otros caracteres de control, porque el diálogo no puede mostrarlos. El diálogo aparece encima de todo, incluidos el editor, el visor, otro diálogo y el salvapantallas, y recibe todas las teclas hasta que respondas. Lo que tapaba vuelve a aparecer después. Si el agente deja de esperar antes, el diálogo se cierra y un aviso lo indica. Con una computadora emparejada, approval_mode te pregunta una vez antes de activar Aprobar todo para esa sesión. Mientras está activo, se mantiene visible una insignia; haz clic en ella o pulsa Ctrl+Alt+A para desactivarlo al instante. También se desactiva cuando se cierra esa conexión emparejada. Las aprobaciones de emparejamiento son aparte.

Una solicitud también llega a tu propia computadora cuando un panel remoto en ella muestra la sesión en la que espera (consulta Paneles remotos). Tu borg la muestra en el mismo diálogo, con el nombre del servidor en el título, por encima de lo que estés haciendo, y envía tu respuesta de vuelta por la conexión cifrada. El servidor también mantiene abierto su propio diálogo. Cuenta la primera respuesta, venga de donde venga, y los demás diálogos se cierran con un aviso que dice dónde se respondió. Una solicitud que el agente retira se cierra en todas partes. Cuando otra computadora controla la sesión a través de un espejo, tu diálogo muestra la solicitud sin Sí ni No, y Esc la cierra solo en tu pantalla. Mientras esa sesión lo apruebe todo, tu borg muestra una insignia con el nombre del servidor; haz clic en ella o pulsa Ctrl+Alt+A para desactivar Aprobar todo allí al instante. Solo tus teclas y clics responden a estos diálogos: las herramientas del agente, incluida type, no pueden pulsar nada en ellos.

Los comandos se escriben en un shell que puedes observar, y no quedan en su historial. Los comandos para esta máquina van a la consola propia de borg, que se muestra mientras se ejecutan para que puedas responder a una petición como la de sudo; los comandos para un contenedor van al shell de ese contenedor en la vista de Docker. El shell conserva su carpeta y sus variables entre comandos.

El agente también puede escribir texto para que lo revises: un comando en el prompt, o un script en vim o nano abiertos en la consola. No se ejecuta nada: nunca se pulsa Enter, y el texto de varias líneas entra como un pegado, que los shells y los editores insertan sin ejecutarlo.

El agente también puede buscar en la memoria de un proceso igual que lo hace la búsqueda en memoria: cadenas, indicadores, texto o bytes. La memoria puede contener contraseñas, claves y mensajes privados, y todo lo que encuentra la búsqueda va al agente, así que la primera búsqueda en cada proceso espera tu aprobación en un diálogo que indica el proceso, su programa y la búsqueda. Una vez que lo apruebas, el agente puede volver a buscar en ese proceso y analizarlo hasta que borg sale. Puede pedir leer como administrador, lo que abre la petición de contraseña del propio sistema.

El agente también puede analizar con reglas YARA y comprobar la integridad del código, igual que Coincidencias de reglas en el diálogo de Ctrl-F y Y e I en el mapa de memoria (consulta Analizar archivos con reglas, Comprobación de integridad del código y Analizar la memoria con reglas). Un archivo o una carpeta de la máquina donde se ejecuta borg se analiza sin preguntar, igual que una lectura. El análisis de una carpeta lee todos los archivos que hay debajo en el mismo sistema de archivos, incluidos los ocultos. Deja sin leer los archivos de más de 64 MiB y se detiene tras 20 000 archivos, 2000 coincidencias o 45 segundos. Los archivos de los contenedores no se analizan.

Con un proceso es distinto, porque el análisis lee su memoria. El primer análisis de cada proceso espera tu aprobación en El agente remoto quiere analizar la memoria de un proceso, que indica el proceso, su programa y las comprobaciones: la de integridad, las reglas o ambas. Una aprobación cubre los análisis y las búsquedas en memoria de ese proceso hasta que borg sale, sea cual sea la que pidió primero el agente. Cada comprobación se detiene tras 45 segundos, 1 GiB de memoria o 2000 hallazgos. El agente puede pedir leer como administrador, lo que abre la petición de contraseña del propio sistema una sola vez para ambas comprobaciones.

Las reglas son las de Borg y las de tu carpeta de reglas, salvo que el agente aporte su propio texto de reglas, de hasta 64 KiB. Así puede redactar una regla a partir de lo que encontró, probarla en una carpeta o un proceso y afinarla. Ese texto se ejecuta solo, sin las reglas de Borg ni las tuyas, no puede usar include y nunca se guarda. El texto que no compila vuelve al agente con el mensaje del compilador, antes de cualquier diálogo. Para un proceso, el diálogo muestra el texto de reglas del agente debajo de las comprobaciones, para que veas qué busca.

El agente recibe cada hallazgo, del más grave al menos grave, con su gravedad, su tipo, la regla y su origen, el archivo y el desplazamiento o la dirección y la región de memoria, hasta 64 bytes de lo que coincidió como texto o en hexadecimal, y qué más podría explicarlo. Después vienen cuánto se leyó, qué no se pudo leer, si el análisis terminó y los archivos de reglas que quedaron fuera. Las pruebas llegan al agente tal como se encontraron, claves y tokens incluidos, igual que con la búsqueda en memoria.

El agente también puede capturar tráfico como lo hace R en la pantalla de red (consulta Capturar tráfico). Indica qué grabar: un puerto, una conexión, un proceso por su PID o todo el tráfico de la interfaz. Para un proceso, Borg graba la interfaz entera y resume las conversaciones de ese proceso. Una captura dura de 1 a 60 segundos, o 5 si el agente no indica la duración. Cuando el agente no indica la interfaz, Borg mide durante un segundo y elige la que elegiría el diálogo Capturar tráfico. Cada captura espera tu aprobación en un diálogo, El agente remoto quiere capturar tráfico, que muestra el tráfico, la interfaz, la duración, cuánto guardar de cada paquete y la carpeta. Mientras dura, el pie de pantalla la muestra, y al terminar un aviso dice dónde la guardó Borg: en la carpeta del panel activo o en la que indique el agente, legible solo por ti. La captura de un agente siempre se ejecuta como tú y nunca pide la contraseña de un administrador, así que sin acceso termina con No tienes permiso para capturar en y el nombre de la interfaz.

El agente recibe un resumen: los protocolos que Borg reconoció y luego cada proceso, host y conexión con sus paquetes y bytes, con los nombres de host sacados de las propias respuestas DNS de la captura y de los nombres de servidor TLS. Borg vigila los sockets mientras dura la captura, así que las conversaciones quedan asignadas a sus procesos aunque la pantalla de red esté cerrada. El resumen deja fuera lo que llevan los paquetes. Leer un archivo .pcap, .pcapng o .cap da el mismo resumen, acotado con las palabras del filtro del visor de tráfico, y el agente puede pedir un paquete por su número para obtener sus capas y sus bytes en un volcado hexadecimal. Borg recuerda los procesos de las últimas 16 capturas del agente hasta que sale. Los demás archivos muestran sus conversaciones en Proceso desconocido, salvo que sus paquetes lleven su proceso.

Mientras hay un agente conectado, ◈ Remoto aparece al principio de la barra de atajos. Haz clic en él, o elige F9 → Remoto → Registro remoto… en cualquier momento, para ver un registro de lo que ha hecho el agente: lo que ha mirado, leído, analizado, mostrado y escrito, y cada comando y cambio, aprobado o rechazado. Cada sesión guarda su registro en disco, legible solo por ti, así que puedes volver a una sesión que dejaste en marcha y ver lo que pasó en ella, incluso después de que Borg haya salido. Cuando el registro crece mucho, Borg descarta las entradas más antiguas. Antes de guardar una entrada, Borg oculta las contraseñas, los tokens y las claves que reconoce, y deja fuera la salida de los comandos. Una contraseña pasada como una palabra más no se distingue de las demás, así que Borg no puede ocultarla. Para no guardar ningún registro, desactiva Remoto: llevar un registro de lo que hace en Opciones → Complementos, lo que también borra el registro guardado.

Borg cloud permite que Claude llegue a un borg al que no tiene ruta SSH: un servidor que abres en un terminal del navegador, un contenedor o una máquina detrás de NAT. Ambos extremos se conectan hacia fuera a un relay, y el relay los une.

  1. En el borg del servidor, pulsa F1 y luego C. La primera opción es borg pair con un enlace; Enter lo copia. El enlace funciona una sola vez, durante diez minutos. Debajo está el relay: para usar otro, pega ahí su dirección y pulsa Enter para guardarla y obtener un enlace a través de él.
  2. Ejecuta el comando en un terminal de tu computadora, donde también esté instalado borg. Muestra un código de emparejamiento: seis emojis, cada uno con su nombre, como 🐱 Cat · 🦁 Lion · 🐎 Horse.
  3. El borg del servidor pregunta si quieres emparejar, y muestra el nombre de tu computadora y el código. La pregunta aparece enseguida, incluso mientras F3 muestra el comando como texto. Elige Sí si los códigos coinciden. Después, borg pair ofrece añadir el servidor a Claude Code, como claude mcp add borg-NAME -- borg mcp remote NAME. Espera tu respuesta 5 minutos; cuando se rinde o lo detienes, la pregunta se cierra y el enlace deja de funcionar.

El código procede del intercambio cifrado que los dos borgs acaban de completar, así que solo es el mismo en ambas pantallas si es tu computadora la que está hablando con el servidor. Alguien que se hubiera hecho con el enlace y lo usara antes mostraría al servidor un código distinto, y no puede elegir uno que coincida con el tuyo. Si tu terminal dibuja los emojis más estrechos de lo que borg espera, borg muestra solo los nombres; en ese caso, compara los nombres.

A partir de entonces, Claude puede llegar a ese borg siempre que esté en ejecución allí. borg pair sin más argumentos enumera los servidores emparejados, y borg pair --forget NAME olvida uno; en el servidor, F8 en el diálogo Acceso remoto olvida todas las computadoras emparejadas. A través de borg cloud, Claude también obtiene download y upload, que copian archivos entre el servidor y tu computadora; borg get NAME:PATH [TO] y borg put FROM NAME:PATH hacen lo mismo desde tu terminal. Las descargas de Claude van a tu carpeta Descargas y nunca reemplazan un archivo que ya esté allí. Las subidas esperan tu aprobación en borg, que muestra el archivo que se envía, y cada aprobación indica qué computadora la pidió.

La conexión está cifrada de extremo a extremo. Cada borg guarda una clave de servidor, por la que lo conocen las computadoras emparejadas, y una computadora que llega a servidores guarda además una clave de computadora propia. Solo tú puedes leer ambas. La clave de servidor es un archivo en la carpeta link de la carpeta de estado. La clave de computadora también es un archivo allí. En un Mac se guarda en tu llavero de inicio de sesión, y en Linux el archivo se sella con una contraseña (consulta Claves de computadora). El emparejamiento intercambia las claves públicas, y cada conexión empieza con un intercambio Noise IK ligado a ellas, de modo que el relay solo reenvía texto cifrado y no puede responder en nombre de ninguno de los dos borgs. Las llamadas desde otra computadora pueden leer sin preguntar, igual que las locales; activa “preguntar antes de que otra computadora lea” en Opciones → Complementos para que esas lecturas también esperen aprobación. Borg no mantiene ninguna conexión con el relay salvo que esté emparejado o mostrando un enlace de emparejamiento, y ninguna en absoluto cuando borg cloud está desactivado en Opciones → Complementos.

Borg guarda el relay en la configuración como relay = "wss://relay.example.com". Una computadora llega al servidor a través del relay con el que se emparejó, así que, si el servidor cambia de relay, vuelve a emparejar la computadora. Todos los borgs de una misma máquina comparten sus claves, y el servicio en segundo plano los conecta a todos al relay. Con el servicio desactivado, solo se conecta el primer borg que se abre, y los demás te indican cuál tiene borg cloud.

La clave de computadora demuestra a cada servidor emparejado que una conexión viene de tu computadora. Cuando un servidor todavía conoce esta computadora por otra clave, como la clave de servidor de esta máquina, Borg lo cambia a la clave de computadora la próxima vez que abre una sesión allí. Borg demuestra al servidor que tiene la clave nueva, y el servidor cambia la clave en la entrada de esa computadora y conserva su nombre. Las conexiones que aún usan la clave anterior terminan en su siguiente llamada. El servidor muestra un aviso y escribe ambas huellas digitales en el registro del agente, y su lista de Clientes muestra cuándo cambió la clave y cuál era. Un servidor con un Borg más antiguo conserva la clave anterior hasta que se actualice.

En un Mac, Borg guarda la clave de computadora en tu llavero de inicio de sesión, como un elemento llamado Borg Commander que solo Borg puede leer sin preguntarte. La primera vez que un proceso de Borg necesita la clave, macOS pide Touch ID o tu contraseña, así que incluso un programa que inicie borg por su cuenta se deja ver. Después de cada actualización de Borg, macOS también pregunta una vez si el Borg nuevo puede usar el elemento; elige Permitir siempre. Un archivo de clave de computadora de un Borg anterior pasa al llavero la primera vez que Borg lo usa, y el archivo se elimina. Un Borg que se ejecuta sin la pantalla del Mac, como por SSH o en el servicio en segundo plano, no puede mostrar la petición ni conectarse a servidores. Cuando $BORG_STATE_DIR indica una carpeta de estado distinta de la habitual, Borg guarda la clave de computadora como un archivo en la carpeta link de esa carpeta. Las versiones de Borg para macOS se firman con Hardened Runtime, así que otros programas no pueden leer la memoria de Borg ni cargar código en él.

En Linux, Borg sella la clave de computadora con una contraseña que tú eliges, en el archivo computer-key.sealed de la carpeta link. Ejecuta borg unlock en una terminal para elegirla: Borg sugiere cuatro palabras al azar, fáciles de escribir y difíciles de adivinar, y pide la contraseña dos veces. Borg refuerza la contraseña con Argon2id, lo que lleva unos segundos y 1 GiB de memoria, o la octava parte de la memoria en una máquina con menos de 8 GiB, así que adivinarla a partir de una copia del archivo es lento. Un archivo de clave de computadora de un Borg anterior se sella la primera vez que ejecutas borg unlock, y el archivo se elimina; hasta entonces, Borg te pide que lo ejecutes. Cuando $BORG_STATE_DIR indica una carpeta de estado distinta de la habitual, Borg también guarda en Linux la clave de computadora como un archivo normal, sin contraseña.

Una vez desbloqueada, la clave queda en el keyring del kernel de tu usuario hasta que pasan 12 horas sin que Borg la use, y cada uso vuelve a contar las 12 horas desde el principio. Un reinicio la bloquea, y borg lock la bloquea al instante. Donde Borg no puede usar el keyring del kernel, como en muchos contenedores y servicios del sistema, un pequeño proceso de Borg guarda la clave, en un socket de la carpeta link que solo tú puedes abrir, y termina tras 12 horas sin uso. Cuando la clave está bloqueada, Borg pide la contraseña: los paneles abren el diálogo Desbloquear clave, y borg pair, borg get, borg put y borg mirror la piden en la terminal. borg mcp remote, que Claude inicia sin terminal, te indica que ejecutes borg unlock.

borg unlock --ssh-agent permite además que tu ssh-agent desbloquee la clave. Borg pide al agente que firme un desafío fijo con una clave Ed25519, o con una clave RSA si no tiene ninguna, y sella la clave una segunda vez con esa firma. A partir de entonces, Borg desbloquea la clave sin preguntar mientras ese agente esté disponible, y la contraseña sigue funcionando. Borg comprueba que el agente firma igual dos veces y rechaza una clave cuyas firmas cambian. Cualquiera que pueda usar tu agente puede obtener la misma firma: si lo reenvías con ssh -A, root en la máquina remota puede usarlo mientras estás conectado y, con una copia del archivo sellado, desbloquear esta clave. Reenvía el agente solo a máquinas de confianza, o deja esto desactivado. borg unlock --no-ssh-agent lo vuelve a desactivar.

borg pair --new-key da a esta computadora una clave nueva, y cada servidor la acepta la próxima vez que Borg se conecta a él. Hasta que todos la tengan, Borg conserva también la clave anterior, y borg pair marca cada servidor que todavía la acepta. Pasada una semana, también sugiere olvidar los servidores que ya no uses, con borg pair --forget NAME.

Cuando un servidor rechaza todas las claves que tiene esta computadora, Borg te lo dice. O alguien olvidó esta computadora en ese servidor, o alguien con una copia de su clave cambió antes el servidor a una clave propia. Una clave nueva es higiene y no deshace una filtración. Si crees que alguien copió una clave, pulsa F8 en Acceso remoto en cada servidor para olvidar las computadoras emparejadas, vuelve a emparejar y revisa esos servidores.

Sesiones con nombre y el servicio en segundo plano

Sección titulada «Sesiones con nombre y el servicio en segundo plano»

Con espacios de trabajo con nombre, borg sessions list muestra sus ID y nombres, borg sessions create NAME añade uno y borg --session NAME lo abre. Por MCP, el agente puede llamar a list_sessions, list_remote_sessions y use_session para elegir con qué sesión trabaja esa conexión. Una sola llamada a una herramienta también puede pasar un ID de session para dirigirse a otra sesión solo esa vez. La sesión elegida solo se aplica a esa conexión MCP.

Con más de una sesión, o cuando la única que hay está abierta en otro terminal, borg empieza por la ventana Sesiones de Borg. Sus primeras líneas explican qué es una sesión, y la lista muestra cada sesión con la fecha en que se usó por última vez. Una sesión activa en este momento aparece marcada con su estado: Abierta en otro terminal, o Mantenida por el servicio cuando la ejecuta el servicio en segundo plano. Queda elegida la sesión usada por última vez, salvo que otro terminal la tenga abierta. Enter abre la sesión elegida donde la dejaste; una sesión que mantiene el servicio se abre conectada a él, como con borg service attach NAME. Un clic elige una sesión y un segundo clic la abre. F7 pone nombre a una sesión nueva y la abre, y Esc o F10 sale sin abrir ninguna. Mientras la ventana está abierta, comprueba cada 2 segundos qué sesiones están activas.

F8 o Delete elimina la sesión elegida, tras una confirmación cuya opción predeterminada es No. Esto borra sus paneles guardados y su historial de terminal; tus archivos y carpetas se conservan. La sesión predeterminada (Default) siempre se queda, igual que una sesión activa en este momento: sal antes de Borg en el otro terminal. Para eliminar una sesión que mantiene el servicio, ábrela con borg service attach NAME y sal con F10.

Cuando indicas con borg --session NAME una sesión que otro Borg tiene abierta en un terminal, borg se detiene e indica qué Borg es: su número de proceso, su terminal tal como lo muestra ps y hace cuánto se inició. Sal de ese Borg con F10 donde se esté ejecutando. Si ya no puedes llegar a su terminal, termínalo con kill y el número de proceso.

Todos tus Borgs de una máquina comparten un servicio en segundo plano. El primer borg que abres lo inicia, sin nada que instalar, y el servicio se detiene 30 segundos después de que se cierre la última sesión. Para desactivarlo, pon start-service = false en la configuración.

El servicio mantiene borg cloud conectado para todos tus Borgs, así que una computadora emparejada llega a todas las sesiones abiertas. Trabaja en la sesión que indica, o en la que usaste por última vez, y espera allí tu aprobación. Puedes emparejar desde cualquier Borg.

Para mantener una sesión en marcha sin terminal, ejecuta borg service keep NAME. Ábrela con borg service attach NAME o desde la ventana Sesiones de Borg, y pulsa Ctrl-] para desconectarte. Salir de Borg allí con F10 termina la sesión. Cuando una computadora emparejada pide una sesión que no está en marcha, el servicio la inicia en segundo plano.

Para iniciar el servicio con la máquina, ejecuta borg service install, enable y start. Estos comandos usan sudo, que te pide la contraseña, salvo que seas root. borg service stop, disable y uninstall los deshacen. También puedes elegir F9 → Remoto → Servicio en segundo plano…: el diálogo muestra el comando del siguiente paso, y Enter lo ejecuta en el shell de Borg. En un contenedor sin systemd, haz que el supervisor de procesos del contenedor ejecute borg service run.

borg update instala la nueva versión, pasa el servicio en segundo plano a ella y te avisa cuando el servicio ya la ejecuta. El servicio vuelve a arrancar en su propio proceso, así que las sesiones que mantiene conservan su shell y los programas que se ejecutan en él. Cada Borg abierto lo sigue cuando queda inactivo: espera a que terminen las tareas en curso, a que guardes o cierres los archivos editados y a que se resuelva la solicitud del agente. Después vuelve a arrancar en el mismo terminal, conserva su shell y te dice qué versión ejecuta ahora.

La actualización guarda la versión que sustituyó junto al archivo del programa, como .borg.previous. Si la nueva versión no toma el relevo en 60 segundos, Borg restaura la anterior y el servicio vuelve a arrancar con ella. Las sesiones que mantenía arrancan entonces con shells nuevos.

Un servicio iniciado por un Borg más antiguo no puede cambiar de versión por sí solo. borg update te lo indica, y el servicio usa la nueva versión la próxima vez que arranque.

Para actualizar una máquina emparejada, selecciónala en Hosts remotos y pulsa U. Cuando confirmas, el host obtiene la última versión igual que con borg update, y su servicio pasa a ella. Esc cierra el selector mientras la actualización sigue. Después Borg te dice qué versión ejecuta el host, o que la nueva versión no arrancó y el host volvió a la que ejecutaba. Un espejo de una de sus sesiones lo espera y vuelve a mostrar el host cuando regresa (consulta Reflejar una sesión). Ejecuta borg update en el host cuando su Borg sea más antiguo o funcione sin el servicio en segundo plano. Un Borg instalado allí con Homebrew o cargo se actualiza con esa herramienta en el host, y Borg te indica el comando.

Después de emparejar, borg --remote MACHINE:SESSION abre los archivos de esa sesión en el panel izquierdo. Enter o F3 previsualizan un archivo remoto descargando una copia local temporal. F5 copia archivos y carpetas marcados entre paneles locales y remotos, o entre dos hosts emparejados, y el diálogo de destino indica qué cliente o host es cada lado. Las copias se ejecutan como tareas en segundo plano con progreso en bytes, pausa y cancelación, y la opción de sobrescribir, omitir o conservar ambos. Las carpetas se copian con sus subcarpetas vacías y sus enlaces simbólicos, y los archivos normales conservan su permiso de ejecución y su fecha de modificación. Un archivo solo aparece en su destino cuando ha llegado todo su contenido. F6 (mover) y F8 (eliminar) no están disponibles en los paneles remotos.

El panel derecho sigue en tu computadora. Con Opciones → Complementos → Seguir activado, la línea de comandos y Ctrl-O usan un shell interactivo en el host remoto. Su terminal se dibuja localmente, y las teclas, lo que pegas, Ctrl-C y los programas de terminal se ejecutan en el host remoto. Cada sesión remota conserva su propio shell y su línea de comandos a medio escribir mientras cambias de panel, y al seleccionar un panel del cliente vuelve el shell local.

Los programas a pantalla completa, y los que leen la entrada del teclado en bruto como top, reciben todas las teclas mientras se ejecutan, Ctrl-O incluida, y al cambiar el tamaño del terminal cambia el del PTY remoto. Sal de un programa así con sus propias teclas (q en top). Si lo iniciaste desde la línea de comandos del panel, Borg vuelve después a los paneles; si lo iniciaste en la consola remota, la consola sigue abierta. Los paneles y el shell propios del Borg remoto son independientes de esta consola. Para transferir archivos desde la línea de comandos, usa borg get MACHINE/SESSION:PATH [TO] y borg put FROM MACHINE/SESSION:PATH.

Escribir exit en el shell principal Bash, Zsh o Fish de Borg pide confirmación. No está seleccionado por defecto y mantiene en marcha el mismo shell, las variables, la carpeta y los espejos. En una consola remota, exit pregunta si quieres cerrar el shell en el host; si eliges Sí, vuelve a elegir la sesión con Alt-H para obtener uno nuevo.

Las carpetas remotas se cargan por partes, con un indicador de actividad y un recuento de las entradas recibidas hasta el momento; al ir a otra carpeta se cancela la petición.

Mientras un panel remoto muestra una sesión, las solicitudes del agente que esperan allí aparecen también en tu pantalla, y puedes responderlas aquí (consulta Qué puede hacer el agente).

En el Borg local, pulsa Alt-H, haz clic en Hosts remotos en la barra de atajos o elige F9 → Remoto → Explorar hosts y sesiones… para ver las máquinas emparejadas y sus sesiones con nombre. Enter abre los archivos de la sesión seleccionada en el panel desde el que abriste el selector, y sustituye lo que mostraba ese panel. Pulsa M para reflejar la pantalla de la sesión, U para actualizar el host (consulta Actualizar con sesiones abiertas) y R para actualizar la lista.

Tab alterna entre Hosts (computadoras a las que este Borg puede llegar) y Clientes (computadoras que pueden llegar a este Borg). Clientes enumera las computadoras emparejadas con este Borg, las huellas de sus claves públicas, si están conectadas y cuántas conexiones tiene cada una. Cuando una computadora cambió su clave, la línea de la huella digital también dice qué día y qué huella tenía antes. Una computadora aparece una sola vez aunque un espejo use varias conexiones. El estado se actualiza mientras el selector está abierto, también en una sesión cuyas conexiones mantiene el servicio en segundo plano. El emparejamiento funciona en un solo sentido: un cliente autorizado no se convierte automáticamente en un host cuyos archivos pueda explorar este Borg. Cuando el propietario de la conexión no puede informar del estado de la conexión, los clientes emparejados siguen apareciendo, con Estado de conexión no disponible. Un mismo Borg puede ser host y cliente a la vez. El menú Remoto también ofrece Reflejar host montado, Compartir este Borg como host…, Registro remoto… y Servicio en segundo plano….

El selector muestra la versión de Borg de cada host. Al seleccionar una sesión se muestran su sistema operativo y su arquitectura, si se ejecuta como servicio en segundo plano o en un terminal, la latencia de las peticiones y la dirección del relay. Los hosts se consultan en paralelo, de modo que un host no disponible no retrasa a los demás. Un host que no puede informar de su versión muestra versión no disponible; la versión del relay es otra cosa. Mantén Borg actualizado en ambas computadoras: un host al que le falta una función remota muestra un mensaje que te pide actualizarlo.

Mientras un espejo se conecta, el selector muestra un estado animado, y Esc cancela al instante. Cada paso de la conexión dispone de 10 segundos, y el intento completo de 30. Si el intento falla, el selector sigue abierto e indica qué paso falló; M vuelve a intentarlo con la sesión seleccionada.

En el selector, F2 cambia el nombre del host seleccionado para todas sus sesiones, y Shift-F2 cambia el nombre de la sesión seleccionada. Estos nombres se guardan en este cliente y aparecen en el selector, en los títulos de los paneles y en el pie de la consola. Deja un nombre vacío para volver al original. Los detalles siguen mostrando los nombres originales del host y de la sesión. Los nombres están ligados a la clave del host emparejado y al ID de la sesión; los destinos de los comandos y los nombres en el host remoto no cambian.

F8 sobre un host no disponible olvida su emparejamiento en este cliente, y Shift-F8 olvida el host seleccionado aunque esté en línea. La confirmación tiene No como opción predeterminada. Olvidar un host cierra los paneles y las consolas de este cliente para ese host; las sesiones y los archivos del host se conservan, igual que la identidad de este cliente y sus demás emparejamientos. Vuelve a emparejar para reconectar.

F8 o Delete sobre una sesión de un host la elimina, tras una confirmación cuya opción predeterminada es No. Esto cierra la sesión y sus consolas remotas, y elimina sus paneles de Borg guardados y su historial de terminal; los archivos y las carpetas del host se conservan. La sesión predeterminada (Default) no se puede eliminar. Una sesión independiente que en ese momento aloja la conexión no puede eliminarse a sí misma; ciérrala primero en el host y ejecuta Borg en otra sesión. Si la eliminación falla, la sesión sigue en la lista para que puedas intentarlo de nuevo. Una sesión en marcha se detiene primero, y el servicio no la vuelve a iniciar.

borg mirror MACHINE:SESSION muestra la pantalla en vivo de la sesión remota en tu terminal local; Alt+Shift+M abre el mismo espejo desde un Borg local con un panel remoto. Ctrl-G (mantén pulsado Control y pulsa G) sale del espejo y vuelve a los paneles locales, igual que un clic en el banner de la parte inferior. La línea de encima indica quién tiene el control; Ctrl-] también sale.

Un borg normal o un borg --session NAME se puede reflejar mientras se ejecuta, sin el servicio en segundo plano. Su propio terminal sigue visible, y cualquier entrada de teclado o ratón en él recupera el control del espejo. Mientras tienes el control, Borg en el host organiza la pantalla para tu ventana: cuando el espacio sobre el banner es más pequeño que el terminal del host, Borg dibuja en la esquina superior izquierda de ese terminal con tu tamaño, y el resto queda en blanco. Cuando el control vuelve al terminal del host o sales del espejo, Borg vuelve a ocupar todo ese terminal. Un espejo sin control sigue la disposición del terminal del host y se recorta para caber en una ventana más pequeña; si agrandas la ventana, ves el resto. Una sesión que mantiene el servicio en segundo plano sigue viva después de que se cierre su terminal, y la computadora que tiene el control define su tamaño.

Si otro terminal tiene el control de la sesión remota, el espejo se abre en modo de solo lectura y tus teclas no llegan a la sesión. Pulsa Ctrl-T o haz clic en la línea de estado para tomar el control y desconectar el otro terminal, o empieza con borg mirror MACHINE:SESSION --take; --take siempre toma el control de otro espectador. Una vez que tienes el control, la primera tecla activa una pantalla remota en reposo, y las teclas y la entrada del ratón posteriores llegan a ella. Un espectador que se queda atrás omite los fotogramas antiguos de animación y pasa directamente a la pantalla actual.

Cuando el host deja de responder, por ejemplo mientras se actualiza, el espejo conserva la última pantalla, lo indica en su línea de estado y vuelve a intentarlo cada 2 segundos durante 100 segundos como máximo. Mientras tanto, Ctrl-G sale del espejo. Cuando el host vuelve, el espejo muestra de nuevo su pantalla, con la versión que ejecuta ahora abajo a la derecha. Si el host sigue ausente después de eso, el espejo termina con un mensaje.

Una solicitud del agente aparece en el espejo tal como la muestra el servidor, y la respondes allí cuando tengas el control. Si abriste el espejo desde un panel remoto y la solicitud sigue esperando cuando sales de él, el borg de ese panel vuelve a mostrarla.

borg-relay es el relay a través del cual se encuentran los borgs. En un servidor Linux con un dominio que apunte a él y el puerto 443 libre, un solo comando lo instala como servicio, con un certificado TLS de Let’s Encrypt:

Ventana de terminal
curl -fsSL https://raw.githubusercontent.com/0xcd21h/borg-commander/main/scripts/install-relay.sh | sudo sh -s -- relay.example.com you@example.com

Ejecuta el mismo comando de nuevo para actualizarlo.

En Dokploy, Coolify u otro host de Docker cuyo proxy gestione TLS, ejecuta la imagen ghcr.io/0xcd21h/borg-relay:latest y asígnale un dominio en el puerto 8080. En Dokploy, crea una aplicación a partir de esa imagen de Docker con un dominio en el puerto 8080 del contenedor y HTTPS activado; en Coolify, crea un recurso a partir de esa imagen de Docker con el puerto 8080 expuesto y un dominio. Ambos aceptan también packaging/relay/docker-compose.yml como servicio de Compose. La imagen ejecuta borg-relay --behind-proxy: el proxy sirve HTTPS y deja pasar los WebSockets, y el relay aplica sus límites por dirección de cliente, según la indica el proxy en X-Forwarded-For. Se ejecuta como un usuario sin privilegios y tiene una comprobación de estado (GET /health).

En un host de Docker sin un proxy así, la misma imagen sirve TLS por sí misma:

Ventana de terminal
docker run -d --restart unless-stopped -p 443:443 -v borg-relay:/data ghcr.io/0xcd21h/borg-relay --domain relay.example.com --cache /data

Detrás de otro proxy que gestione TLS, ejecuta borg-relay --behind-proxy --listen 127.0.0.1:8080. Ejecútalo así solo detrás de un proxy, porque el relay confía en la dirección de cliente que indica el proxy. El relay impone límites por dirección en servidores y sesiones, tamaño de trama, ancho de banda, bytes por sesión, tiempo de inactividad y duración de la sesión. No guarda nada salvo su certificado.

El relay solo registra recuentos: una vez por minuto, si algo ha cambiado, escribe una línea como

stats: connections=3 servers=2 sessions=1 joined=14 carried=3.2MiB limited=0

Esto muestra las conexiones que mantiene, los servidores registrados y las sesiones abiertas, y, desde que se inició, las sesiones unidas, los bytes que transportaron y las conexiones y sesiones que un límite rechazó o terminó. Para depurar, --log, o la variable de entorno BORG_RELAY_LOG=1 en la imagen, registra además el registro de cada servidor por el inicio de su clave, cada sesión con los bytes que transportó y cada límite alcanzado con la dirección del cliente.

Esta guía sigue la rama main · Borg 0.11.0 · 1f6bce6
Puede que la última versión publicada no incluya todo lo que se describe aquí. Notas de la versión

Traducción de la guía en inglés. Las correcciones son bienvenidas. Los comandos y los atajos de teclado no se traducen.