Mosh について
Mosh(Mobile Shell)は不安定で断続的なネットワーク接続に最適化されたSSHの代替リモートシェルです。IP アドレスローミング、接続復旧、スマートなキーボードエコー機能をサポートしています。
主な機能
- 01ネットワーク変化または IP アドレス切り替え時に自動的にシェルセッションを再開
- 02高レイテンシまたはロスの多いネットワーク上でキーボード応答と表示更新を最適化
- 03カスタム SSH パラメーターをサポートして異なるリモートサーバー設定に対応
- 04接続中断中もシェルの状態を維持
活用シーン
- 01開発者がモバイルネットワークや不安定なリンク経由でリモートサーバーに接続
- 02システム管理者が VPN ハンドオフまたはネットワーク遷移中にセッションを維持
- 03コーディングエージェントが不安定なネットワーク接続経由でリモートサーバーと相互作用
インストール
OS またはパッケージマネージャーを選び、コマンドをターミナルで実行します。
インストール後にmosh --versionを実行して確認します。
コマンド例
よく使うコマンドを使う順に並べています。
詳細
Mosh:モバイルシェル
Mosh は、接続が断続的になる環境に対応し、ネットワークを切り替えても接続を維持できるリモートターミナルアプリケーションです。また、ユーザーのキー入力をローカルで予測してエコー表示し、行編集を行えます。
SSH の一般的な対話的な用途に加えて、次の機能を提供することを目指しています。
-
クライアントがスリープして後で復帰した場合や、インターネット接続が一時的に失われた場合でも、Mosh はセッションを維持します。
-
接続を維持したまま、クライアントとサーバーの IP アドレスを変更できます。SSH とは異なり、Wi-Fi ネットワーク間の切り替えや、Wi-Fi からモバイルデータ通信、または有線イーサネットへの切り替え中にも Mosh を使用できます。
-
Mosh クライアントはバックグラウンドでサーバーの動作を予測するモデルを実行し、各キー入力が画面の状態にどのような影響を与えるかを賢く推測します。予測に確信が持てる場合は、サーバーからの確認を待つ間、その内容をユーザーに表示します。ほとんどの文字入力と左矢印キー、右矢印キーの使用は、すぐにエコー表示されます。
そのため、モバイルデータ通信や不安定な Wi-Fi など、高遅延のリンクでも Mosh を使用できます。他のプロトコルで試みられてきたローカルエコーモードとは異なり、Mosh は emacs、vi、alpine、irssi などの全画面アプリケーションでも適切に動作し、予測が時折外れた場合も RTT 内に自動で復旧します。高遅延のリンクでは、予測が未確定の間は下線を付けて表示し、サーバーが確認すると下線を外します。
Mosh は、X フォワーディングや、ポートフォワーディングを含む SSH の非対話的な用途には対応していません。
その他の機能
-
低速なリンクでネットワークキューがいっぱいにならないよう、Mosh はフレームレートを調整します。そのため、「Control-C」は暴走したプロセスを停止する際、常に RTT 内に動作します。
-
Mosh は、しばらくサーバーから応答がない場合にユーザーへ警告します。
-
Mosh は、パケットのかなりの割合が失われるリンクにも対応しています。
-
Mosh は SSH や既存のターミナルエミュレーター単体よりも一部の Unicode の特殊なケースを適切に処理しますが、動作には UTF-8 環境が必要です。
-
Mosh は SSH を利用して接続を確立し、ユーザーを認証します。Mosh には特権(root)コードは含まれていません。
Mosh の入手方法
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 のウェブサイトには、その他の使用例とFAQがあります。
仕組み
mosh プログラムは user@host に SSH で接続し、接続を確立します。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 依存関係があります。一部のプラットフォームでは、Perl なしで mosh-server を使用できるように、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 してテストを実行します:
$ ./configure --enable-code-coverage
$ make check-code-coverage
これによりすべてのテストが実行され、お気に入りのブラウザで開ける HTML 形式のカバレッジレポートが生成されます。理想的には、新しく追加されたコードは 90% (以上) のインクリメンタルテストカバレッジを目指すべきです。
詳細情報
-
Mosh Web サイト:
-
[email protected]メーリングリスト: -
[email protected]メーリングリスト: -
Libera Chat の
#moshチャンネル