mosh

電車の中から SSH でサーバーに繋いで作業するときに、ネット回線が不安定ですぐに作業が中断されてしまうので、mosh をインストールしてみることにしました。
環境は、サーバー側が CentOS で、クライアントが Fedora と Windows 7 です。

まず、ふたつの Linux 環境に、yum コマンドを使って mosh をインストールし、Fedora → CentOS の接続を試みます。

mosh は ssh を経由して接続するらしく、
mosh-client ↔ Internet ↔ mosh-server ↔ ssh(client) ↔ sshd
となるみたいです。

※ 認識が間違っていたようなので下に追記しました。

ここで sshd の待ち受けポートを変えているとちょっと面倒なことになります。
はい。ServersMan@VPS とかですね。

mosh では、ssh(client) に渡すオプションを指定でき、それを使って次のように書きます。

$ mosh --ssh="ssh -p 3843" user@example.net

 
さて、次は Windows です。
Windows 用の mosh クライアントは、Cygwin のものしかないみたいです。

Cygwin の mosh は、apt-cyg などでインストールすることができるのですが、これだと ssh のポート指定ができないみたいです。

上の記事を参考に、apt-cyg などで取得できる mosh.exe の代わりに、こちらにある Perl スクリプトをダウンロードして、それを修正して使います。
まず、ダウンロードしたファイルを /usr/local/bin/mosh という名前で保存して、中身を書き換えます。書き換えるのは 201 行目です。

/usr/local/bin/mosh
# Receive MOSH CONNECT string from mosh-server. Also put IP address
# to $tmp file (thanks to --fake-proxy).
open P, '-|', $ssh, '-p', '3843', '-i', '/home/user/.ssh/id_rsa', '-S', 'none', '-o', "ProxyCommand=$quoted_self --fake-proxy -- %h %p 2>$quoted_tmp", '-t', $userhost, '--', $server, @server

赤字の部分は各自の環境に合わせて書き換えて下さい。
この場合、3843 が ssh で使うポート番号で、/home/user/.ssh/id_rsa が ssh の認証に使う秘密鍵です。

ソースコードの中にポート番号を書くのは気持ち悪いですが、今後スクリプトがアップデートされた場合の手間を考えると、この方がいいのかもしれません。

という感じで、CentOS に Fedora と Windows から mosh で接続する環境が整いました。

しかし Cygwin は遅いですね。デスクトップから使うとそうでもないのですが、Vaio X だときついです。
PuTTY が mosh に対応してくれるといいんだけどなあ。

■ 追記

やり方はあってるんですけど、仕組みの理解が間違っていました。

こちらの記事に詳しい説明が載っています。

Moshはクライアントであるmosh-clientと,サーバーであるmosh-serverで構成されるソフトウェアです。まずmosh-serverですが,これはデーモンとして常時起動しているプログラムではありません。mosh-serverコマンドを実行すると,mosh-serverは今回限りの接続用のキー(※1)と,待ち受けるUDPのポートを標準出力に表示し,それから一定時間(60秒)だけこのポートでクライアントの接続を待ちます。ユーザーはmosh-serverが生成したキーをクライアントの環境変数「MOSH_KEY」に設定した上で,mosh-clientを使用してこのポートに接続を行なう必要があります。なお接続が行なわれなかった場合は,60秒後にmosh-serverは自動的に終了します。

Moshでの接続手順は以下のようになっています。

  1. サーバーにSSHで接続する
  2. mosh-serverを起動する
  3. ポート番号とキーをメモする
  4. クライアントに環境変数MOSH_KEYを設定する
  5. mosh-clientからサーバーに接続する

上記のとおり,Moshでサーバーに接続するためには,まずSSHで接続してサーバーを起動しなければなりません。この非常に面倒な作業を引き受けてくれるのが,moshパッケージに同梱されているmoshコマンドです。moshコマンドはPerlで書かれたフロントエンドで,内部で一旦ssh接続を行ない,mosh-serverを起動して鍵とポート番号を取得し,クライアントにKEYを設定してmosh-clientを起動する,という一連の処理を自動的に行なってくれます。そのためユーザーは,sshコマンドと同じノリでmoshコマンドを叩くだけでmoshを利用することができます。

正しくは、
mosh ↔ ssh(client) ↔ Internet ↔ sshd ↔ mosh-server
これで mosh サーバーの起動と鍵の受け取りなどしたあと、
mosh-client ↔ Internet ↔ mosh-server
となるみたいですね。

コメントを残す