
Aplicação de terminal remoto que suporta conectividade intermitente, roaming de IP e eco local especulativo para links de alta latência. Usa criptografia AES-128 sobre UDP com autenticação baseada em SSH.
Mosh é uma aplicação de terminal remoto que suporta conectividade intermitente, permite roaming e fornece eco local especulativo e edição de linha das teclas do usuário.
Ele visa suportar os usos interativos típicos do SSH, além de:
Mosh mantém a sessão ativa se o cliente dormir e acordar mais tarde, ou perder temporariamente sua conexão com a Internet.
Mosh permite que o cliente e o servidor "roamem" (mudem de endereço IP) enquanto mantêm a conexão ativa. Ao contrário do SSH, o Mosh pode ser usado enquanto alterna entre redes Wi-Fi ou de Wi-Fi para dados celulares para Ethernet com fio.
O cliente Mosh executa um modelo preditivo do comportamento do servidor em segundo plano e tenta adivinhar inteligentemente como cada tecla pressionada afetará o estado da tela. Quando está confiante em suas previsões, ele as mostra ao usuário enquanto aguarda a confirmação do servidor. A maioria das digitações e usos das teclas de seta para a esquerda e para a direita podem ser ecoados imediatamente.
Como resultado, o Mosh é utilizável em links de alta latência, por exemplo, em uma conexão de dados celular ou Wi-Fi instável. Diferentemente de tentativas anteriores de modos de eco local em outros protocolos, o Mosh funciona corretamente com aplicações de tela cheia como emacs, vi, alpine e irssi, e se recupera automaticamente de erros de previsão ocasionais dentro de um RTT. Em links de alta latência, o Mosh sublinha suas previsões enquanto elas estão pendentes e remove o sublinhado quando são confirmadas pelo servidor.
Mosh não suporta encaminhamento X ou os usos não interativos do SSH, incluindo encaminhamento de porta.
Mosh ajusta sua taxa de quadros para não sobrecarregar as filas de rede em links lentos, então "Control-C" sempre funciona dentro de um RTT para interromper um processo descontrolado.
Mosh avisa o usuário quando não recebe notícias do servidor há algum tempo.
Mosh suporta links com perda que perdem uma fração significativa de seus pacotes.
Mosh lida melhor com alguns casos extremos de Unicode do que o SSH e emuladores de terminal existentes por si só, mas exige um ambiente UTF-8 para ser executado.
Mosh utiliza o SSH para configurar a conexão e autenticar usuários. O Mosh não contém nenhum código privilegiado (root).
O site do Mosh possui informações sobre pacotes para muitos sistemas operacionais, bem como instruções para compilar a partir do código-fonte.
Observe que o mosh-client recebe uma chave de sessão AES como uma variável
de ambiente. Se você estiver portando o Mosh para um novo sistema
operacional, certifique-se de que as variáveis de ambiente de um processo em
execução não sejam legíveis por outros usuários. Confirmamos que este é o
caso no GNU/Linux, OS X e FreeBSD.
O binário mosh-client deve existir na máquina do usuário, e o binário
mosh-server no host remoto.
O usuário executa:
$ mosh [usuário@]host
Se os binários mosh-client ou mosh-server estiverem fora do $PATH do
usuário, o mosh aceita os argumentos --client=CAMINHO e
--server=CAMINHO para selecionar locais alternativos. Mais opções estão
documentadas na página de manual mosh(1).
Existem mais exemplos e uma FAQ no site do Mosh.
O programa mosh fará SSH para usuario@host para estabelecer a conexão.
O SSH pode solicitar uma senha ao usuário ou usar autenticação de chave
pública para fazer login.
A partir deste ponto, o mosh executa o processo mosh-server (como o
usuário) na máquina servidora. O processo servidor escuta em uma porta UDP
alta e envia seu número de porta e uma chave secreta AES-128 de volta ao
cliente via SSH. A conexão SSH é então encerrada e a sessão do terminal
começa via UDP.
Se o cliente mudar de endereço IP, o servidor começará a enviar para o cliente no novo endereço IP em alguns segundos.
Para funcionar, o Mosh requer que datagramas UDP sejam passados entre
cliente e servidor. Por padrão, o mosh usa um número de porta entre 60000
e 61000, mas o usuário pode selecionar uma porta específica com a opção -p.
Observe que a opção -p não tem efeito sobre a porta usada pelo SSH.
Uma nota sobre flags do compilador: Mosh é um código sensível à segurança.
Ao criar compilações automatizadas para um pacote binário, recomendamos
passar a opção --enable-compile-warnings=error para ./configure. No
GNU/Linux com g++ ou clang++, o pacote deve compilar limpo com
-Werror. Por favor, relate um bug se não compilar.
Onde disponível, o Mosh compila com uma variedade de flags de hardening
binário como -fstack-protector-all, -D_FORTIFY_SOURCE=2, etc. Estas
fornecem segurança proativa contra a possibilidade de um bug de corrupção de
memória no Mosh ou em uma das bibliotecas que ele usa. Para uma lista completa
de flags, procure por HARDEN em configure.ac. O script configure detecta
quais flags são suportadas pelo seu compilador e as ativa automaticamente.
Para desativar essa detecção, passe --disable-hardening para ./configure.
Por favor, relate um bug se você tiver problemas com as configurações padrão;
gostaríamos que o maior número possível de usuários estivesse executando uma
configuração tão segura quanto possível.
Mosh vem com uma configuração de otimização padrão de -O2. Alguns
distribuidores perguntaram sobre mudar isso para -Os (que faz o compilador
preferir otimizações de espaço em vez de tempo). Nós fizemos benchmarks com
o programa incluído src/examples/benchmark para testar isso. Os resultados
são que -O2 é 40% mais rápido que -Os com g++ 4.6 no GNU/Linux, e 16%
mais rápido que -Os com clang++ 3.1 no Mac OS X. Em ambos os casos, -Os
produziu um binário menor (em até 40%, economizando quase 200 kilobytes em
disco). Embora o Mosh não seja especialmente intensivo em CPU e fique
principalmente ocioso quando o usuário não está digitando, achamos que os
resultados sugerem que -O2 (o padrão) é preferível.
Nossa empacotamento para Debian e Fedora apresenta o Mosh como um único pacote. O Mosh tem uma dependência Perl que é necessária apenas para uso do cliente. Para algumas plataformas, pode fazer sentido ter pacotes separados mosh-server e mosh-client para permitir o uso do mosh-server sem Perl.
Para começar a contribuir com o Mosh, instale as seguintes dependências:
Debian, Windows Subsystem for 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
Depois de fazer o fork do repositório, execute o seguinte para compilar e testar o Mosh:
$ ./autogen.sh
$ ./configure
$ make
$ make check
Mosh suporta a produção de relatórios de cobertura de código por testes, mas
esse recurso está desabilitado por padrão. Para ativá-lo, certifique-se de que
o lcov esteja instalado no seu sistema. Então, configure e execute os testes:
$ ./configure --enable-code-coverage
$ make check-code-coverage
Isso executará todos os testes e produzirá um relatório de cobertura em HTML que pode ser aberto com seu navegador favorito. Idealmente, o código recém-adicionado deve buscar 90% (ou mais) de cobertura de teste incremental.
Site do Mosh:
Lista de discussão [email protected]:
Lista de discussão [email protected]:
Canal #mosh no Libera Chat