# Transferencia de archivos y conexión directa por LAN

> HTML: https://remote.ivjn.us/docs/es/files-and-lan/

Agent, Exchange, CLI, consola web y consola móvil admiten transferencias de archivos. Los dispositivos compatibles anuncian la capacidad `files`.

## Transferencia de archivos

```sh
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"}'`

```sh
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:

```json
{
  "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`:

```toml
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

```sh
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.
