Transferencia de archivos y conexión directa por LAN
Agent, Exchange, CLI, consola web y consola móvil admiten transferencias de archivos. Los dispositivos compatibles anuncian la capacidad files.
Transferencia de archivos
remote-cli file i5m ls /tmp
remote-cli file i5m upload ./example.zip /tmp/example.zip
remote-cli file i5m download /tmp/example.zip ./downloaded.zip
remote-cli file i5m fetch https://example.com/example.zip ./example.zip
Los archivos existentes no se sobrescriben de forma predeterminada; añade --overwrite al subir o descargar para permitirlo. En la CLI, Ctrl+C cancela la operación; las consolas web y móvil ofrecen un botón de cancelación. En la web se utiliza la pestaña «Archivos» del detalle del dispositivo; en el móvil, entra en «Transferencia de archivos» desde ese detalle.
La transferencia utiliza bloques de 64 KiB y espera la confirmación de cada uno antes de continuar. Cada archivo puede tener hasta 1 GiB; las descargas web se limitan a 128 MiB, por lo que conviene usar la CLI o la consola móvil para archivos mayores. Los directorios devuelven hasta 1000 entradas y no se admite subir directorios de forma recursiva. Las subidas escriben un archivo temporal en el directorio de destino y lo sustituyen atómicamente al completar la recepción. La cancelación, desconexión o expiración elimina los temporales incompletos. Las descargas de la CLI también usan archivos temporales; el móvil descarga a la caché y después invoca la función de compartir o guardar del sistema.
El acceso utiliza los permisos del proceso Agent y no queda restringido a un directorio compartido. Las cuentas de solo lectura no pueden listar directorios, subir ni descargar. Exchange mantiene el espacio de trabajo del dispositivo, el aislamiento de sesiones y la auditoría de operaciones, sin registrar el contenido de los archivos. En Android, . apunta al directorio de archivos de la aplicación Agent; las demás rutas están sujetas a los permisos de Android y no permiten eludir el aislamiento del sistema.
Descargas de Internet mediante el Agent
Introduzca una URL HTTP/HTTPS en los archivos de la consola web o ejecute file DEVICE fetch URL LOCAL. El Agent descarga desde su propia red y transmite el archivo al equipo Console sin guardarlo en el Agent. Límites: 128 MiB en la web y 1 GiB en CLI. Cancelar, desconectar o fallar descarta los archivos incompletos; reemplazar un destino CLI requiere --overwrite. Compatible con Agents nativos de escritorio, Linux, Android y OpenWrt; la extensión no transfiere archivos. Se verifican los certificados y se rechazan credenciales en la URL y cambios de HTTPS a HTTP; máximo cinco redirecciones.
La descarga no hereda --insecure del servidor de gestión.
Solicitudes HTTP de estilo curl
Pegue un comando curl en la pestaña HTTP del dispositivo. La Console envía una solicitud sellada al Agent y muestra estado, duración, cabeceras y cuerpo. Admite -X/--request, -H/--header, -d/--data, --data-raw, --data-binary en línea, --json, -I/--head, -L/--location, -m/--max-time y --url. No ejecuta shell ni lee @file. Los Agents nativos no necesitan curl instalado. La extensión requiere permisos del sitio, no envía cookies del navegador y rechaza cabeceras prohibidas. Use la URL final si Chromium oculta una redirección. Los permisos de solo lectura no permiten enviar solicitudes. Cuerpo máximo de 256 KiB y tiempo de 120 segundos; respuesta truncada y señalada a 1 MiB en nativos o 128 KiB en la extensión. Para binarios o archivos grandes, use la descarga de archivos.
El mensaje sellado es net_req. Capacidad del navegador: net. Comando CLI equivalente: remote-cli net DEVICE http URL -X POST -H 'Content-Type: application/json' -d '{"message":"hello"}'
curl -X POST 'https://example.com/api' -H 'Content-Type: application/json' --data-raw '{"message":"hello"}'
Puerto de control LAN
El control por LAN está desactivado de forma predeterminada y usa el puerto TCP 7277. Actívalo únicamente en una red local de confianza. Antes, el dispositivo debe haber fijado la raíz del espacio de trabajo mediante remote-agent seal root o conectándose a Exchange para completar TOFU. No hay un token de acceso LAN. No reenvíes este puerto a Internet.
Añade lo siguiente al JSON de configuración del agente:
{
"lan_enabled": true,
"lan_port": 7277
}
Conserva los campos existentes server, device_id y token. También puedes usar --lan-enabled y --lan-port, o REMOTE_LAN_ENABLED y REMOTE_LAN_PORT. Si no hay una raíz fijada, habilitar LAN impide el arranque.
Las páginas de configuración del escritorio y de LuCI tienen un interruptor. Reinicia Agent después de cambiarlo; en el escritorio debes detener primero la conexión. Al desactivarlo y reiniciar, deja de escuchar en ese puerto. El programa no crea automáticamente reglas de cortafuegos.
Para conexión directa de la CLI, crea una configuración aparte y no uses login, que exige un token no vacío. En server, indica http://IP:7277 del dispositivo y deja token vacío; las solicitudes no incluyen Authorization:
server = "http://192.168.1.20:7277"
token = ""
Apunta REMOTE_CLI_CONFIG a ese archivo para conservar una configuración de acceso a la nube por separado. La identidad sellada y las autorizaciones en caché se guardan en el directorio de ese archivo de configuración: las autorizaciones sin conexión en seal-grants.json y las cadenas de certificados, con los emitidos por la raíz primero, en seal-chains.json. Todas las operaciones de dispositivo abren exclusivamente sesiones selladas, incluidos los dispositivos conectados directamente cuya tarjeta indica local o cuya dirección LAN devuelve 401 en /api/auth/me. Agent no emite ni renueva estas autorizaciones. Sin conexión a la nube solo se pueden usar las autorizaciones de cadenas raíz que sigan vigentes en la caché. sessions y session-kill no están disponibles: la LAN no tiene un directorio de sesiones y Exchange sigue gestionando las sesiones del dispositivo.
La conexión directa solo expone el dispositivo local. La capa exterior solo acepta direcciones privadas, de enlace local o de bucle local, y valida Origin. Tras esas comprobaciones, GET /api/devices solo devuelve el ID y seal_key / seal_mode, necesarios para iniciar la negociación sellada. GET /api/auth/me no devuelve la identidad del operador antes de esa negociación. GET /ws/operator solo acepta sesiones selladas y no ofrece una ruta de compatibilidad sin cifrar.
En el saludo de open_sealed, el cliente incluye la prueba de clave pública del operador, la autorización de la caché sin conexión (hello.grant) y, opcionalmente, la cadena de certificados (hello.chain, con los emitidos por la raíz primero). El dispositivo aplica las mismas reglas que en la ruta por Exchange para comprobar la raíz local, el alcance de dispositivos y los permisos de visualización y administración; el contenido permanece sellado. La consola web sigue conectándose por Exchange. De forma predeterminada se escucha en todas las interfaces IPv4 y la LAN sigue disponible sin conexión a la nube. Un fallo al vincular la LAN se registra y no interrumpe los reintentos de conexión a la nube.
Verificación de regresiones
python scripts/file-transfer-smoke.py --agent target/debug/remote-agent --cli target/debug/remote-cli
python scripts/agent-ui-smoke.py --agent target/debug/remote-agent --platform linux
Se necesitan Python 3.11+ y websockets. En Windows, usa rutas .exe y --platform windows. Las pruebas utilizan archivos y configuraciones temporales, sin modificar los accesos ni dispositivos existentes.