Watch at EaseHistorias. Respuestas. Perspectiva.

Tecnología · GUÍA PRÁCTICA

¿Rsync dice “protocol version mismatch”? Captura el flujo remoto antes de editar el shell

Demuestra si hubo stdout extra, un comando SSH forzado, un rsync remoto ausente o un límite real de versiones antes de imponer --protocol.

Original diagram connecting raw SSH output, the command actually executed by sshd, and local and remote rsync binary evidence.
Ilustración original: une flujo bruto, comando ejecutado y versiones. Watch at Ease

El mensaje indica que los primeros bytes recibidos no forman la conversación rsync esperada. La salida de inicio es común, pero no prueba que .bashrc sea culpable. ForceCommand, una cuenta solo SFTP, PATH, un PTY o versiones antiguas también pueden producirlo.

Conserva una sola cadena de evidencia: comando exacto, stdout sin PTY, stderr separado, comando permitido por sshd, binarios y versiones de ambos lados, y un archivo desechable verificado. Cambia solo la rama respaldada por evidencia positiva.

Congela el transporte fallido

Registra comando local, dirección, sintaxis de origen/destino, alias, usuario, puerto, autenticación, código de salida y ambos flujos. Guarda ssh -G sin publicar secretos.

Un login interactivo exitoso no es control equivalente: puede asignar terminal, usar otro inicio y omitir el comando remoto de rsync.

Captura stdout remoto sin PTY

Ejecuta ssh -T remotehost /bin/true >out.bin 2>err.txt, anota bytes y revisa una vista hexadecimal segura. Si out.bin no está vacío, identifica primero el emisor.

Revisa inicio del shell, banners, wrappers e inicialización. Limita mensajes humanos a sesiones interactivas y no ocultes evidencia con -q.

Con stdout vacío demuestra qué ejecutó sshd

Revisa command=, ForceCommand, internal-sftp, ChrootDirectory, no-user-rc y wrappers en authorized_keys y Match. Un comando forzado ignora el del cliente.

Rsync necesita ejecutar rsync --server en remoto. SFTP-only o un comando fijo rompen ese contrato. Si rsync es necesario, usa un wrapper allowlist revisado sin quitar toda restricción.

Resuelve binario y versión remotos

En el mismo contexto no interactivo registra command -v rsync y la versión por ruta absoluta; compáralos con el lado local. chroot o PATH pueden ocultar el binario.

Prueba --protocol solo después de limpiar el flujo y permitir el comando. Es un experimento acotado, no una cura universal.

Cierra con un archivo desechable

Transfiere una vez un archivo pequeño conocido sin PTY y registra comando, versiones, salida, tamaño y checksum independiente en ambos lados. Conserva los transcripts fallido y correcto.

Restaura la automatización solo con el comando esperado, cero bytes extra y archivo verificado bajo la misma cuenta y política. Si la cuenta es solo SFTP, usa transferencia SFTP.

Original decision diagram separating stray stdout, forced SSH commands, remote PATH failures, and genuine rsync version boundaries.
Ilustración original: cierra una rama con una prueba positiva. Watch at Ease