unisonを使ってプロキシ越えてファイルを同期

この記事をdel.cio.usに登録する この記事をはてなブックマークに登録する この記事をGoogleブックマークに登録する この記事をlivedoor clipに登録する

ファイルを家と仕事場で同期したい。 以下のようにレンタルサーバを中継に使って、日々の記録などのファイルを同期します。

家 ⇔ レンタルサーバ ⇔ 仕事場

なぜレンタルサーバを中継するかというと、わたしの家のPCと仕事場のPCは常時電源ONにはなっていないからです。 レンタルサーバは常時電源ONなので都合がよいので、これを使います。

問題なのは、仕事場⇔レンタルサーバ の経路はプロキシサーバが邪魔していて、普通に接続しようとしてもブロックされることです。 「SSHトンネリング」というのを使うと接続できます。

以前からUnisonを使って同期しています。ですが、Google検索してコピペで何とか動いていたので、 どうすれば今の環境を再現できるか、よくわからないので詳しく調べてみました。

前提条件

レンタルサーバはさくらのレンタルサーバのスタンダード以上(telnetが使えるコース) で実行しています。このレンタルサーバのOSは現在、 FreeBSD 6.1-RELEASE です。

使用バージョン

unisonはファイルの受信側と送信側で同じバージョンを 使わなくてはなりません。

FreeBSDのバイナリパッケージで用意されているバージョンは、2.13.16 なので、 Windowsでも同じバージョンを使います。

Windows版は公式ダウンロードページから取得できます。 textのほうをダウンロードします。

次にレンタルサーバの FreeBSDで動作する unisonを探します。ソースではなくバイナリがほしいので、Packages(バイナリが入っている)を探すのですが、 情報収集のため、まずports(ソースだけ)を調べます。

FreeBSDのportsページで unisonがどのカテゴリなのか確認します。 このページの unison..tgz をクリックしたあとURLを見ると、net カテゴリなことがわかります。

FTPサーバでFreeBSD6対応の packages を取ってきます。

http://ftp.riken.go.jp/pub/FreeBSD/releases/i386/6.2-RELEASE/packages/net/

unison-2.13.16_1.tbz を取得して展開して、実行ファイルを PATHの通ったとこ、たとえば /home/MyUserID/bin/ に置きます。

Putty設定

Proxy越えるために、ここでは Puttyに付属する plink を使います。putty.exe と plink.exe を入手します。

まず Putty でレンタルサーバへの接続設定します。

MyUserName.sakura.ne.jp だと、仕事場の中からは(DNSが引けないようで)接続できないので、nslookupで、そのドメインに対応する IPアドレス (ここでは 202.181.99.70 とする) に変換しておく。

Proxy越える接続設定(人によって異なります)

接続ホスト名: 202.181.99.70
ポート: 22 (SSH)
Proxy: Type=HTTP, ProxyHost=proxy.foo.bar.co.jp, ProxyPort=10080, User=,  Password=
SSH: Version 1, PrivateKeyFile=

これを保存する。Putty設定画面で [カテゴリ-セッション] の画面右真ん中くらいにある「保存されたセッション」に SakuraSession とか名前をつけて、[保存]ボタンをクリック。

次にその名前 SakuraSession をダブルクリックして、ユーザ名とパスワード入力すればFreeBSDにログインできることを確認する。

plink 設定

先ほど Puttyで保存した接続設定は Windowsのレジストリに保存されているので、plink からも呼び出すことができる。

Windowsの[スタート - アクセサリ - コマンドプロンプト] を開き、 plink からレンタルサーバにログインできることを確認する。

C:\home> plink -load SakuraSession -l MyUserID -pw MyPassWd
Welcome to FreeBSD!

C:\home>plink -load SakuraSession -l MyUserID -pw MyPassWd unison -version
unison version 2.13.16

ssh同等のコマンドを作成する

Unisonマニュアル私的日本語訳 - チュートリアル 「リモートシェル越しに使う」 を見ると、

C:\home> unison -testserver c:/home/a.tmp ssh://remotehost/a.tmp

で接続テストして、

C:\home> unison c:/home/a.tmp ssh://remotehost/a.tmp

で実際にファイル送受信できるか確認する、とあります。

しかし今回はProxy越えるために、sshコマンドの代わりに plinkコマンドを使っているので、 plinkを sshコマンドの代替として使えるように設定します。

alt_ssh.bat というファイルを作り、中身を次のようにします。

@plink.exe -load SakuraSession -l MyUserID -pw MyPassWd unison -server

そして、Windowsのコマンドプロンプトを開き、以下を実行します。

C:\home> unison-2.13.16-win-text.exe -testserver -sshcmd C:/home/alt_ssh.bat c:/home/a.tmp ssh://202.181.99.70/a.tmp

Unable to read from standard input
C:\home>

(なんだかよくわからない警告メッセージが出るものの) 一応つながっているようなら、 -testserver オプションを外して、本当にファイルを同期できるか確かめます。

C:\home> unison-2.13.16-win-text.exe -sshcmd C:/home/alt_ssh.bat c:/home/a.tmp ssh://202.181.99.70/a.tmp

最初にファイルをやり取りするときは以下のメッセージが出てきます。 spc と書いてありますが、[Enter] を押すと進みます。

Unison will assume that the 'last synchronized state' of both replicas
was completely empty.  This means that any files that are different
will be reported as conflicts, and any files that exist only on one
replica will be judged as new and propagated to the other replica.
If the two replicas are identical, then no changes will be reported.
Press return to continue.[<spc>]

ファイルやりとり

以下の表示の場合、

    local          sakura.ne.jp
    changed  ---->            emacs/.ntemacs22  [f]

[Enter] キーを押すとそのままコピー(follow)します。
コピーしたくないファイルでは [/][Enter] を押すと、しません。
もしまちがって書き換えたので別マシンにある旧版に戻したい、という場合は 逆の矢印、ここでは [<] [Enter]を押せば元に戻ります。

以下のように表示された場合は、

    local          sakura.ne.jp
    changed  <-?-> changed    emacs/.ntemacs22  []

下記のどれかを入力します。

これをファイルごとに いちいち入力したくない場合は、 alt_ssh.bat の行末に -batchを追加すると自動的に判断してくれます (ただしchanged<-?->changedのファイルはスキップ、つまり同期されないので困るかもしれません)。

注意点


管理

この記事をdel.cio.usに登録する この記事をはてなブックマークに登録する この記事をGoogleブックマークに登録する この記事をlivedoor clipに登録する