BebboSSH AROS 1.0.8: clientes bloqueados

En esta página

BebboSSH AROS 1.0.8, publicado el 29 de octubre de 2026 para i386, x86_64 y aarch64, aborda un problema poco vistoso pero fundamental para trabajar a distancia: un cliente que deja de recibir datos no debe bloquear el servidor indefinidamente. En mi adaptación de BebboSSH a AROS he centrado esta versión en la robustez del demonio, sin presentarla como una nueva shell completa ni un cambio de algoritmos criptográficos.

El proyecto deriva de BebboSSH de Stefan “Bebbo” Franke. La adaptación a AROS es mi trabajo derivado, distribuido bajo GPLv3 o posterior y conservando los créditos originales. Frente a la 1.0.7, dedicada también a la compatibilidad con PuTTY y WinSCP (artículo en italiano), aquí importa cómo responde el servicio cuando una conexión se comporta mal.

El cliente deja de leer: por qué se detenía todo

En la ruta de envío, un socket temporalmente no disponible para escritura devuelve EAGAIN. No implica necesariamente una conexión perdida: puede faltar espacio en el búfer. La rutina reintentaba el envío, pero sin limitar la ausencia de progreso. Si el destinatario dejaba de leer, el demonio podía quedarse en ese bucle, impidiendo nuevos accesos y el servicio de otras sesiones.

En la 1.0.8 se abandona el envío tras 30 segundos sin progreso; enviar nuevos bytes reinicia el contador de bloqueo. También se comprueba Ctrl-C durante la espera. El fallo marca la sesión como muerta, y después se cierra fuera del callback del canal. Es una protección contra una espera infinita, no una promesa de completar todas las transferencias en 30 segundos.

La corrección no convierte por arte de magia todas las rutas del servidor en asíncronas: durante la espera aún puede haber retrasos. La diferencia práctica es que una conexión que no consume la salida ya no puede monopolizar ese bucle indefinidamente.

Keep-alive y espera de red: otros dos casos límite

Con SendNoop some o many, el código suponía que el canal 0 seguía existiendo. Si se había cerrado pero quedaba otro abierto, el keep-alive utilizaba una referencia incorrecta: las notas de x86_64 documentan un fallo del demonio y las de i386, la desconexión del cliente. Ahora se elige el primer canal realmente abierto. La opción continúa desactivada por defecto.

Un error de WaitSelect() también podía interpretarse como disponibilidad de lectura de todos los sockets y como una pulsación de Ctrl-C. El demonio registra ahora el error, descarta los descriptores no validados y retoma el bucle; una lectura temporalmente no disponible ya no se confunde automáticamente con el cierre de la sesión. Son detalles del bucle de eventos, pero separan un error recuperable de un servicio que desaparece.

Las diferencias entre las tres arquitecturas

  • i386 alt-abiv0 y aarch64: corregido el relleno temporal del intercambio de claves, cuya espera era 2,5 veces menor de lo previsto. El intervalo medido también contempla que el reloj retroceda y limita a cinco segundos una duración individual utilizada en el cálculo.
  • i386: el cliente libera la petición de keyboard.device utilizada para leer los modificadores del teclado. Antes se perdía una pequeña asignación de memoria en las ejecuciones que recorrían esa ruta, por ejemplo tras la primera tecla de cursor.
  • Scripts de verificación: BEBBOSSH_AROS_AUTH_HELPER=askpass permite pasar la contraseña a OpenSSH mediante SSH_ASKPASS. Es una alternativa para las pruebas, no un modo nuevo del protocolo SSH; el valor predeterminado sigue siendo sshpass.

Qué se ha verificado y qué no

Las notas documentan pruebas con los archivos públicos en AROS One i386 y x86_64 bajo QEMU y en un Raspberry Pi 400 con AROS raspi-aarch64 del 12 de septiembre de 2026. Recogen 100 accesos de 100, 80 transferencias de estrés de 80 sin pausa entre conexiones, cargas SFTP de 1 a 16 MiB y comprobaciones de autenticación, peticiones malformadas y reenvío direct-tcpip.

Para el defecto principal se describe un cliente que deja de leer durante una salida de 16 MiB: un nuevo acceso vuelve a ser posible tras el límite de espera y Ctrl-C durante el bloqueo detiene el demonio en menos de dos segundos en las pruebas documentadas. Al preparar este artículo he analizado el código y descargado los seis archivos ZIP/TAR.GZ, verificando su integridad y los SHA-256 publicados. No he repetido aquí las pruebas AROS: los resultados de ejecución son los documentados para la versión, no una nueva sesión de validación.

Las limitaciones que siguen importando

Todavía no hay una shell interactiva PTY completa ni soporte de tuberías o redirecciones en los comandos remotos. En i386 y aarch64, un comando lanzado dentro de una sesión interactiva puede bloquear otras conexiones hasta terminar; para operaciones largas conviene usar ssh host comando, que se ejecuta en una tarea independiente. Incluso así, el tiempo de espera de 30 segundos con estado 124 no mata el comando: continúa hasta finalizar. No debe confundirse con el nuevo límite del envío bloqueado.

En x86_64/mincrt la ejecución remota sigue siendo síncrona: conviene limitarse a comandos breves. Solicitar un volumen no montado mediante SFTP puede abrir un cuadro de petición en la pantalla de AROS que bloquea el demonio. Bajo cargas intensas, el problema del controlador e1000 descrito en las notas es independiente de BebboSSH: utilizar rtl8139 o pcnet hasta que la distribución incorpore la corrección original. En el Pi 400 conviene evitar los registros de depuración -v5 en consola durante transferencias intensas, escenario que congeló el sistema en las pruebas documentadas.

También siguen pendientes la conservación de la fecha con OpenSSH put -p y la limitación del mensaje de cierre de canal enviado primero por el cliente. En i386 el demonio ofrece solo aes128-gcm@openssh.com si no se configura una línea Ciphers; en x86_64, HomeDir y algunas funciones SFTP siguen requiriendo las opciones explícitas descritas en las notas.

Descarga de BebboSSH AROS 1.0.8

Las tres etiquetas apuntan al mismo commit de publicación e0df1b9, pero contienen binarios para arquitecturas diferentes. Los commits posteriores de la rama principal actualizan los valores predeterminados de los scripts y los enlaces de apoyo: no son funciones nuevas de los paquetes 1.0.8. Las tres fichas de Aminet también muestran la versión 1.0.8 en la comprobación del 1 de noviembre.

Plataforma Archivos GitHub Aminet
i386 ABI v0 ZIP / TAR.GZ Ficha
x86_64 mincrt ZIP / TAR.GZ Ficha
Raspberry Pi aarch64 ZIP / TAR.GZ Ficha

Antes de iniciar el servicio

El kit incluye servidor, clientes SSH/SCP, generador Ed25519, configuración de ejemplo e instrucciones. Hay que sustituir las credenciales de prueba de passwd antes de exponer el demonio y seguir README.AROS.txt para crear la semilla inicial y después la clave del servidor. Los binarios AROS están enlazados estáticamente con libcryptossh.a: no requieren instalar por separado la biblioteca Amiga de nombre similar.

El propósito práctico de la 1.0.8 es hacer más predecible un servicio que utilizo como infraestructura de laboratorio. Un acceso correcto es solo el principio; también importa recuperarse cuando el cliente se detiene, la red devuelve un error o un canal ya está cerrado.

Fuentes y notas de la versión

AUTOR

Desarrollador y administrador de sistemas, especializado en Linux y plataformas de aprendizaje. En AndroidLab escribe sobre Android, infraestructura y retroinformática desde una perspectiva técnica y práctica.

Dejar un comentario