SSHの代わりになるかもしれない「Mosh」を使ってみました

記事タイトルとURLをコピーする
こんにちは。サービス開発グループの竹永です。 最近カメラを買ったのですが、周りにねこがほとんど居ないのでしょんぼりしています。   さて突然ですが、僕は電車に2時間ほど乗って遠出するのが結構好きです。 しかし、電車に乗っている間は僕のメインの通信手段であるWiMAXで、通信ができない状態になることが稀によくあります。車窓から田んぼが見えたら、かなりの確率で繋がりません。 電車内で「サーバーをいじって遊ぼう」と思ってSSH接続をしても、キー入力が反映されるまでタイムラグが有り、電車がトンネルに入れば接続が切れます。 接続が切れるたびに再接続するのは面倒ですし、なにより作業中に1分ぐらい固まってから「接続切れちゃった」とSSHに言われるのは辛いです。 そんな訳で、先輩に教えていただいたMoshを使ってみました。  

Moshってなに

Mosh(mobile shell)はモバイル回線のような不安定なインターネット環境でも、快適にリモートサーバーのシェルで作業が出来てしまう素敵なアプリケーションです。 公式ページによると、
  • IPアドレスが変動しても繋がりっぱなし
  • サーバー接続中に、PCをスリープモードにしても繋がりっぱなし
  • 遅延が大きいような回線でもサクサク動く
  • 実行時にSuperuser権限が要らない
  • デーモンではなくアプリケーションとして動作する、
  • SSHの設定でログインできる
  • 端末に起因するUnicode関連のバグも気にならない
  • ターミナルに大量の文字が流れ続けてるような状態でも、Control + Cがすぐに効く
などのような特徴があります。  

Amazon Linuxにインストール

さっそくインストールしようと説明を探したのですが、何やら不穏な文が書いてあります。
There are now packages in the EPEL repository for Amazon Linux AMI images. You can install with one command like this:
sudo yum --enablerepo=epel install -y mosh
(although, this is broken as of Amazon Linux version 2013.03)
(意訳: このコマンドでインストール出来ます。が、Amazon Linux version 2013.03からはインストール出来ないです) 試してみましたが、確かにインストール出来ませんでした。残念。   そんな訳で、yumの力を借りつつ自力でインストールします。 下記のコマンドを入力してインストールに必要なソフトウェアを用意します。
$ sudo yum install git autoconf automake gcc gcc-c++ make openssl-devel
$ sudo yum --enablerepo=epel install zlib-devel ncurses-devel protobuf-devel
次にMosh開発者の一人であるKeith WinsteinさんのGitHubリポジトリから、ソースコード一式をダウンロードします。
$ git clone https://github.com/keithw/mosh.git
ダウンロードが終わったら、コンパイルとインストールを行います。
$ cd mosh
$ ./autogen.sh
$ ./configure
$ make
$ sudo make install
  最後に、Security GroupにMosh用のポートを設定します。
デフォルト設定ではUDPの60000-61000番を使用するので、下図のような設定を行うと接続することができます。 しかし、このデフォルト設定ではセキュリティー面と精神衛生面でよろしくないので、必要な数だけポートを開けましょう。 今回は、オプションで使用するポートを指定して接続します。Moshは1セッションで1ポート使用しますので、10セッション同時接続したいのであれば10個のUDPポートを開ければOKです。 これでサーバー側の準備が完了です。  

クライアント側

クライアントに関しては、様々な宗派の方がいらっしゃると思いますので、公式の説明を見ていただくと大体のOSについての説明が載っています。 残念ながらEXE形式での配布は行われていないので、Windows派の方はCygwinを使いましょう。 なお、サーバーもクライアントも使うソフトウェアは同じですので、もし「Amazon Linux → Amazon Linuxに接続したい」という場合は、上記のインストール手順そのままで問題ありません。  

Moshで接続

インストールが完了したら接続してみましょう。Amazon Linux上のMoshに接続したい場合は、下記のようなコマンドで接続出来ます。
$ mosh -p [先ほど開けたポートの番号] --ssh "ssh -i [秘密鍵のパス]" ec2-user@[インスタンスのIPアドレス/Public DNS]
もし、回線が切れるような事態に遭遇した場合には下図のような画面になり、接続が回復するのをMoshは気長に待ってくれます。 これで、電車内でターミナルを開いても回線断にイライラせずにニヤニヤ出来ます。  

そして現在に至る

少し前にインストールしたMoshですが非常に快適で、SSHに戻ると回線切断でしょんぼりする感じが懐かしく思えるレベルです。 しかし、2週間ほど使用して気がついたのですがスクロールバックが不完全なようです。サーバー側にtmuxを導入すれば一応解決できますが、僕の場合はクライアント側で既に使用しているので出来ません。 Mosh 1.3で実装されるそうですが、更新頻度がまったりなので、ソースコードを読みながらまったり待とうと思います。 自分で書くのもアリですね…。  

P.S.

先日開催されたAWS Summit Tokyo 2013の講演で、AmazonさんのAWS以外のサービスを紹介するパネルディスカッションと、FreakOutさんのAWS活用法を聴かせて頂きました。 Amazonさんのパネルディスカッションでは、Kindle / MP3ストア / Amazon Androidアプリストアの魅力を紹介していただきました。
  • Kindleは販売している書籍がユーザーの投票によって決まっており人気の書籍ほど販売が早い
  • MP3ストアはDRMフリーならではのユーザー思いなサービスが充実している
  • アプリストアではアプリ内広告のノイズが少ないため個人に合わせた広告配信ができる
などのお話を聴くことが出来ました。 FreakOutさんのAWS活用法では、広告配信での新しい仕組みであるRTBについての理解を深めることができました。また、「オンプレミス/クラウドにこだわらず必要な技術を精査して選択する」というところになるほどと思いました。 偶然ですが、両方の講演で広告についてお話している点が共通しており、空気を読まない広告を減らしていこうとする努力を見ることが出来ました。今までAdbl○ck Plusで広告をガンガン除去していて大変申し訳ございませんでした。 今後は面白い広告や空気を読んでいる広告を積極的に見ていこうと思います。