
Удалённое терминальное приложение, поддерживающее прерывистое соединение, роуминг IP и спекулятивное локальное эхо для каналов с высокой задержкой. Использует шифрование AES-128 через UDP с аутентификацией на основе SSH.
Mosh — это удаленное терминальное приложение, поддерживающее прерывистое соединение, позволяющее роуминг и обеспечивающее спекулятивный локальный эхо-вывод и редактирование строк вводимых пользователем символов.
Он нацелен на поддержку типичных интерактивных применений SSH, а также:
Mosh сохраняет сеанс активным, если клиент переходит в спящий режим и просыпается позже, или временно теряет подключение к Интернету.
Mosh позволяет клиенту и серверу «роуминговать» и менять IP-адреса, сохраняя соединение активным. В отличие от SSH, Mosh можно использовать при переключении между сетями Wi-Fi, с Wi-Fi на мобильные данные или на проводной Ethernet.
Клиент Mosh запускает прогностическую модель поведения сервера в фоновом режиме и пытается разумно угадать, как каждое нажатие клавиши повлияет на состояние экрана. Когда он уверен в своих прогнозах, он показывает их пользователю, ожидая подтверждения от сервера. Большинство наборов текста и использования стрелок влево и вправо могут быть отображены немедленно.
В результате Mosh пригоден для использования на соединениях с высокой задержкой, например, по мобильной сети данных или нестабильному Wi-Fi. В отличие от предыдущих попыток режимов локального эха в других протоколах, Mosh корректно работает с полноэкранными приложениями, такими как emacs, vi, alpine и irssi, и автоматически восстанавливается после случайных ошибок прогноза в пределах одного RTT. На линиях с высокой задержкой Mosh подчеркивает свои прогнозы, пока они не подтверждены, и убирает подчеркивание, когда они подтверждаются сервером.
Mosh не поддерживает X-форвардинг или неинтерактивное использование SSH, включая перенаправление портов.
Mosh регулирует частоту кадров, чтобы не переполнять сетевые очереди на медленных каналах, поэтому «Control-C» всегда срабатывает в пределах RTT для остановки вышедшего из-под контроля процесса.
Mosh предупреждает пользователя, если он долго не получает сообщений от сервера.
Mosh поддерживает каналы с потерями, теряющие значительную часть пакетов.
Mosh лучше обрабатывает некоторые крайние случаи Unicode, чем SSH и существующие эмуляторы терминалов по отдельности, но требует окружения UTF-8 для работы.
Mosh использует SSH для установки соединения и аутентификации пользователей. Mosh не содержит привилегированного (root) кода.
Веб-сайт Mosh содержит информацию о пакетах для многих операционных систем, а также инструкции по сборке из исходных кодов.
Обратите внимание, что mosh-client получает ключ сеанса AES в виде переменной
окружения. Если вы портируете Mosh на новую операционную систему, убедитесь,
что переменные окружения запущенного процесса не читаются другими
пользователями. Мы подтвердили, что это так на GNU/Linux, OS X и
FreeBSD.
Исполняемый файл mosh-client должен находиться на машине пользователя, а
mosh-server — на удаленном хосте.
Пользователь запускает:
$ mosh [user@]host
Если исполняемые файлы mosh-client или mosh-server находятся за пределами
$PATH пользователя, mosh принимает аргументы --client=ПУТЬ и --server=ПУТЬ для
выбора альтернативных расположений. Дополнительные опции описаны на странице руководства mosh(1).
На веб-сайте Mosh есть больше примеров и FAQ.
Программа mosh использует SSH для подключения к user@host для установки соединения.
SSH может запросить у пользователя пароль или использовать аутентификацию
по открытому ключу для входа в систему.
После этого mosh запускает процесс mosh-server (от имени пользователя)
на серверной машине. Серверный процесс прослушивает высокий UDP-порт
и отправляет свой номер порта и секретный ключ AES-128 обратно
клиенту через SSH. Затем SSH-соединение закрывается, и
сеанс терминала начинается по UDP.
Если клиент меняет IP-адрес, сервер начинает отправлять данные на новый IP-адрес в течение нескольких секунд.
Для работы Mosh требуется передача UDP-датаграмм между клиентом
и сервером. По умолчанию mosh использует номер порта от 60000 до
61000, но пользователь может выбрать конкретный порт с помощью опции -p.
Обратите внимание, что опция -p не влияет на порт, используемый SSH.
Примечание о флагах компилятора: Mosh — это код, чувствительный к безопасности. При автоматической
сборке для бинарного пакета мы рекомендуем передавать опцию
--enable-compile-warnings=error в ./configure. На GNU/Linux с
g++ или clang++ пакет должен чисто собираться с
-Werror. Пожалуйста, сообщите об ошибке, если это не так.
Там, где это возможно, Mosh собирается с различными флагами бинарного hardening,
такими как -fstack-protector-all, -D_FORTIFY_SOURCE=2 и т. д. Они
обеспечивают активную безопасность на случай ошибки повреждения памяти
в Mosh или одной из используемых им библиотек. Полный список флагов можно найти
в configure.ac, выполнив поиск HARDEN. Скрипт configure
обнаруживает, какие флаги поддерживаются вашим компилятором, и включает
их автоматически. Чтобы отключить это обнаружение, передайте
--disable-hardening в ./configure. Пожалуйста, сообщите об ошибке, если у вас
возникли проблемы с настройками по умолчанию; мы хотели бы, чтобы как можно больше
пользователей работали в максимально безопасной конфигурации.
Mosh поставляется с настройкой оптимизации по умолчанию -O2. Некоторые
дистрибьюторы спрашивали об изменении этого на -Os (что заставляет
компилятор предпочитать оптимизацию размера оптимизации скорости). Мы
проводили бенчмарки с помощью встроенной программы src/examples/benchmark,
чтобы проверить это. Результаты показывают, что -O2 на 40% быстрее, чем -Os с g++ 4.6
на GNU/Linux, и на 16% быстрее, чем -Os с clang++ 3.1 на Mac OS
X. В обоих случаях -Os действительно создавал меньший бинарник (до 40%,
экономя почти 200 килобайт на диске). Хотя Mosh не требует особенно
интенсивных вычислений и в основном простаивает, когда пользователь не печатает, мы
считаем, что результаты говорят в пользу -O2 (по умолчанию).
Наша упаковка для Debian и Fedora представляет Mosh как единый пакет. Mosh имеет зависимость от Perl, которая требуется только для использования клиентом. Для некоторых платформ может иметь смысл создать отдельные пакеты mosh-server и mosh-client, чтобы использовать mosh-server без Perl.
Чтобы начать вносить вклад в Mosh, установите следующие зависимости:
Debian, Подсистема Windows для 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
После того как вы сделали форк репозитория, выполните следующее для сборки и тестирования Mosh:
$ ./autogen.sh
$ ./configure
$ make
$ make check
Mosh поддерживает создание отчетов о покрытии кода тестами, но эта возможность
отключена по умолчанию. Чтобы включить её, убедитесь, что lcov установлен в вашей
системе. Затем настройте и запустите тесты:
$ ./configure --enable-code-coverage
$ make check-code-coverage
Это запустит все тесты и создаст отчет о покрытии в формате HTML, который можно открыть в вашем любимом браузере. Желательно, чтобы вновь добавленный код стремился к 90% (или лучше) инкрементальному тестовому покрытию.
Веб-сайт Mosh:
Список рассылки [email protected]:
Список рассылки [email protected]:
Канал #mosh на Libera Chat