
Aplicación de terminal remota que soporta conectividad intermitente, itinerancia de IP y eco local especulativo para enlaces de alta latencia. Utiliza cifrado AES-128 sobre UDP con autenticación basada en SSH.
Mosh es una aplicación de terminal remota que soporta conectividad intermitente, permite la itinerancia y proporciona eco local especulativo y edición de línea de las pulsaciones del usuario.
Su objetivo es soportar los usos interactivos típicos de SSH, además de:
Mosh mantiene la sesión activa si el cliente entra en suspensión y se despierta más tarde, o pierde temporalmente su conexión a Internet.
Mosh permite que el cliente y el servidor "deambulen" y cambien de dirección IP, manteniendo la conexión activa. A diferencia de SSH, Mosh se puede utilizar mientras se cambia entre redes Wi-Fi o desde Wi-Fi a datos móviles a Ethernet por cable.
El cliente de Mosh ejecuta un modelo predictivo del comportamiento del servidor en segundo plano e intenta adivinar inteligentemente cómo cada pulsación afectará al estado de la pantalla. Cuando confía en sus predicciones, las muestra al usuario mientras espera la confirmación del servidor. La mayoría de las pulsaciones y el uso de las teclas de flecha izquierda y derecha pueden reflejarse inmediatamente.
Como resultado, Mosh es utilizable en enlaces de alta latencia, por ejemplo, en una conexión de datos móviles o una red Wi-Fi irregular. A diferencia de intentos anteriores de modos de eco local en otros protocolos, Mosh funciona correctamente con aplicaciones de pantalla completa como emacs, vi, alpine e irssi, y se recupera automáticamente de errores de predicción ocasionales dentro de un RTT. En enlaces de alta latencia, Mosh subraya sus predicciones mientras están pendientes y elimina el subrayado cuando son confirmadas por el servidor.
Mosh no soporta el reenvío X ni los usos no interactivos de SSH, incluyendo el reenvío de puertos.
Mosh ajusta su velocidad de fotogramas para no llenar las colas de la red en enlaces lentos, por lo que "Control-C" siempre funciona dentro de un RTT para detener un proceso desbocado.
Mosh advierte al usuario cuando no ha recibido noticias del servidor durante un tiempo.
Mosh soporta enlaces con pérdida que pierden una fracción significativa de sus paquetes.
Mosh maneja algunos casos extremos de Unicode mejor que SSH y los emuladores de terminal existentes por sí solos, pero requiere un entorno UTF-8 para funcionar.
Mosh aprovecha SSH para establecer la conexión y autenticar a los usuarios. Mosh no contiene ningún código privilegiado (root).
El sitio web de Mosh tiene información sobre paquetes para muchos sistemas operativos, así como instrucciones para compilar desde el código fuente.
Tenga en cuenta que mosh-client recibe una clave de sesión AES como
variable de entorno. Si está portando Mosh a un nuevo sistema operativo,
asegúrese de que las variables de entorno de un proceso en ejecución no
sean legibles por otros usuarios. Hemos confirmado que este es el caso en
GNU/Linux, OS X y FreeBSD.
El binario mosh-client debe existir en la máquina del usuario, y el
binario mosh-server en el host remoto.
El usuario ejecuta:
$ mosh [usuario@]host
Si los binarios mosh-client o mosh-server están fuera del $PATH
del usuario, mosh acepta los argumentos --client=RUTA y --server=RUTA
para seleccionar ubicaciones alternativas. Hay más opciones documentadas en
la página de manual mosh(1).
Hay más ejemplos y una FAQ en el sitio web de Mosh.
El programa mosh usará SSH para conectarse a usuario@host y establecer
la conexión. SSH puede solicitar al usuario una contraseña o usar
autenticación de clave pública para iniciar sesión.
A partir de este punto, mosh ejecuta el proceso mosh-server (como el
usuario) en la máquina servidora. El proceso servidor escucha en un puerto
UDP alto y envía su número de puerto y una clave secreta AES-128 de vuelta
al cliente a través de SSH. La conexión SSH se cierra entonces y la sesión
de terminal comienza a través de UDP.
Si el cliente cambia de dirección IP, el servidor comenzará a enviar al cliente en la nueva dirección IP en unos pocos segundos.
Para funcionar, Mosh requiere que se pasen datagramas UDP entre el cliente
y el servidor. Por defecto, mosh usa un número de puerto entre 60000 y
61000, pero el usuario puede seleccionar un puerto particular con la opción
-p. Tenga en cuenta que la opción -p no tiene efecto sobre el puerto usado
por SSH.
Una nota sobre las banderas del compilador: Mosh es código sensible a la
seguridad. Al hacer compilaciones automatizadas para un paquete binario,
recomendamos pasar la opción --enable-compile-warnings=error a
./configure. En GNU/Linux con g++ o clang++, el paquete debería
compilarse limpiamente con -Werror. Informe de un error si no es así.
Cuando está disponible, Mosh se compila con una variedad de banderas de
endurecimiento binario como -fstack-protector-all, -D_FORTIFY_SOURCE=2,
etc. Estas proporcionan seguridad proactiva contra la posibilidad de un
error de corrupción de memoria en Mosh o en una de las bibliotecas que
utiliza. Para una lista completa de banderas, busque HARDEN en
configure.ac. El script configure detecta qué banderas son soportadas
por su compilador y las habilita automáticamente. Para deshabilitar esta
detección, pase --disable-hardening a ./configure. Informe de un error
si tiene problemas con la configuración predeterminada; nos gustaría que la
mayor cantidad posible de usuarios ejecuten una configuración tan segura
como sea posible.
Mosh incluye una configuración de optimización predeterminada de -O2.
Algunos distribuidores han preguntado sobre cambiarla a -Os (que hace que
un compilador prefiera optimizaciones de espacio sobre optimizaciones de
tiempo). Hemos realizado pruebas comparativas con el programa incluido
src/examples/benchmark para probar esto. Los resultados son que -O2 es
un 40% más rápido que -Os con g++ 4.6 en GNU/Linux, y un 16% más rápido
que -Os con clang++ 3.1 en Mac OS X. En ambos casos, -Os produjo un
binario más pequeño (hasta un 40%, ahorrando casi 200 kilobytes en disco).
Aunque Mosh no es especialmente intensivo en CPU y permanece inactivo la
mayor parte del tiempo cuando el usuario no está escribiendo, creemos que
los resultados sugieren que -O2 (el valor predeterminado) es preferible.
Nuestro empaquetado en Debian y Fedora presenta Mosh como un paquete único. Mosh tiene una dependencia de Perl que solo es necesaria para el uso del cliente. Para algunas plataformas, puede tener sentido tener paquetes separados de mosh-server y mosh-client para permitir el uso de mosh-server sin Perl.
Para comenzar a contribuir a Mosh, instale las siguientes dependencias:
Debian, Subsistema de Windows para Linux:
$ sudo apt install -y build-essential protobuf-compiler \
libprotobuf-dev pkg-config libutempter-dev zlib1g-dev libncurses5-dev \
libssl-dev bash-completion tmux less
Fedora, RHEL:
$ sudo dnf group install development-tools
$ sudo dnf install automake protobuf-compiler protobuf-devel libutempter-devel \
zlib-ng-compat-devel ncurses-devel openssl-devel bash-completion tmux less \
perl-diagnostics
MacOS:
$ brew install protobuf automake
Una vez que haya bifurcado el repositorio, ejecute lo siguiente para compilar y probar Mosh:
$ ./autogen.sh
$ ./configure
$ make
$ make check
Mosh soporta la producción de informes de cobertura de código mediante
pruebas, pero esta característica está deshabilitada por defecto. Para
habilitarla, asegúrese de que lcov esté instalado en su sistema. Luego,
configure y ejecute las pruebas:
$ ./configure --enable-code-coverage
$ make check-code-coverage
Esto ejecutará todas las pruebas y producirá un informe de cobertura en formato HTML que se puede abrir con su navegador favorito. Idealmente, el código recién agregado debería aspirar a una cobertura de prueba incremental del 90% (o mejor).
Sitio web de Mosh:
Lista de correo [email protected]:
Lista de correo [email protected]:
Canal #mosh en Libera Chat