
断続的な接続、IPローミング、高遅延リンク向けの投機的なローカルエコーをサポートするリモートターミナルアプリケーション。SSHベースの認証を使用し、UDP上でAES-128暗号化を採用。
Mosh は、断続的な接続をサポートし、ローミングを可能にし、投機的なローカルエコーとユーザーのキーストロークの行編集を提供するリモートターミナルアプリケーションです。
SSH の典型的な対話的用途をサポートすることに加えて、以下を目指しています。
Mosh は、クライアントがスリープして後で起きたり、インターネット接続を一時的に失った場合でも、セッションを維持します。
Mosh は、接続を維持しながら、クライアントとサーバーが IP アドレスを「ローミング」して変更することを可能にします。SSH とは異なり、Mosh は Wi-Fi ネットワーク間の切り替えや、Wi-Fi からセルラーデータ、有線イーサネットへの切り替え中に使用できます。
Mosh クライアントはサーバーの動作の予測モデルをバックグラウンドで実行し、各キーストロークが画面の状態にどのように影響するかをインテリジェントに推測しようとします。予測に自信がある場合、サーバーからの確認を待っている間にユーザーに表示します。ほとんどのタイピングや左/右矢印キーの使用は即座にエコーバックされます。
その結果、Mosh は高レイテンシリンク(セルラーデータ接続や不安定な Wi-Fi など)でも使用可能です。他のプロトコルにおけるローカルエコーモードの以前の試みとは異なり、Mosh は emacs、vi、alpine、irssi などのフルスクリーンアプリケーションで正しく動作し、RTT 内で予測エラーから自動的に回復します。高レイテンシリンクでは、Mosh は未確認の予測に下線を引き、サーバーによって確認されると下線を削除します。
Mosh は X 転送や、ポート転送を含む SSH の非対話的な用途をサポートしません。
Mosh は、低速リンクでネットワークキューを満たさないようにフレームレートを調整するため、"Control-C" は常に RTT 内で暴走プロセスを停止します。
Mosh は、しばらくサーバーから応答がない場合にユーザーに警告します。
Mosh は、パケットのかなりの割合を失う損失の多いリンクをサポートします。
Mosh は、SSH や既存のターミナルエミュレータ単体よりも一部の Unicode エッジケースを適切に処理しますが、動作には 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=PATH および --server=PATH 引数を受け付けて代替の場所を指定できます。その他のオプションは mosh(1) マニュアルページに記載されています。
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 はセキュリティに敏感なコードです。バイナリパッケージの自動ビルドを行う場合、./configure に --enable-compile-warnings=error オプションを渡すことを推奨します。g++ または clang++ を使用する GNU/Linux では、パッケージは -Werror でクリーンにビルドされるはずです。そうでない場合はバグを報告してください。
利用可能な場合、Mosh は -fstack-protector-all、-D_FORTIFY_SOURCE=2 などのさまざまなバイナリハードニングフラグを使用してビルドされます。これらは、Mosh またはそれが使用するライブラリのメモリ破損バグの可能性に対して積極的なセキュリティを提供します。フラグの完全なリストについては、configure.ac 内の HARDEN を検索してください。configure スクリプトは、コンパイラがサポートするフラグを検出し、自動的に有効にします。この検出を無効にするには、./configure に --disable-hardening を渡します。デフォルト設定で問題が発生した場合はバグを報告してください。できるだけ多くのユーザーが可能な限り安全な設定で実行できるようにしたいと考えています。
Mosh はデフォルトの最適化設定として -O2 を提供しています。一部のディストリビューターから、これを -Os(コンパイラに時間最適化よりも空間最適化を優先させる)に変更することについて質問がありました。含まれている src/examples/benchmark プログラムを使用してこれをベンチマークしました。結果は、GNU/Linux 上の g++ 4.6 では -O2 が -Os より 40% 高速であり、Mac OS X 上の clang++ 3.1 では -Os より 16% 高速でした。どちらの場合も、-Os はバイナリサイズが小さくなりました(最大 40%、ディスク上で約 200 キロバイト節約)。Mosh は特に CPU 負荷が高くなく、ユーザーがタイピングしていないときはほとんどアイドル状態ですが、結果はデフォルトの -O2 が好ましいことを示唆しています。
Debian および Fedora のパッケージングでは、Mosh を単一のパッケージとして提供しています。Mosh にはクライアント使用にのみ必要な Perl 依存関係があります。一部のプラットフォームでは、mosh-server 使用時に Perl を必要としないように、別々の mosh-server パッケージと mosh-client パッケージを持つことが合理的かもしれません。
Mosh への貢献を始めるには、以下の依存関係をインストールしてください:
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
リポジトリをフォークしたら、以下を実行して Mosh をビルドおよびテストします:
$ ./autogen.sh
$ ./configure
$ make
$ make check
Mosh はテストによるコードカバレッジレポートの生成をサポートしていますが、この機能はデフォルトでは無効になっています。有効にするには、システムに lcov がインストールされていることを確認してください。その後、設定してテストを実行します:
$ ./configure --enable-code-coverage
$ make check-code-coverage
これによりすべてのテストが実行され、お気に入りのブラウザで開くことができる HTML 形式のカバレッジレポートが生成されます。理想的には、新しく追加されたコードは 90%(またはそれ以上)のインクリメンタルテストカバレッジを目指すべきです。
Mosh ウェブサイト:
[email protected] メーリングリスト:
[email protected] メーリングリスト:
Libera Chat 上の #mosh チャンネル