2013年9月10日火曜日

linuxなdropboxでserverとclientでfilesをeasyにtransferする

始めに断っておく。このエントリはオイラのオリジナルではない。多くのすばらしき先人達が残してくれた資産を参考にしている。個人的に参考にさせていただいたのは下記のサイトだが、実際にインターネットという大海原に旅立てば数多くの知見を得ることができるであろう。


というわけで、何番煎じかしらねぇけど書いとくよ(`・ω・´)b

要はLinuxで使えるクラウドなストレージをクロスプラットフォームなファイルトランスファーソリューションとして活用しようぜ☆……ってこと。別にクライアント to サーバでもいいし、サーバ to クライアントでもいい。クライアント to クライアントでもいいし、サーバ to サーバでもいい。

最初に大事なことをひとつ。Linuxで使えるクラウドなストレージはDropboxしかない。正確に言えば、Wine経由とかで使えるものもあるらしいけど、個人的にはオススメしない。ただ、山があったら登りたくなる人種ってのも一定以上居るのは承知してるので、そういう輩は自分で何とかすること。

そしてもう一つ。これだけ覚えて帰って欲しい。貴方がまだDropboxを使っていなくて、これからDropboxを使おうと思っているなら、このリンクからアカウントを作成するとボーナス容量をゲットすることができる。べっ……別にボーナス容量が欲しいんだからねっ!///

さて、それはさておき……。手持ちのLinux BoxにDropboxをインストールする方法から説明せねばならないだろう。……まあ、前述の記事を読めばすぐに解決するんだけどね_ノ乙(、ン、)_

まずはhttps://www.dropbox.com/install?os=lnxにアクセスする。「Dropbox をダウンロード」の枠の中をクリックしそうになるけど、違うそうじゃない。その下の「コマンドラインで Dropbox をインストールする」の項目を見るんだ。前者はGUIなLinux Box向け(Nautilusがインストールされてること前提)なパッケージだ。今回インストールしたいのはサーバ機などのCLI(CUI) Onlyな環境だ。……まあ、インストールする是非は自分で考えろ。


さて、そこに書いてある方法をそのままコマンドで叩く。やってることはLinux向けのTarballをダウンロードして展開するというだけなので、コマンドを実行するディレクトリにさえ気を付けていれば、さほどひどい目には遭わないであろう

$ cd ~ && wget -O - "https://www.dropbox.com/download?plat=lnx.x86_64" | tar xzf -
--YYYY-MM-DD HH:mm:dd--  https://www.dropbox.com/download?plat=lnx.x86_64
www.dropbox.com をDNSに問いあわせています... 199.47.217.170
www.dropbox.com|199.47.217.170|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 302 FOUND
場所: https://dl-web.dropbox.com/u/17/dropbox-lnx.x86_64-2.0.26.tar.gz [続く]
--YYYY-MM-DD HH:mm:dd--  https://dl-web.dropbox.com/u/17/dropbox-lnx.x86_64-2.0.26.tar.gz
dl-web.dropbox.com をDNSに問いあわせています... 50.17.237.92
dl-web.dropbox.com|50.17.237.92|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 302 FOUND
場所: https://dl.dropboxusercontent.com/u/17/dropbox-lnx.x86_64-2.0.26.tar.gz [続く]
--YYYY-MM-DD HH:mm:dd--  https://dl.dropboxusercontent.com/u/17/dropbox-lnx.x86_64-2.0.26.tar.gz
dl.dropboxusercontent.com をDNSに問いあわせています... 54.243.72.116
dl.dropboxusercontent.com|54.243.72.116|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 20964351 (20M) [application/x-tar]
`STDOUT' に保存中

100%[==============================================================================================================================>] 20,964,351  3.69M/s 時間 18s

YYYY-MM-DD HH:mm:dd (1.08 MB/s) - stdout へ出力完了 [20964351/20964351]


今回は自分のホームディレクトリ(~/)で実行したので、下記のようなディレクトリが出来る。

$ ls -la
合計 92
drwx------. 10 haya admin  4096  9月  9 16:31 2013 .
drwxr-xr-x. 20 root root   4096  9月  8 20:55 2013 ..
-rw-------   1 haya admin  8318  9月  9 23:54 2013 .bash_history
-rw-r--r--.  1 haya admin    18  2月 22 06:09 2013 .bash_logout
-rw-r--r--   1 haya admin   210  6月 28 15:30 2013 .bash_profile
-rw-r--r--.  1 haya admin   124  2月 22 06:09 2013 .bashrc
drwxr-xr-x   4 haya admin  4096  6月  6 04:03 2013 .dropbox-dist

で、その中身を見てみると、必要そうなものが一杯含まれているのが分かる。

$ cd .dropbox-dist/
$ ls -la
合計 49568
drwxr-xr-x   4 haya admin     4096  6月  6 04:03 2013 .
(中略)
-rwxr-xr-x   1 haya admin    89808  6月  6 04:03 2013 datetime.so
drwxr-xr-x   4 haya admin     4096  6月  6 04:03 2013 distribute-0.6.26-py2.7.egg
-rwxr-xr-x   2 haya admin 17506804  6月  6 04:03 2013 dropbox
-rwxr-xr-x   1 haya admin      258  6月  6 04:03 2013 dropboxd
-rwxr-xr-x   1 haya admin    22344  6月  6 04:03 2013 fastpath.so
-rwxr-xr-x   1 haya admin    21736  6月  6 04:03 2013 faulthandler.so
(中略)

やらなきゃ行けないのはデーモン(daemon)の起動。この中の「dropboxd」って奴を起動すること。あからさまにハイライトしておいたから、いちいち言及しなくてもいいだろうけど(*゜∀゜*)

で、そうすると下記のような感じになる。要は「てめぇのアカウントと紐付けやがれ!」ってことなので、Webブラウザから表示されたURL、すなわち「https://www.dropbox.com/cli_link?host_id={HOSTID}」のところに書かれているURLにアクセスする。このとき、ログインしてなければログインしろって言われるし、まあ、とにかく、画面の指示に従えばいい。上手いこと紐付けができると、下記のハイライトした行のようなメッセージが表示される。

$ ./dropboxd
このクライアントはどのアカウントにもリンクされていません...
このコンピュータをリンクするには、https://www.dropbox.com/cli_link?host_id={HOSTID} にアクセスしてください。
クライアントをリンクしました。{YOURNAME} へようこそ!

で、ディレクトリを見てみると見慣れぬ「Dropbox」なるディレクトリが出来ている。何を隠そう、コイツがSyncしたDropboxデータが格納されているディレクトリだ。別なコンピュータでファイルを追加すればコイツの中に現れるし、このディレクトリの中にファイルを作れば別なコンピュータからそのファイルを参照できる。気が済んだら「Ctrl+C」で終了することができるので、止めておくのが吉。

$ ls ~/
Dropbox

そう、これで終わり。基本的には。ただ、これだとちょっと使いにくい。もうちょっと細かい制御がしたい。そう思うはずだ。そんなときは、前述の「Dropbox をダウンロード」の枠の中にある「CLI スクリプト」ってテキストリンクのURLからファイルをダウンロードすると管理コマンドをゲットできる。

$ cd /path/to/dropbox-bin
$ wget 'https://www.dropbox.com/download?dl=packages/dropbox.py'
--YYYY-MM-DD HH:mm:dd--  https://www.dropbox.com/download?dl=packages/dropbox.py
www.dropbox.com をDNSに問いあわせています... 199.47.217.171
www.dropbox.com|199.47.217.171|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 302 FOUND
場所: https://linux.dropbox.com/packages/dropbox.py [続く]
--YYYY-MM-DD HH:mm:dd--  https://linux.dropbox.com/packages/dropbox.py
linux.dropbox.com をDNSに問いあわせています... 199.47.217.170
linux.dropbox.com|199.47.217.170|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 111373 (109K) [application/octet-stream]
`dropbox.py' に保存中

100%[==============================================================================================================================>] 111,373      258K/s 時間 0.4s

YYYY-MM-DD HH:mm:dd (258 KB/s) - `dropbox.py' へ保存完了 [111373/111373]

わざわざ「/path/to/dropbox-bin」ってしてるのは理由がある。横着主義な人は「別にさっき出来た.dropbox-distの中に一緒においておけばいいじゃん!」って思うことだろう。そう思っていた時期が私にもありました……(;´Д`)。そうするとどうなるか。手元の環境では……

$ chmod 755 ./dropbox.py
$ ./dropbox.py
Traceback (most recent call last):
File "./dropbox.py", line 24, in 
import locale
File "/usr/lib64/python2.6/locale.py", line 202, in 
import re, operator
ImportError: /path/to/.dropbox-dist/operator.so: undefined symbol: _PyUnicodeUCS2_AsDefaultEncodedString

みたいなエラーが出るんだ。そう、動かないんだ。だからこそ「/path/to/dropbox-bin」と明示してるんだ。

ちなみにちゃんと別ディレクトリに配置してやると……

$ ./dropbox.py
Dropbox command-line interface

commands:

Note: use dropbox help  to view usage for a specific command.

status       get current status of the dropboxd
help         provide help
puburl       get public url of a file in your dropbox
stop         stop dropboxd
running      return whether dropbox is running
start        start dropboxd
filestatus   get current sync status of one or more files
ls           list directory contents with current sync status
autostart    automatically start dropbox at login
exclude      ignores/excludes a directory from syncing
lansync      enables or disables LAN sync

といった感じでゴキゲンに動作する。

で、先のようにコマンドの簡単な解説が出てくれば準備OK。デーモンを実行するためには下記のようにすればいい。ちなみに「-i」オプションを付けると、アカウントにリンクするために必要なURL(先ほど紹介したよね?)を確認することが出来るらしい。

$ ./dropbox.py start
Starting Dropbox...Dropbox isn't running!
Done!
$ ./dropbox.py start -i
To link this computer to a dropbox account, visit the following url:
https://www.dropbox.com/cli_link?host_id={HOSTID}

これで起動は完了。

ちなみに停止したかったり、現在の起動状況を確認するためには

$ ./dropbox.py stop
Dropbox daemon stopped.
$ ./dropbox.py status
Dropbox isn't running!

のようにすればいい。

起動したところで、いろいろオプションを設定してみようと思う。まずは「Lan Sync」なる機能。何者かというと、ファイルの更新をまずLan内にお伺いを立てることによってDropboxサーバへのアクセスを減らし高速にSyncする……といったものらしい。https://www.dropbox.com/help/137/jaに詳細が書いてあるので読んでおくといい。

で、コイツはLAN内にサーバがあればまあ役に立ちそうな気もするのだけど、ポート空けるのメンドイしそんなに恩恵を受けられるかというと微妙そうなので無効化したいと思うのは自然なこと。無効化するには下記のようにすればいいらしい。

$ ./dropbox.py lansync
enables or disables LAN sync
dropbox lansync [y/n]

options:
y  dropbox will use LAN sync (default)
n  dropbox will not use LAN sync
$ ./dropbox.py lansync n

デフォルトではLAN Syncは有効化されているから、忘れずにやっておいた方がいいかもしれないね。

続いてSync対象外ディレクトリの設定。Dropboxに格納しているファイル全部をSyncしたいケースってまずないよね……ってことでこれは重要。で、下記のようにやってみたんだけど……

$ ./dropbox.py exclude /Photos
ignores/excludes a directory from syncing
dropbox exclude [list]
dropbox exclude add [DIRECTORY] [DIRECTORY] ...
dropbox exclude remove [DIRECTORY] [DIRECTORY] ...

"list" prints a list of directories currently excluded from syncing.
"add" adds one or more directories to the exclusion list, then resynchronizes Dropbox.
"remove" removes one or more directories from the exclusion list, then resynchronizes Dropbox.
With no arguments, executes "list".
Any specified path must be within Dropbox.

コマンドの指定の仕方が違うって言われたorz で、改めて「exclude add {ディレクトリ名}」でやるんだけど、ふと思う。「アレ?このディレクトリ指定ってDropbox上のパスなんだろうか?」と。で、そのつもりで試してみると……

$ ./dropbox.py exclude add /Photos
$ ./dropbox.py exclude add /Private
$ ./dropbox.py exclude add /Public

のようにエラーも表示されないし、成功したように見える。

だがまて、成功したことを確認するまでは成功したとは言えないんだ。

$ ./dropbox.py exclude
No directories are being ignored.

……な?失敗してるだろ?

ってことで、このパス指定はそのLinux Boxのディレクトリを指定しなきゃ行けないんだなってのがよく分かる。ってことで、気を取り直して設定してみる。

$ ./dropbox.py exclude add ./Dropbox/Photos/
Excluded:
Dropbox/photos
$ ./dropbox.py exclude add ./Dropbox/Private/
Excluded:
Dropbox/private
$ ./dropbox.py exclude add ./Dropbox/Public/
Excluded:
Dropbox/public

なんかメッセージが表示されてる!ちょっと時間かかったりもしてる!……これは上手く言ってるだろうという期待を胸に確認してみる。

$ ./dropbox.py exclude
Excluded:
Dropbox/photos
Dropbox/private
Dropbox/public

指定したディレクトリがちゃんと除外設定されているようだ。ちなみに実ディレクトリ上はどうなっているかというと、これも併せて消えているのが確認できる。今回は、元々あったディレクトリを全て除外設定したので、空っぽなディレクトリになっている。

$ ls ./Dropbox/
$

で、例えばDropboxのWebインタフェースとかWin/Macのクライアントとかで、新しく専用のディレクトリを追加したらどうなるか……ってのを試してみる。今回は「public_html」なるディレクトリをDropbox上に追加してみた。すると……

$ ls ./Dropbox/
public_html

と、即座にSyncしてくれるようだ。

これを応用すれば、FTPとかSFTP/SCPを使わなくてもサーバにファイルをリリースすることができる(当然サーバからクライアント側にファイルを持ってくることもできる)ようになる。前述のように「public_html」なるディレクトリを作って、そいつをApacheかなにかでドキュメントルートに指定する……なんて使い方をしたくなるかもしれないし、サーバ上のログをこのDropboxなディレクトリに吐くようにして、クライアント側でゴニョゴニョしやすくしたくなるかもしれない。

あるいは複数サーバにこの手の手法でSyncするようにしておけば、Dropbox上のファイルを書き換えれば複数サーバに一括リリースが可能!夢がひろがりんぐ(*゜∀゜*)……と思うかもしれないけど、正直なところ、個人的にはどうかと思う。

私の知る限りログとか記録されないっぽいから誰が何をやったかってのも追跡しづらいし、ログイン自体メールアドレス&パスワードで出来ちゃうから狙われやすいんじゃないだろうかと思うのだ。ただでさえ「サイトが改ざんされた!」とかで大騒ぎになる今日この頃、そんなに狙い所を増やすのもいかがなものかと思ったりするしね(´・ω・`)

まあ、Dropboxのログインに2段階認証を使ったり、あくまで個人的にしっかり管理してやる……といったようなシチュエーションでかつ自己責任でやる分にはメリットもあるのかもしれないけど、別にFTPやSFTP/SCPを使ってやるのより楽か……といわれると微妙じゃない?……というのが私のスタンス。だから、「これは便利だよ!」と強く推奨する気も無いし、「これは便利そうに見えるけど絶対止めとけ!」と強く否定する気も無い。個々人が自分のケースと照らし合わせて考えればいい。おいらは責任とれないし。

まあ、私の認識が間違っていたり「このパターンなら大丈夫!」ってのがあるかもしれないので、覚えておいて損は無いと思う。たとえば、VMやら安全なLAN内に構築した開発サーバとファイルをやりとりする場合なんてのはそういうケースかもしれないね。

0 件のコメント:

コメントを投稿