mosh + tmuxはいいぞ

![🏩 💕tmux mosh💕三💨](https://qiita-image-store.s3.amazonaws.com/0/38578/1d666590-922c-8d0a-0351-6e0e39e81135.png)

**mosh**と**tmux**を組み合わせると**幸せが訪れる**というお話です。

この記事を見て下さっている皆様の大半はsshについてはご存知かと思います。sshは*nix系のサーバー管理を行う為には不可欠なものですが、複数のPCから作業したり、モバイル環境で使用する場合、単体では不便な点が多く存在します。

- モバイルデータ通信/Wi-Fiの切り替えや、異なるネットワークへの移動、電波状況等の影響により、モバイル環境では頻繁に接続が切れます。sshでは接続が切れるとセッションが破棄されるので、接続が切れる度に再接続して、切断される前のカレントディレクトリ・環境変数の状態に戻す必要があり、大変不便です。
- 複数PC間でセッションを引き継ぐことができません。例えば自宅のPCで作業を途中まで進めた後、外出中に作業の続きをしたい場合、自宅の作業状況をそのまま持ってくることができません。
- モバイル環境や、サーバーが遠隔地にある場合はネットワーク遅延が大きくなるため、サーバーから応答が帰ってくるまでの時間が長くなります。シェル等でキーボードを文字を入力すると、入力した文字が画面に表示されると思いますが、この文字表示(*エコー*)は一度サーバーからの応答を待ってから行われます。この為、遅延が大きいネットワーク環境では入力がぎこちなくなり、作業の支障となります。

moshとtmuxを組み合わせることにより、これらの課題点をほとんど解決するこることができます。

- クライアント側のPCが再起動したり、クラッシュしたり、回線が切れたり、異なるネットワークに移動したり(ローミング)、あるいはネットワーク環境が変化しても、接続が可能な状態になれば**自動的に再接続**され、**セッションも保持**される。
- 外出先で行っていた作業のセッションをそのまま自宅のPCで**引き継ぐことが出来る** (逆も同様)。
- 遠隔地のサーバやモバイル回線でも**入力が少し快適**になる。

さらに、moshとtmuxはそれぞれ単体では不便な点がありますが、組み合わせて使うことにより、互いの短所を補うことができます。

mosh: セッション保持・自動再接続 +α
-------------

![](https://upload.wikimedia.org/wikipedia/commons/2/21/Mosh_demo_screenshot.png)
([Majumda氏の投稿画像](https://en.wikipedia.org/wiki/File:Mosh_demo_screenshot.png)。サーバから一時的に切断され、再接続を待っている状態。下線はローカルエコーで描画されていることを示している)

- [公式サイト](https://mosh.mit.edu/#getting)
- [Qiitaタグ検索: mosh](http://qiita.com/tags/mosh)
- [MobaXterm を ssh/mosh/X11 クライアントとして使う（Windows）](http://qiita.com/mkasahara/items/c029154b5436913b20e0) by @mkasahara

mosh (もっしゅ) はSSHと類似した、リモート端末ソフトウェアです。mosh (mobile shell) という名前が表すようにモバイル環境に最適化されており、次の点がSSHと比べて強化されています。

- クライアントが異なるネットワークに移動したり (ローミング)、一時的にネットワークから切断されたり、一時的にスリープ状態に入っても、**接続を自動的に復旧**し、セッションも復旧することができます。(**セッション保持**)
- ネットワーク遅延が大きい場合、可能であればローカルエコーに自動的に切り替わります。詳しい説明は省きますが、簡単に言うとpingが悪くても入力がもたつきにくくなります。(**ローカルエコー**)

ところが、moshは不便な点があります、一般的な仮想端末は画面をスクロールして過去の出力を遡る機能 (スクロールバック) があり、sshを使用している時にはこの機能が使えるのですが、moshでは使用できなくなってしまうのです。また、クライアント側で `mosh` を一度終了してしまうと、[元のセッションに復帰できなくなってしまいます](http://qiita.com/mapyo/items/6f6b99d04a3c7c4216b4)。

tmuxを組み合わせることにより、この欠点を打ち消すことできます。

tmux: 多重化・セッションの引き継ぎ・保持・スクロールバック
-------------------------

![](https://qiita-image-store.s3.amazonaws.com/0/38578/cf382e9d-bf72-79c7-0c61-b3ddafac0739.png)
(一番下の行にtmuxのタブが表示されている。[tmux-powerline](https://github.com/erikw/tmux-powerline)を併用している)

- [Qiitaタグ検索: tmux](http://qiita.com/tags/tmux)
- [tmuxを使い始めたので基本的な機能の使い方とかを整理してみた - 完熟トマト](http://kanjuku-tomato.blogspot.jp/2014/02/tmux.html)

tmux (てぃーまっくす) は端末多重化ソフトウェアです。

- tmuxのメインとなる機能は、一つの端末内から複数の仮想端末を操作できるようにする、**端末多重化**です。tmux内で複数のウィンドウを立ち上げ、キー操作によりウィンドウを切り替えることができます。さらに、ウィンドウ内の領域をペインに分割することで、それぞれが独立した仮想端末となります。
- 使用中の仮想端末のデタッチ/アタッチ (切り離し/再接続) が行えます。SSH/mosh接続してtmuxを起動している状態で接続が切れても自動的にデタッチされるだけで、中のセッションが終了してしまうことはありません。(**セッション保持**)
- 一旦tmuxからデタッチ (`Ctrl-b d`) し、別の場所からアタッチ (`$ tmux a`) することで、**セッションの引き継ぎ**が行えます。
  - ちなみに複数の場所から同時にアタッチすることもできますが、ウィンドウサイズが一致しないと余白が出るので、同時に使いたいことは通常は無いと思います。他の接続を強制的にデタッチしたい時は `Ctrl-b D` コマンドを使います。
- tmuxでは `Ctrl-b [` コマンドで仮想端末の出力を**スクロールバック**できます。

どっちが先?
----------

以上でmoshとtmuxの機能を挙げましたが、これらを組み合わせることで幸せになれることが分かって頂けたと思いますが、実際に使用する時には起動順序も重要です。逆にしてしまうと利点を活かすことができません。では、先に起動すべきなのはmoshとtmuxのどちらでしょうか?

正解はmoshです。まずmoshを使用してサーバーに接続し、サーバー側でtmuxを起動 (起動済みの場合は `tmux a` でアタッチ) するのが正しい順序です。

まずセッションの引き継ぎを行う為にはtmuxを用いる訳ですが、クライアント側でtmuxを起動してもセッションは引き継げません。

また、tmuxにはスクロールバック機能がありますが、tmuxがmoshの内部で機能していなければ、スクロールバックは行えません。これについて図を用いてもう少し分かりやすく説明してみましょう。

![scrollback-01.png](https://qiita-image-store.s3.amazonaws.com/0/38578/c4fcb7f1-1c7e-a6c9-21e7-672ccc815bd7.png)

- SSHの場合、サーバから受け取ったものをそのまま端末に流すので、仮想端末ソフトにスクロール機能があれば、普通にスクロールを行うことができます (図左側)。
- ところが、moshはそれ自体が仮想端末ソフトとして動作し、しかもスクロール機能が無いため、その中で動作するアプリケーションの出力はスクロールバックできなくなってしまいます (図中央)。
- そこで、moshの内部でtmuxを起動すると、tmux自体にスクロール機能があるため、外側のmoshでスクロールを無効化されてしまっていても、tmux側でスクロールを実現することができます (図右側)。

もしmoshとtmuxが逆だった場合、スクロールバックが行えないことがお分かりになると思います。

欠点
----

- **ポートフォワーディングができない**: moshはリモート端末ソフトウェアとしては優れていますが、sshにあるようなポートフォワーディング機能が欠けています。これについてはsshを併用することで対応できますが、残念ながらsshに自動再接続機能はありません。
- **ファイアーウォール設定の手間が増える**: sshは単一のTCPポートのみを使用しますが、moshはこれに加えてUDPポートの範囲 (デフォルトでは 60000-61000) を開放する必要があり、ファイアーウォールの設定を行う手間が増えます。
- **遅い…?**: 仮想端末を3重にネストすることになるので、サーバ・クライアントのスペックが低い場合、ひょっとすると重いと感じるかもしれません。
- **スクロールバックは確かにできるけど不便かも**: 慣れの問題もありますが、確かに少し使い辛いですね。。。

おわりに
-------

以上で説明したように、moshとtmuxを適切に組み合わせることにより、モバイル環境からリモート端末に接続する際の不満を解決することができます。最初の設定が手間だったり、tmuxの操作に最初は慣れないかもしれませんが、一度慣れればかなり作業が効率的になると思います。