Watch at EaseHistorias. Respuestas. Perspectiva.

Tecnología · GUÍA PRÁCTICA

¿SCP dice “Received message too long”? Captura los bytes antes de cambiar SSH

El número puede ser los primeros cuatro bytes de texto inesperado interpretados como longitud SFTP. Reproduce la misma cuenta y ruta, captura la salida no interactiva y separa inicio, subsistema y compatibilidad limitada.

Ilustración original de salida extra interpretada como longitud SFTP.
Ilustración original: captura los bytes antes de editar el inicio. Watch at Ease

El error suele ser un síntoma del protocolo, no del tamaño del archivo. scp moderno usa SFTP por defecto y texto remoto puede parecer una longitud binaria antes de transferir.

Con la misma cuenta, conserva bytes, identifica la capa, cambia un solo límite y verifica transferencia e inicio interactivo.

Reproduce la ruta exacta que falla antes de editar

Guarda el error completo del cliente, el comando, alias del host, usuario, puerto, salto y método de autenticación. Repite la transferencia con registro detallado, ocultando claves y tokens. Un inicio ssh interactivo correcto no demuestra que el subsistema SFTP esté limpio: puede usar otra ruta de comandos.

Con la misma cuenta y configuración SSH, ejecuta una operación no interactiva como ssh -T host /usr/bin/true. La referencia correcta no produce stdout. Conserva exactamente cualquier banner, debug echo, mensaje de comando ausente o error de inicio que aparezca antes del protocolo.

Usa el número como pista de los cuatro primeros bytes extra

Un paquete SFTP empieza con una longitud de cuatro bytes. Si llega texto primero, el cliente puede interpretar esos cuatro caracteres como una longitud decimal enorme y detenerse con “Received message too long”. Convierte el valor a hexadecimal y ASCII solo como pista y compáralo con la salida capturada.

Si los primeros caracteres parecen parte de un archivo, banner o error, sigue al productor exacto. El caso de macOS revisado para esta guía decodificó “.bas” y luego confirmó salida de .bashrc. Tu valor puede indicar otra causa, así que conserva los bytes antes de editar.

Rastrea el archivo de inicio que realmente se ejecuta

Para Bash, comprueba si la ruta no interactiva invocada por sshd lee ~/.bashrc, si BASH_ENV señala otro archivo y si un profile del sistema o wrapper escribe salida. Otros shells tienen reglas distintas. Prueba la cuenta de transferencia real, no los archivos del administrador.

Pon saludos, comandos de estado y diagnósticos detrás de una condición interactiva demostrada o envíalos por un canal que no pueda corromper el protocolo. Un return indiscriminado al principio puede omitir variables necesarias para trabajos automáticos. Vuelve a probar el inicio y la sonda sin salida.

Separa el ruido de inicio de un subsistema ausente

Si la sonda no produce salida pero SFTP aún falla, revisa Subsystem sftp, el shell de la cuenta, chroot, forced command y los registros de política. internal-sftp puede evitar un programa externo y algunas rutas de inicio, pero cambiar sshd_config afecta al servidor y exige validar la configuración y preparar una reversión segura.

No reinicies sshd a ciegas desde la única sesión activa. Valida la configuración, conserva una segunda sesión administrativa cuando la política lo permita y prueba la misma cuenta. Un shell personalizado o restringido puede necesitar un diseño SFTP explícito en vez de un reemplazo global.

Usa SCP heredado solo como prueba de compatibilidad acotada

OpenSSH scp moderno usa SFTP por defecto. La opción -O selecciona SCP heredado para servidores sin SFTP o comportamientos antiguos concretos de rutas y comodines. Si scp -O funciona y scp normal falla, registra la diferencia: reduce el ámbito, pero no demuestra que el servidor esté bien configurado.

Trata -O como una excepción documentada para un dispositivo, cuenta o ruta conocidos, no como solución universal permanente. El modo heredado ejecuta el shell remoto para parte de su comportamiento y tiene reglas de comillas distintas. Si administras el servidor, repara el subsistema SFTP compatible o la salida de inicio.

Verifica la transferencia y el límite de inicio

Repite el comando original con la misma cuenta y ruta. Confirma estado de salida cero, tamaño y, cuando sea posible, suma de comprobación; también que la sonda no interactiva no emita stdout inesperado. Después verifica que el inicio interactivo todavía cargue el prompt y entorno previstos.

Documenta el productor exacto, el archivo o subsistema cambiado, el protocolo y el motivo. Para automatización, añade una prueba que falle si la operación remota vacía emite bytes. Así, una futura incidencia se convierte en una regresión precisa y no en otra ronda de conjeturas sobre dotfiles.

Ilustración original que separa salida, subsistema y compatibilidad.
Ilustración original: repara solo la capa demostrada. Watch at Ease