
Application de terminal distant prenant en charge la connectivité intermittente, l'itinérance IP et l'écho local spéculatif pour les liaisons à haute latence. Utilise le chiffrement AES-128 sur UDP avec une authentification basée sur SSH.
Mosh est une application terminal distante qui prend en charge la connectivité intermittente, permet l’itinérance, et offre un écho local spéculatif ainsi que l’édition de ligne des frappes utilisateur.
Son objectif est de prendre en charge les utilisations interactives typiques de SSH, avec en plus :
Mosh maintient la session active si le client se met en veille et se réveille plus tard, ou perd temporairement sa connexion Internet.
Mosh permet au client et au serveur de « roaming » et de changer d’adresse IP tout en conservant la connexion active. Contrairement à SSH, Mosh peut être utilisé lors de la commutation entre réseaux Wi-Fi, ou du Wi-Fi vers les données cellulaires ou Ethernet filaire.
Le client Mosh exécute un modèle prédictif du comportement du serveur en arrière-plan et tente de deviner intelligemment comment chaque frappe affectera l’état de l’écran. Lorsqu’il est confiant dans ses prédictions, il les affiche à l’utilisateur en attendant confirmation du serveur. La plupart des frappes et des utilisations des touches fléchées gauche et droite peuvent être échoées immédiatement.
En conséquence, Mosh est utilisable sur des liaisons à haute latence, par exemple sur une connexion de données cellulaires ou un Wi-Fi capricieux. Contrairement aux tentatives précédentes de modes d’écho local dans d’autres protocoles, Mosh fonctionne correctement avec les applications plein écran telles que emacs, vi, alpine et irssi, et récupère automatiquement des erreurs de prédiction occasionnelles en un RTT. Sur les liaisons à haute latence, Mosh souligne ses prédictions tant qu’elles sont en attente et supprime le soulignement lorsqu’elles sont confirmées par le serveur.
Mosh ne prend pas en charge le transfert X ni les utilisations non interactives de SSH, y compris le transfert de ports.
Mosh ajuste sa fréquence d’images afin de ne pas remplir les files d’attente réseau sur les liaisons lentes, de sorte que « Control-C » fonctionne toujours en un RTT pour arrêter un processus incontrôlé.
Mosh avertit l’utilisateur lorsqu’il n’a pas eu de nouvelles du serveur depuis un certain temps.
Mosh prend en charge les liaisons avec pertes qui perdent une fraction significative de leurs paquets.
Mosh gère certains cas limites Unicode mieux que SSH et les émulateurs de terminal existants seuls, mais nécessite un environnement UTF-8 pour fonctionner.
Mosh exploite SSH pour établir la connexion et authentifier les utilisateurs. Mosh ne contient aucun code privilégié (root).
Le site Web de Mosh contient des informations sur les paquets pour de nombreux systèmes d’exploitation, ainsi que des instructions pour compiler à partir des sources.
Notez que mosh-client reçoit une clé de session AES comme variable d’environnement. Si vous portez Mosh vers un nouveau système d’exploitation, veuillez vous assurer que les variables d’environnement d’un processus en cours d’exécution ne sont pas lisibles par d’autres utilisateurs. Nous avons confirmé que c’est le cas sous GNU/Linux, OS X et FreeBSD.
Le binaire mosh-client doit exister sur la machine de l’utilisateur, et le binaire mosh-server sur la machine distante.
L’utilisateur exécute :
$ mosh [utilisateur@]hôte
Si les binaires mosh-client ou mosh-server se trouvent en dehors du $PATH de l’utilisateur, mosh accepte les arguments --client=CHEMIN et --server=CHEMIN pour spécifier des emplacements alternatifs. Plus d’options sont documentées dans la page de manuel mosh(1).
Il y a d’autres exemples et une FAQ sur le site Web de Mosh.
Le programme mosh utilisera SSH pour se connecter à utilisateur@hôte afin d’établir la connexion. SSH peut demander un mot de passe à l’utilisateur ou utiliser l’authentification par clé publique pour se connecter.
À partir de là, mosh exécute le processus mosh-server (en tant qu’utilisateur) sur la machine serveur. Le processus serveur écoute sur un port UDP élevé et envoie son numéro de port ainsi qu’une clé secrète AES-128 au client via SSH. La connexion SSH est ensuite fermée et la session terminal commence via UDP.
Si le client change d’adresse IP, le serveur commencera à envoyer vers la nouvelle adresse IP en quelques secondes.
Pour fonctionner, Mosh nécessite que des datagrammes UDP soient échangés entre le client et le serveur. Par défaut, mosh utilise un numéro de port entre 60000 et 61000, mais l’utilisateur peut sélectionner un port particulier avec l’option -p. Veuillez noter que l’option -p n’a aucun effet sur le port utilisé par SSH.
Une note sur les drapeaux du compilateur : Mosh est un code sensible à la sécurité. Lors de la construction automatisée pour un paquet binaire, nous recommandons de passer l’option --enable-compile-warnings=error à ./configure. Sous GNU/Linux avec g++ ou clang++, le paquet devrait se compiler proprement avec -Werror. Veuillez signaler un bogue si ce n’est pas le cas.
Là où c’est disponible, Mosh se compile avec une variété de drapeaux de durcissement binaire tels que -fstack-protector-all, -D_FORTIFY_SOURCE=2, etc. Ceux-ci fournissent une sécurité proactive contre la possibilité d’un bogue de corruption mémoire dans Mosh ou l’une des bibliothèques qu’il utilise. Pour une liste complète des drapeaux, recherchez HARDEN dans configure.ac. Le script configure détecte quels drapeaux sont supportés par votre compilateur et les active automatiquement. Pour désactiver cette détection, passez --disable-hardening à ./configure. Veuillez signaler un bogue si vous rencontrez des problèmes avec les réglages par défaut ; nous aimerions que le plus grand nombre d’utilisateurs possible exécute une configuration aussi sécurisée que possible.
Mosh est livré avec un réglage d’optimisation par défaut de -O2. Certains distributeurs ont demandé à passer à -Os (ce qui fait préférer au compilateur les optimisations d’espace aux optimisations de temps). Nous avons effectué des benchmarks avec le programme src/examples/benchmark inclus pour tester cela. Les résultats montrent que -O2 est 40% plus rapide que -Os avec g++ 4.6 sous GNU/Linux, et 16% plus rapide que -Os avec clang++ 3.1 sous Mac OS X. Dans les deux cas, -Os produit un binaire plus petit (jusqu’à 40%, économisant près de 200 kilo-octets sur disque). Bien que Mosh ne soit pas particulièrement gourmand en CPU et reste généralement inactif lorsque l’utilisateur ne tape pas, nous pensons que les résultats suggèrent que -O2 (le défaut) est préférable.
Nos paquets Debian et Fedora présentent Mosh comme un paquet unique. Mosh a une dépendance Perl qui n’est nécessaire que pour l’utilisation client. Pour certaines plates-formes, il peut être judicieux d’avoir des paquets mosh-server et mosh-client séparés pour permettre l’utilisation de mosh-server sans Perl.
Pour commencer à contribuer à Mosh, installez les dépendances suivantes :
Debian, Sous-système Windows pour 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
Une fois que vous avez forké le dépôt, exécutez les commandes suivantes pour compiler et tester Mosh :
$ ./autogen.sh
$ ./configure
$ make
$ make check
Mosh supporte la production de rapports de couverture de code par les tests, mais cette fonctionnalité est désactivée par défaut. Pour l’activer, assurez-vous que lcov est installé sur votre système. Ensuite, configurez et exécutez les tests :
$ ./configure --enable-code-coverage
$ make check-code-coverage
Cela exécutera tous les tests et produira un rapport de couverture au format HTML qui peut être ouvert avec votre navigateur préféré. Idéalement, le code nouvellement ajouté devrait viser une couverture de test incrémentielle de 90% (ou mieux).
Site Web de Mosh :
Liste de diffusion [email protected] :
Liste de diffusion [email protected] :
Canal #mosh sur Libera Chat