読者です 読者をやめる 読者になる 読者になる

Moshの導入

f:id:moguriso:20130111004036p:plain:left
各所で流行りの様なので入れてみました。そもそも、ココしばらく週末は家に居なくて、もっぱらsshで自宅とやり取りをしていたので、これは試してみたい所です。特に電車内ではトンネルに入ったりするとブツブツ切れるので、local echoの恩恵には期待したい所ですが・・・。

サーバ側へインストール

こちらを参考にすすめます。自宅のサーバは、更新がメンドイのでFedora16で動き続けています。*1ともあれ、通常のリポジトリ以外にも

adobe-linux-x86_64 google-chrome rpmfusion-free-updates

と、これだけ追加してあるので多分yumで入るでしょう。

[moguriso@mogris ~]$ sudo yum install mosh
====================================================================================================================================================
 Package                              アーキテクチャ                  バージョン                              リポジトリー                      容量
=====================================================================================================================================================
インストール中:
 mosh                                 x86_64                          1.2.3-1.fc16                            updates                          214 k
依存性関連でのインストールをします:
 perl-IO-Tty                          x86_64                          1.10-8.fc16                             updates                           40 k

トランザクションの要約
=====================================================================================================================================================
インストール  1 パッケージ (+1 依存するパッケージ)

総ダウンロード容量: 253 k
インストール済み容量: 870 k

ちゃんとありました。mosh-serverは、どうやら単なるプログラムのようです。(daemonとかserviceと言われるものではなく、常時起動しているものでもないらしい)server側でmosh-serverを起動し、生成されたキーとポート番号をクライアント側で指定して接続する、と。。。ほほう。メンドイ、、、

クライアントのインストール

クライアントは手元のXubuntu(12.04)です。何も考えず

moguris@crowne:~$ sudo apt-get install mosh

します。あっさり入りました。

接続

事前にサーバ側でファイアーウォールに穴を開けておく必要があります。Fedoraだとsetupコマンドが使えるので、とても簡単です。

[moguriso@mogris ~]$ sudo setup

すると
f:id:moguriso:20130111001057p:plain
こんな感じでインタラクティブウィンドウが開きます。「ファイアーウォールの設定」を選択してEnter。
f:id:moguriso:20130111001158p:plain
「カスタマイズ」を選択してEnter。
f:id:moguriso:20130111001224p:plain
「転送」を選択してEnter。
f:id:moguriso:20130111001411p:plain
「追加」を選択してEnter。
f:id:moguriso:20130111001434p:plain
ポートに60000、プロトコルにudpを入れてEnter。同じ要領でポート60001、プロトコルudpも追加します。終わったら、間違えて閉じるや取り消しを押さないように気をつけてOKを選択してEnter。
f:id:moguriso:20130111001516p:plain
iptablesの再起動を促すこのメッセージが出れば成功です。

サーバ側でmosh-serverを起動します。

[moguriso@mogris ~]$ mosh-server                                                                                                                        

MOSH CONNECT 60001 Sb4Lamc77YvSivMZWmMt1A

mosh-server (mosh 1.2.3)
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 = 29889]

このサーバは60secアクセスしないと自動的に終了するそうです。次にクライアントからmosh-clientでアクセスします。

moguris@crowne:~$ MOSH_KEY=Sb4Lamc77YvSivMZWmMt1A mosh-client xxx.xxx.xxx.xxx 60001

割とあっさりつながりました。

moshコマンドで上記手順を自動化

参考にしたページにもあるとおり、

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

と、これは冗長で面倒です。これまた参考ページに簡単な解決法としてmoshコマンドの利用法が記載されています。

ここで1つ問題があり、ver 1.1.3のmoshコマンドではsshのポート番号変更に対応していない様です。そもそもmoshコマンドはperlスクリプトなので /usr/bin/mosh を開けば該当部分は

203   my $quoted_self = shell_quote( $0 );
204   exec 'ssh', '-S', 'none', '-o', "ProxyCommand=$quoted_self --fake-proxy -- %h %p", '-t', $userhost, '--', "$server " . shell_quote( @server );
205   die "Cannot exec ssh: $!\n";

という感じになっており、port番号を指定させる程度ならココにpatchを当てれば簡単に出来そうです。

が、もっと簡単な方法として ver 1.2.3に更新してしまう方が楽です。(default: Xubuntu 12.04->1.1.3, Fedora16->1.2.3)ver 1.2.3のmoshコマンドであれば、下記のようなオプションでsshコマンドに好きなオプションを付与できます。

 71         --ssh=COMMAND        ssh command to run when setting up session
 72                                 (example: "ssh -p 2222")
 73                                 (default: "ssh")

mosh公式のページには、mosh用のppaリポジトリの追加方法がトップページにあります。。。

$ sudo add-apt-repository ppa:keithw/mosh
You are about to add the following PPA to your system:
 Mosh is a remote terminal application that supports intermittent connectivity, allows roaming, and provides speculative local echo and line editing of user keystrokes.
 More info: https://launchpad.net/~keithw/+archive/mosh
Press [ENTER] to continue or ctrl-c to cancel adding it

gpg: 鍵輪「/tmp/secring.gpg」ができました
gpg: 鍵輪「/tmp/pubring.gpg」ができました
gpg: 鍵7BF6DFCDをhkpからサーバーkeyserver.ubuntu.comに要求
gpg: /tmp/tmp9eiyhR/trustdb.gpg: 信用データベースができました
gpg: 鍵7BF6DFCD: 公開鍵“Launchpad PPA for Keith Winstein”を読み込みました
gpg: 処理数の合計: 1
gpg:               読込み: 1  (RSA: 1)
OK
$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get upgrade
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
以下のパッケージはアップグレードされます:
  mosh
アップグレード: 1 個、新規インストール: 0 個、削除: 0 個、保留: 0 個。
334 kB のアーカイブを取得する必要があります。
この操作後に追加で 156 kB のディスク容量が消費されます。
続行しますか [Y/n]?y
mosh (1.2.3-0~855~precise1) を設定しています ..

公式ではupdate後にinstall moshさせていますが既にinstall済みなのでupgradeすれば自動的に更新してくれるみたいです。無事1.2.3になりました。

$ mosh --ssh="ssh -X -p xxx" tachyon

余計な手間無くアクセス可能になりました。が、-Xしているにも関わらず、Xの画面転送が出来ていません。という訳でマニュアルを読むと

mosh does not support X forwarding or the non-interactive uses of SSH, including port forwarding or sshfs.

( ゚д゚)!

まあ、電車やら基本的に通信状況の悪い場面では無くても困らないんですが。。。これは対応してもらいたいなぁ。。。

*1:OpenSUSEにしてOBSを立ててみたいとは思いつつ出来てません。今月末にある展示会を乗り切ったら...やるかなぁ...?