
Applicazione per terminale remoto che supporta connettività intermittente, roaming IP e echo locale speculativo per collegamenti ad alta latenza. Utilizza crittografia AES-128 su UDP con autenticazione basata su SSH.
Mosh è un'applicazione terminale remota che supporta la connettività intermittente, permette il roaming e fornisce eco locale speculativa e modifica delle righe di digitazione dell'utente.
Mira a supportare gli usi interattivi tipici di SSH, più:
Mosh mantiene la sessione attiva se il client va in standby e si riattiva in seguito, o perde temporaneamente la connessione Internet.
Mosh consente al client e al server di "vagare" e cambiare indirizzi IP, mantenendo attiva la connessione. A differenza di SSH, Mosh può essere utilizzato durante il passaggio tra reti Wi-Fi o dal Wi-Fi ai dati cellulari all'Ethernet cablato.
Il client Mosh esegue un modello predittivo del comportamento del server in background e cerca di indovinare in modo intelligente come ogni tasto premuto influenzerà lo stato dello schermo. Quando è sicuro delle sue previsioni, le mostra all'utente in attesa della conferma dal server. La maggior parte della digitazione e l'uso dei tasti freccia sinistra e destra possono essere rimandati immediatamente.
Di conseguenza, Mosh è utilizzabile su collegamenti ad alta latenza, ad es. su una connessione dati cellulare o Wi-Fi instabile. A differenza dei precedenti tentativi di modalità eco locale in altri protocolli, Mosh funziona correttamente con applicazioni a schermo intero come emacs, vi, alpine e irssi, e recupera automaticamente da occasionali errori di previsione entro un RTT. Su collegamenti ad alta latenza, Mosh sottolinea le sue previsioni mentre sono in sospeso e rimuove la sottolineatura quando vengono confermate dal server.
Mosh non supporta il forwarding X o gli usi non interattivi di SSH, incluso il forwarding di porta.
Mosh regola il suo frame rate per non riempire le code di rete su collegamenti lenti, quindi "Control-C" funziona sempre entro un RTT per fermare un processo fuori controllo.
Mosh avvisa l'utente quando non ha notizie dal server da un po'.
Mosh supporta collegamenti con perdita che perdono una frazione significativa dei loro pacchetti.
Mosh gestisce alcuni casi limite Unicode meglio di SSH e degli attuali emulatori di terminale da soli, ma richiede un ambiente UTF-8 per funzionare.
Mosh sfrutta SSH per impostare la connessione e autenticare gli utenti. Mosh non contiene codice privilegiato (root).
Il sito web di Mosh contiene informazioni sui pacchetti per molti sistemi operativi, oltre alle istruzioni per la compilazione dal codice sorgente.
Nota che mosh-client riceve una chiave di sessione AES come variabile
d'ambiente. Se stai portando Mosh su un nuovo sistema operativo, assicurati
che le variabili d'ambiente di un processo in esecuzione non siano leggibili da altri
utenti. Abbiamo confermato che questo è il caso su GNU/Linux, OS X e
FreeBSD.
Il binario mosh-client deve esistere sulla macchina dell'utente e il
binario mosh-server sull'host remoto.
L'utente esegue:
$ mosh [utente@]host
Se i binari mosh-client o mosh-server si trovano al di fuori del
$PATH dell'utente, mosh accetta gli argomenti --client=PERCORSO e --server=PERCORSO per
selezionare posizioni alternative. Ulteriori opzioni sono documentate nella pagina di manuale mosh(1).
Ci sono altri esempi e una FAQ sul sito web di Mosh.
Il programma mosh utilizzerà SSH per connettersi a utente@host per stabilire la connessione.
SSH potrebbe chiedere all'utente una password o utilizzare l'autenticazione
a chiave pubblica per accedere.
Da questo punto, mosh esegue il processo mosh-server (come utente)
sulla macchina server. Il processo server ascolta su una porta UDP alta
e invia il suo numero di porta e una chiave segreta AES-128 di nuovo al
client tramite SSH. La connessione SSH viene quindi chiusa e la
sessione terminale inizia tramite UDP.
Se il client cambia indirizzo IP, il server inizierà a inviare al client sul nuovo indirizzo IP entro pochi secondi.
Per funzionare, Mosh richiede che i datagrammi UDP vengano passati tra client
e server. Per impostazione predefinita, mosh utilizza un numero di porta compreso tra 60000 e
61000, ma l'utente può selezionare una porta particolare con l'opzione -p.
Si noti che l'opzione -p non ha effetto sulla porta utilizzata da SSH.
Una nota sui flag del compilatore: Mosh è codice sensibile alla sicurezza. Quando si realizzano
build automatizzate per un pacchetto binario, consigliamo di passare l'opzione
--enable-compile-warnings=error a ./configure. Su GNU/Linux con
g++ o clang++, il pacchetto dovrebbe compilare correttamente con
-Werror. Segnala un bug se non è così.
Dove disponibile, Mosh viene compilato con una varietà di flag di hardening binario
come -fstack-protector-all, -D_FORTIFY_SOURCE=2, ecc. Questi
forniscono una sicurezza proattiva contro la possibilità di un bug di corruzione
della memoria in Mosh o in una delle librerie che utilizza. Per un elenco
completo dei flag, cerca HARDEN in configure.ac. Lo script configure
rileva quali flag sono supportati dal tuo compilatore e li abilita
automaticamente. Per disabilitare questo rilevamento, passa
--disable-hardening a ./configure. Segnala un bug se hai
problemi con le impostazioni predefinite; vorremmo che il maggior numero possibile di utenti
eseguisse una configurazione il più sicura possibile.
Mosh viene fornito con un'impostazione di ottimizzazione predefinita di -O2. Alcuni
distributori hanno chiesto di cambiarla in -Os (che fa sì che un
compilatore preferisca le ottimizzazioni di spazio a quelle di tempo). Abbiamo
eseguito benchmark con il programma src/examples/benchmark incluso per testare
questo. I risultati sono che -O2 è più veloce del 40% rispetto a -Os con g++ 4.6
su GNU/Linux, e più veloce del 16% rispetto a -Os con clang++ 3.1 su Mac OS
X. In entrambi i casi, -Os ha prodotto un binario più piccolo (fino al 40%,
risparmiando quasi 200 kilobyte su disco). Sebbene Mosh non sia particolarmente
intensivo in termini di CPU e sia per lo più inattivo quando l'utente non digita, riteniamo
che i risultati suggeriscano che -O2 (l'impostazione predefinita) sia preferibile.
Il nostro packaging Debian e Fedora presenta Mosh come un unico pacchetto. Mosh ha una dipendenza Perl che è richiesta solo per l'uso client. Per alcune piattaforme, potrebbe avere senso avere pacchetti separati mosh-server e mosh-client per consentire l'uso di mosh-server senza Perl.
Per iniziare a contribuire a Mosh, installa le seguenti dipendenze:
Debian, Sottosistema Windows per 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 volta che hai effettuato il fork del repository, esegui quanto segue per compilare e testare Mosh:
$ ./autogen.sh
$ ./configure
$ make
$ make check
Mosh supporta la produzione di report di copertura del codice tramite test, ma questa funzionalità è
disabilitata per impostazione predefinita. Per abilitarla, assicurati che lcov sia installato sul tuo
sistema. Quindi, configura ed esegui i test:
$ ./configure --enable-code-coverage
$ make check-code-coverage
Questo eseguirà tutti i test e produrrà un report di copertura in formato HTML che può essere aperto con il tuo browser preferito. Idealmente, il codice appena aggiunto dovrebbe puntare a una copertura di test incrementale del 90% (o superiore).
Sito web di Mosh:
Mailing list [email protected]:
Mailing list [email protected]:
Canale #mosh su Libera Chat