WindowsのCygwin環境でmoshを使ってみた

mosh(モッシュ)はローミング(自動再接続)とローカルエコー(キー入力と同期の分割処理)に対応したリモートターミナルソフトです。内部的にSSHを使用しています。

moshを使用することでOS休止状態からの復帰時などもターミナル接続が継続でき、レスポンスの遅い環境では文字入力時の同期待ちが(体感上)改善されます。

moshはサーバとクライアントの両方にインストールして使用します。現在のところWindows用のクライアントは公開されていませんが、Cygwinを使用することで動作させることができます。

サーバ(CentOS 6)側のmoshのセットアップ

CentOS 6ではyumのサードパーティ製リポジトリであるEPELリポジトリからmoshのパッケージをインストールすることができます。先日のtmuxの記事で書いた手順に従いEPELリポジトリを追加しておいて下さい。

$ sudo yum install mosh

iptablesでmoshが使用するポートを開放します。

$ sudo vim /etc/sysconfig/iptables
    -A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 60000:61000 -j ACCEPT
$ sudo service iptables restart

クライアント(Windwos)側のmoshのセットアップ

Compiling Mosh (http://mosh.mit.edu/) under Cygwin - Gist」の手順を参考に進めていきます。

Cygwinのインストール

Cygwinのsetup.exeをダウンロード・実行し、オンラインインストールを行います。インストール時に以下のパッケージを有効化しておきます。

  • wget
  • openssh
  • make
  • boost
  • libncurses-devel
  • pkg-config
  • perl

インストール後、「Cygwin Terminal」を起動します。「Cygwin Terminal」の実態はPuTTYベースのminttyというターミナルです。タイトルバーの右クリックメニューから「Options」を選択し、以下の設定を行います。

Looks
    Colours
        Foreground : 204,204,204
        Background : 51,51,51
        Cursor : 128,255,128
    Cursor
        Block : on
        Blinking : on
Text
    Font : Terminal, 14-point
    Locale : ja_JP
    Character set : UTF-8
Mouse
    Right click action : Paste

minttyの設定は「~/.minttyrc」に保存されます。設定ファイルでは上記設定の他、ANSIカラーとIME有効時のカーソル色などが設定できます。(参考:Manual Reference Pages - mintty)

BoldAsFont=no
ForegroundColour=204,204,204
BackgroundColour=51,51,51
CursorColour=128,255,128
CursorType=block
Font=Terminal
FontHeight=14
Locale=ja_JP
Charset=UTF-8
RightClickAction=paste

Black=0,0,0
Red=255,128,128
Green=128,255,128
Yellow=255,255,128
Blue=70,130,180
Magenta=128,128,192
Cyan=128,255,255
White=255,255,255
BoldBlack=85,85,85
BoldRed=255,128,128
BoldGreen=128,255,128
BoldYellow=255,255,128
BoldBlue=70,130,180
BoldMagenta=128,128,192
BoldCyan=128,255,255
BoldWhite=255,255,255

IMECursorColour=255,128,128

moshのビルド

Cygwin内で以下の手順でビルドを行います。

$ wget http://protobuf.googlecode.com/files/protobuf-2.4.1.tar.gz
$ tar xvvf protobuf-2.4.1.tar.gz
$ cd protobuf-2.4.1
$ ./configure
$ make
$ make install

$ wget https://github.com/downloads/keithw/mosh/mosh-1.2.2.tar.gz
$ tar zxvf mosh-1.2.2.tar.gz
$ cd mosh-1.2.2
$ ./configure CPPFLAGS="-I/usr/include/ncurses" PKG_CONFIG_PATH=/usr/local/lib/pkgconfig/
$ make
$ make install

$ perl -MCPAN -e shell
cpan> install IO::Pty

SSHの接続確認

moshを使用する前に、CygwinからSSH単体で問題なく接続できることを確認しましょう。

Windowsの環境変数で$HOMEを指定している場合、Cygwinの /etc/passwd に記載された自アカウントのホームディレクトリを「/cygdrive/c/path/to/home」に修正しておきます。

以下の内容で「~/.ssh/config」を作成します。なお、秘密鍵はOpen-SSHフォーマットで保存しておく必要があるため注意してください。(PuTTY用のppkファイルのままだと「Permission denied」となり使用できません。puttygen.exeからppkを読み込み、「Conversions」→「Export OpenSSH key」で保存します。)

Host <ホスト名>
HostName <IPアドレス>
User <ユーザ名>
Port <ポート番号>
IdentityFile ~/.ssh/<秘密鍵ファイル名>

下記コマンドでSSH接続を確認します。

$ ssh <ホスト名>

moshの接続確認

さて、いよいよmoshでの接続確認を行います。mosh公式サイトのusageに従い実行してみます。

$ mosh <ユーザ名>@<IPアドレス> --ssh="ssh -p <SSHポート番号> -i ~/.ssh/<秘密鍵ファイル名>"
Hangup

残念ながら「Hangup」となり動作しませんでした。Compiling Mosh (http://mosh.mit.edu/) under Cygwin - Gistのコメントを読むと、サーバ側でmosh-serverを実行後、クライアント側でmosh-cliantを使用すれば接続できるようです。試してみましょう。

サーバ側で以下を実行します。

$ mosh-server

MOSH CONNECT 60001 XXXXXXXXXXXXXXXXXXXXXX

mosh-server (mosh 1.2.2)
Copyright 2012 Keith Winstein <mosh-devel@mit.edu>
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

[mosh-server detached, pid = XXXXX]

クライアント側で以下を実行します。(mosh-server実行後、60秒以内くらいに実行しないとサーバ側のプロセスが消えてしまうようなので注意して下さい。)

$ MOSH_KEY=XXXXXXXXXXXXXXXXXXXXXX mosh-client <IPアドレス> 60001

今度は無事接続できました。適当に素早くキー入力してみると同期待ちの文字にはアンダーラインが表示され、ローカルエコーが効いているのが分かります。

ただ、このままではmosh接続するたびに手動でサーバ側のmosh-serverを起動しなくてはならず不便です。

Cygwin環境用 改造版moshコマンド

Compiling Mosh under Cygwin - Gist」のコメントからリンクされている「Issue #164: Cygwin build works in general, but Perl part does not ・ keithw/mosh ・ GitHub」のコメントを読んでいくと、「http://codepad.org/SnjyALGm」でCygwin環境での問題を修正したmoshコマンドが公開されていました。

ただ、どうやらこの改造版moshコマンドはsshのポート番号と公開鍵認証のオプション指定に対応していないようだったので、とりあえず--sshオプションをハードコーディングして対応させてみました。

下記ファイルの203行目を環境に合わせて修正し、「cygwin\usr\local\bin\mosh」に保存すれば「$ mosh <ユーザ名>@<IPアドレス>」で接続できます。(下記コマンドの使用は自己責任でお願いします。)

203行目の該当箇所は以下のとおり。

open P, '-|', $ssh, '-p', '<SSHポート番号>', '-i', '/cygdrive/c/path/to/home/.ssh/<秘密鍵ファイル名>', '-S', 'none', '-o', "ProxyCommand=$quoted_self --fake-proxy -- %h %p 2>$quoted_tmp", '-t', $userhost, '--', $server, @server

参考ページ

おわりに

なんとかCygwinでもmoshがまともに使えることが確認できました。

ただ、tmuxを使用していれば接続が切れてもあまり問題にならないため、ローカルエコーの為だけにCygwinを持ち出すのも大げさな気がします。結局、私はmoshの採用は見送ることにしました。

VPSセットアップに伴う環境構築の記事はひとまずこれでお終いです。今後はnginx+unicornでのRailsアプリの動作確認などに挑戦してみようかと思っています。進展あり次第また紹介します。

VPSセットアップ関連記事

blog comments powered by Disqus