ファイル同期プログラム unison を利用して,二つの環境下の Firefox プロファイルを ssh 経由で同期する。通信に plink+pageant を利用し,パスフレーズの入力を省略する。
ふと自宅とオフィスの Firefox のプロファイルを同期したくなりました。ブックマークだけを同期するのであれば,Bookmarks Synchronizer などの拡張を利用すれば良いのですが,userContent.css をちょっと書き換えただとか,新しい拡張をつっこんだだとか,新しい GreaseMonkey スクリプトをつっこんだだとか,そういうことがちょこちょこあるもので。
いろいろと手段を探しましたがなかなか見つからなかったので,プロファイルディレクトリそのものを同期しにいく戦法をとりました。同期には unison を用い,PuTTY に付属している plink を利用して ssh 経由で行います。
今回の状況設定は以下の通り:
かんたんに図式化するとこんなかんじ:
office || home
┌────┐ ┌────┐ || ┌────┐
│Windows │SMB │FreeBSD │unison via SSH│Windows │
│ (Fx) ---------> ○ <-------------------> ○(Fx)│
└────┘ └────┘ || └────┘
||
まず,プロファイルの設定をいじります。キャッシュを同期するのはあまり嬉しくなさそうなので,キャッシュの保存先をプロファイルディレクトリの外に設定します。これは,browser.cache.disk.parent_directory
に設定されています。
user_pref("browser.cache.disk.parent_directory",
"C:\\Documents and Settings\\user\\Local Settings\\Temp");
# unison 側の設定で同期させないって戦法もあります。
さらに,オフィスは proxy 経由で,自宅は直通で外に出ることになっており,設定が異なるという問題があるのですが,幸いにしてオフィスは wpad(自動設定)が効いているので,自宅/オフィスどちらも「このネットワークのプロキシ設定を自動検出する」にして解決。
続いて unison のバイナリを用意します。注意する点は,インストールする二つの unison のバージョンが一致していなくてはならないことでしょう。
オフィス側ではさっくりと # portinstall net/unison
でインストール。2005/10/15 現在,バージョン 2.13.16 がインストールされます。
次に Windows 側。Cygwin を利用するか否かといった選択肢がありますが,現在のところ Cygwin から利用できる 2.13.16 バイナリは無いようでしたので,素直に Cygwin を利用しない通常の Win32 バイナリを利用します。
unison への引数でごちゃごちゃと指定してもいいですが,長くなりそうなので新しい設定ファイルを書いてしまいましょう。環境変数 HOME を適当に指定し(例えば HOME=d:\home\user
),~/.unison の中に拡張子 prf の適当なファイル(ここでは share.prf)を以下のように作ります。
root = d:\home\user\work\shared
root = ssh://office.example.jp/work/shared
sshcmd = d:\home\user\.unison\plink.bat
fastcheck = true
contactquietly = true
silent = true
auto = true
最初に現れた二つの root
を同期します。fastcheck
は日付の比較によりチェックを簡単化するおまじない,silent
は quiet モードのことで,contactquietly
は「サーバーに接続しています」メッセージの省略,auto
は(非エラー時の)問い合わせの省略。これとは別に,エラー時にも止まらずに終わる batch
というのもありますが,ここでは指定していません。
sshcmd
には ssh 接続に利用するコマンドを記述します。ここでは plink 経由で起動するので,それらの設定を含めたバッチファイルを指定しています。plink.bat の内容は以下:
@d:\path\to\plink.exe user@office.example.jp -i d:\home\user\.ssh\id_dsa.ppk -ssh unison -server
plink に接続先と秘密鍵の位置を指定してリモートで unison -server
を実行します。最初の @
はその行自体のエコーを抑制するもので,外すと unison が怒りますので忘れずに。
実行の前に,pageant を使って該当秘密鍵のパスフレーズを登録しておきます。例えば,スタートアップとかで d:\path\to\paageant.exe d:\home\user\.ssh\id_dsa.ppk
を実行し,登録を済ませておいたりすると幸せになれます。
あとは,% unison.exe share
で同期されます。はいお疲れ様。初回だけはごにょごにょと確認がありますが,まぁ適当にやりましょう。
実際にやってみると,Firefox の実行中はロックファイルみたいなものがあるらしくエラーが起こってしまいます。作業後の同期では,事前に Firefox を落としておく必要がありそうです。
問題は最初の(自宅に帰ってきたときの)同期をいつ行うかですかね。例えばスタートアップで自動化するとなると,前述の pageant の登録後に動いてくれないといけないのであまりうまくいきません。まぁ,ネットワークにつながっていないときもあるし,必ずしも毎回同期して欲しいわけでもないので,手動でいいかなという気もしますが(現在は手動)。
# とまぁ色々書きましたが,実際のところはすでに unison で同期をとってあった shared ディレクトリの中にプロファイルを移しただけだったりします。:p